计算机视觉的基石-滤波
文章目錄
- 寫在最前
- OpenCV中的濾波類型
- 噪音生成等基本函數(shù)
- 高斯濾波
- 自定義濾波器
寫在最前
我在之前的文章中
講了OpenCV中的濾波函數(shù)以及專門去模糊化的函數(shù)fastNlMeansDenoisingColored講解了OpenCV的入門。這一次,我們?cè)敿?xì)講解OpenCV中的濾波函數(shù),這樣我們?cè)趯W(xué)會(huì)濾波函數(shù)之后,既可以按照上一篇文章的內(nèi)容進(jìn)行噪音去除,也可以使用濾波函數(shù)進(jìn)行反向操作—模糊。
說起來濾波的話,也算是計(jì)算機(jī)視覺里的元老了,除了前面的噪音去除以外,其實(shí)濾波在之后的各個(gè)算法中都會(huì)露臉,所以我們這里也就不得不認(rèn)真講一講他了。┑( ̄Д  ̄)┍
OpenCV中的濾波類型
OpenCV實(shí)現(xiàn)了常見的數(shù)種濾波函數(shù),同時(shí)也支持用戶自己編寫濾波函數(shù)。OpenCV中的濾波函數(shù)如下:
1. 均值濾波 2. 中值濾波 3. 高斯濾波 4. 邊緣保留濾波 5. 自定義濾波函數(shù)其中的第一種濾波函數(shù)和第二種濾波函數(shù),我們上一次都已經(jīng)演示過來。濾波器本身是個(gè)矩陣,均值濾波是計(jì)算的均值,在我們之前的白噪點(diǎn)去除實(shí)驗(yàn)中,均值濾波效果并不好,而更適合中值濾波。除此之外還有幾種比較特別的濾波函數(shù),比如高斯濾波以及邊緣保留濾波。其中高斯濾波也是高斯噪音的最佳去除器。而邊緣保留濾波(EPF)則是用來保留邊緣的濾波函數(shù)如雙邊濾波,均值遷移等等,由于篇幅原因,且邊緣保留濾波相對(duì)于其他濾波器有些許特殊,所以我們這次會(huì)優(yōu)先講一講其他濾波器,邊緣保留濾波將會(huì)放在之后講解。
噪音生成等基本函數(shù)
如果需要測(cè)試去噪效果,那么我們自然需要一個(gè)自動(dòng)生成噪音圖片的函數(shù),以及模塊化的進(jìn)行去除效果展示的函數(shù)。這樣可以模塊化我們的代碼,便于學(xué)習(xí)和理解,具體代碼如下:
def showAndCreateNoiseImage(filePath):if filePath ==None:print("[ERROR] Parameter filePath is None!" )else:img = cv.imread(filePath)cv.imshow("original",img)# 根據(jù)圖像形狀自動(dòng)添加噪音for i in range(1000): #生成1000個(gè)噪點(diǎn)a = random.randint(0,img.shape[0]-1)b = random.randint(0,img.shape[1]-1)img[a,b] = 255cv.imshow("noise",img) # 顯示噪點(diǎn)圖return img上面這段代碼就是對(duì)我們上篇文章中增加隨機(jī)白噪音的改造,我們傳入圖片,然后就可以獲取結(jié)果。專業(yè)的角度來說,圖片中出現(xiàn)的白色或者黑色噪音都是椒鹽噪音(更準(zhǔn)確的說——椒鹽噪聲是指兩種噪聲,鹽噪聲(高灰度噪聲)、胡椒噪聲(低灰度噪聲)。同時(shí)出現(xiàn)時(shí),在圖像上呈現(xiàn)為黑白雜點(diǎn)。),因此使用中值濾波處理比較好。
下面的代碼和效果就分別展示了噪音圖和中值濾波后的數(shù)據(jù)。
def blurDemo(image): #均值模糊 去隨機(jī)噪聲有很好的去噪效果dst = cv.blur(image, (3, 3)) #(1, 15)是垂直方向模糊,(15, 1)是水平方向模糊cv.namedWindow('blur_demo', cv.WINDOW_NORMAL)cv.imshow("blur_demo", dst)return dstdef medianBblurDemo(image): # 中值模糊 對(duì)椒鹽噪聲有很好的去噪效果dst = cv.medianBlur(image, 3)cv.namedWindow('median_blur_demo', cv.WINDOW_NORMAL)cv.imshow("median_blur_demo", dst)src = showAndCreateNoiseImage(filePath) medianBblurDemo(src)高斯濾波
從定義上來說:高斯噪聲是指它的概率密度函數(shù)服從高斯分布(即正態(tài)分布)的一類噪聲。常見的高斯噪聲包括起伏噪聲、宇宙噪聲、熱噪聲和散粒噪聲等等。對(duì)于這類高斯噪音,我們其實(shí)使用高斯濾波或者均值濾波都有不錯(cuò)的處理效果。
def clamp(pv):if pv > 255:return 255if pv < 0:return 0else:return pvdef gaussian_noise(image): #加高斯噪聲h, w, c = image.shapefor row in range(h):for col in range(w):s = np.random.normal(0, 20, 3)b = image[row, col, 0] #blueg = image[row, col, 1] #greenr = image[row, col, 2] #redimage[row, col, 0] = clamp(b + s[0])image[row, col, 1] = clamp(g + s[1])image[row, col, 2] = clamp(r + s[2])cv.namedWindow("noise image", cv.WINDOW_NORMAL)cv.imshow("noise image", image)return imagesrc = cv.imread('/home/fonttian/Data/image/OpenCV/test_lena.jpg') cv.namedWindow("input_image", cv.WINDOW_NORMAL) cv.imshow('input_image', src)src = gaussian_noise(src) dst = cv.GaussianBlur(src, (5,5), 0) #高斯模糊 cv.namedWindow("Gaussian Blur", cv.WINDOW_NORMAL) cv.imshow("Gaussian Blur", dst)
同時(shí)我們可以再用一次均值濾波器,來完成噪音去除。
上面的圖像中,我們?yōu)楦咚篂V波選擇的參數(shù)為(5,5),均值濾波為(3,3),不同的參數(shù)會(huì)帶來不同的效果。你可以多嘗試一下上面的代碼(參數(shù)必須為奇數(shù))。當(dāng)我們將數(shù)值調(diào)大時(shí)雖然會(huì)獲得更好地噪音去除效果,但是圖像細(xì)節(jié)也會(huì)保留的更少,參數(shù)調(diào)小的時(shí)候噪音留下會(huì)逐漸變多,但是細(xì)節(jié)也更多。
自定義濾波器
濾波本質(zhì)就是使用矩陣對(duì)圖像進(jìn)行卷積操作,那么我們自然也可以使用自定義濾波器來實(shí)現(xiàn)之前OpenCV中的的各種濾波器。比如其中的均值濾波就是n*n矩陣乘以n分之一(乘以n分之一是為了像素值溢出),而高斯濾波則是一個(gè)符合高斯分布的矩陣,也就是中值加權(quán)。而中值模糊則顧名思義就是用卷積框?qū)?yīng)像素的中值來替代中心像素的值。如果我們想要在OpenCV中使用自定義濾波器,則需要使用cv.filter2D函數(shù)。具體代碼如下:
def custom_blur_demo(image): # 用戶自定義模糊kernel = np.ones([5, 5], np.float32)/25 #實(shí)現(xiàn)均值模糊,除以25是防止數(shù)值溢出# kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 實(shí)現(xiàn)銳化處理,提高圖像的對(duì)比度,提高立體感,輪廓更加清晰# kernel = np.array([[1,0], [0,-1]], np.float32) # 實(shí)現(xiàn)圖像梯度dst = cv.filter2D(image, -1, kernel)上面的代碼中,我們實(shí)現(xiàn)了多種自定義濾波器,比如第一個(gè)相當(dāng)于參數(shù)(5,5)的均值濾波,二第二種則是銳化處理,第三種是計(jì)算圖像梯度。下面第一張圖片是使用均值濾波模糊后的結(jié)果,然后是第二種和第三種的演示效果。
(3,3)中值濾波后
圖像銳化后
圖像梯度
通過上面的代碼我們可以很明顯的看到自定義濾波器的強(qiáng)大,我們不僅能夠復(fù)刻出OpenCV原有的濾波器,也能制作出新的濾波器。而且其中圖像梯度濾波器還做了一件非常有趣的事情,就是繪制出了圖像輪廓。不過時(shí)間上OpenCV能夠做到的還不止這些,比如下一次我們就將會(huì)講解真正的OpenCV圖像輪廓有關(guān)知識(shí)。
總結(jié)
以上是生活随笔為你收集整理的计算机视觉的基石-滤波的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从去除噪点的说起,有OpenCV要什么P
- 下一篇: 发现你的身形——OpenCV图像轮廓