前言
今天我們將學(xué)習(xí)如何通過一種“修復(fù)”的方法消除舊照片中的小噪音,筆畫等。當(dāng)然,經(jīng)過我的測試你也可以將其用于削弱混雜了其他的顏色的圖像。
實驗背景
大多數(shù)人家都會有一些舊的的舊化照片,上面有黑點,一些筆觸等。你是否曾經(jīng)想過將其還原?我們不能簡單地在繪畫工具中擦除它們,因為它將簡單地用白色結(jié)構(gòu)代替黑色結(jié)構(gòu),這是沒有用的。在這些情況下,將使用一種稱為圖像修復(fù)的技術(shù)?;舅枷牒芎唵危河酶浇南袼靥鎿Q那些不良區(qū)域,使其看起來和鄰近的協(xié)調(diào)??紤]下面顯示的圖像(摘自Wikipedia)。
同樣的,今天我在這里也要進行一些拓展,采用我的方法也可以用于削弱混入了圖像中的其他顏色。
獲取圖像的掩膜圖
下面的圖片是經(jīng)過人臉檢測后的圖片,現(xiàn)在我并不想要它這個框。
運行下面的腳本進行顏色提取
import cv2
import numpy as np
import pyps.pyzjr.utility as zjr
def empty(a):
pass
path = 'AI.png'
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,250)
cv2.createTrackbar("Hue Min","TrackBars",58,179,empty)
cv2.createTrackbar("Hue Max","TrackBars",60,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",73,255,empty)
cv2.createTrackbar("Sat Max","TrackBars",255,255,empty)
cv2.createTrackbar("Val Min","TrackBars",36,255,empty)
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)
#經(jīng)過測試得到的掩碼58 60 73 255 36 255
while True:
img = cv2.imread(path)
#圖像轉(zhuǎn)化為HSV格式,H:色調(diào)S:飽和度V:明度
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h_min = cv2.getTrackbarPos("Hue Min","TrackBars")
h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
print(h_min,h_max,s_min,s_max,v_min,v_max)
#創(chuàng)建一個蒙版,提取需要的顏色為白色,不需要的顏色為白色
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
mask = cv2.inRange(imgHSV,lower,upper)
imgResult = cv2.bitwise_and(img,img,mask=mask)
imgStack = zjr.stackImages(0.7,([img,imgHSV],[mask,imgResult]))
cv2.imshow("Stacked Images", imgStack)
cv2.waitKey(1)
注:import pyps.pyzjr.utility as zjr,此為我的私庫函數(shù),大家可以使用matplotlib.pyplot as plt代替此功能。
這里有關(guān)于HSV的一些介紹,下面是一些常見顏色的HSV值,大家可以參考著在軌跡欄中進行調(diào)整,順序都是從上到下,具體還是要根據(jù)實際情況進行調(diào)整。
詳解cv2.inpaint()
cv2.inpaint是用于圖像修復(fù)的函數(shù)。它可以自動根據(jù)給定的掩膜(mask)來修復(fù)圖像,即用圖像中的其他部分來填充掩膜部分的像素。函數(shù)的語法如下:
dst = cv2.inpaint(src, inpaintMask, inpaintRadius, flags)
其中的參數(shù)的含義如下:?
-
src
: 要修復(fù)的原始圖像 -
inpaintMask
: 修復(fù)圖像的掩膜,即需要被修復(fù)的像素區(qū)域 -
inpaintRadius
: 修復(fù)半徑,即掩膜的像素周圍需要參考的區(qū)域半徑 -
flags
: 修復(fù)算法的標(biāo)志。有兩個可選值:cv2.INPAINT_TELEA和cv2.INPAINT_NS。默認(rèn)為cv2.INPAINT_TELEA。
其中,cv2.INPAINT_TELEA和cv2.INPAINT_NS分別代表基于快速行進算法(Fast Marching Method)和基于Navier-Stokes方程(Navier-Stokes equation)的修復(fù)算法,前者更快、后者更準(zhǔn)確。
修補圖像
接著,我們需要將上面腳本的這幾行放進下面的測試代碼中。
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
mask = cv2.inRange(imgHSV,lower,upper)
imgResult = cv2.bitwise_and(img,img,mask=mask)
將調(diào)整好的值,從控制臺中copy給h_min, h_max, s_min, s_max, v_min, v_max
import cv2
import numpy as np
import pyps.pyzjr.utility as zjr
path = 'AI.png'
img = cv2.imread(path)
Grayimg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
h_min, h_max, s_min, s_max, v_min, v_max = 58, 60, 73, 255, 36, 255
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask_black = cv2.inRange(imgHSV, lower, upper)
imgResult = cv2.bitwise_and(img,img,mask=mask_black)
dst = cv2.inpaint(img, mask_black, 10, cv2.INPAINT_TELEA)
mask_white = cv2.bitwise_not(mask_black)
stackimg=zjr.stackImages(0.7,([img,imgResult],[mask_white,dst]))
cv2.imshow("repair_img",stackimg)
cv2.imwrite("AI2.png",dst)
cv2.waitKey(0)
運行結(jié)果如下所示, 效果比較不錯,整體看來只有頭發(fā)那里有些許模糊。
改進建議
如果你有現(xiàn)成的掩膜圖,那么去除的效果會更好;如果你需要遍歷文件進行修改,所獲得的HSV值并不適用于每一張圖,建議單獨進行處理。
改進方式:
- 修改cv2.inpaint()參數(shù),修復(fù)半徑可以在合適的范圍內(nèi)進行修改,修復(fù)算法的標(biāo)志,有兩種方式可選cv2.INPAINT_TELEA和cv2.INPAINT_NS,其特點可以看看上面給出的詳解,實際應(yīng)用中,需要兩種都試試,并不是cv2.INPAINT_NS就對這種圖更準(zhǔn)確。
- 使用顏色提取腳本,可以將HSV值稍微調(diào)整大一些,可能會包含了一些其他的顏色,但對于我們的目標(biāo)顏色(綠色)能夠提取的更加完整,尤其是面對顏色比較復(fù)雜的場景,比如熱力圖,這個可以后期個人去嘗試。
- 使用np切片的方法,對掩膜圖特定的區(qū)域進行保護。
x_threshold = 500 mask_black[:, x_threshold:] = 0
- 如果是用于檢測,對于部分不是很理想的圖像,可以使用ps細(xì)致修改,當(dāng)然這是你在用來我這個方法后,作為壓箱底的措施。
總結(jié)
效果是達到了我的預(yù)期,本來按照我個人的想法也是將目標(biāo)顏色的附近顏色進行替換,那這不得不遍歷圖像得像素點,但還好有Opencv中有inpaint()函數(shù),得以實現(xiàn)本次實驗。在這里我們就不討論它的實現(xiàn)原理了,大家在CSDN上可以搜索到很多得資料。

2023年5月7日修正文章來源:http://www.zghlxwxcb.cn/news/detail-444096.html
出現(xiàn)了一個bug,今天在測試時,文字為白色遮蓋了我原本的圖像,當(dāng)我對圖像進行上面的操作時,發(fā)現(xiàn)文字沒有被消去,反而變?yōu)榱撕谏?,如果要去消除,還需要再進行一次黑色文字的顏色提取,再用圖像修補才達到我的預(yù)期。文章來源地址http://www.zghlxwxcb.cn/news/detail-444096.html
到了這里,關(guān)于圖像處理:基于cv2.inpaint()圖像修補的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!