python+OpenCV图像处理(六)图像平滑与滤波
圖像平滑與濾波
運(yùn)用它,首先就要了解它,什么是平滑濾波?
? ? ? 平滑濾波是低頻增強(qiáng)的空間域?yàn)V波技術(shù)。它的目的有兩類:一類是模糊;另一類是消除噪音。空間域的平滑濾波一般采用簡(jiǎn)單平均法進(jìn)行,就是求鄰近像元點(diǎn)的平均亮度值。鄰域的大小與平滑的效果直接相關(guān),鄰域越大平滑的效果越好,但鄰域過大,平滑會(huì)使邊緣信息損失的越大,從而使輸出的圖像變得模糊,因此需合理選擇鄰域的大小。
在看一下濾波的目的:
濾波的本義是指信號(hào)有各種頻率的成分,濾掉不想要的成分,即為濾掉常說的噪聲,留下想要的成分.這即是濾波的過程,也是目的。
?
- 一是抽出對(duì)象的特征作為圖像識(shí)別的特征模式;(在我未來將要進(jìn)行的一個(gè)項(xiàng)目中將會(huì)用的到)
- 另一個(gè)是為適應(yīng)圖像處理的要求,消除圖像數(shù)字化時(shí)所混入的噪聲。
有關(guān)平滑與濾波更多的介紹,可以查看百度詞條:平滑與濾波
里面有對(duì)平滑與濾波詳細(xì)的解釋,我就不一 一介紹了,感謝詞條的貢獻(xiàn)者,感謝分享,非常感謝。
?
對(duì)于2D圖像可以進(jìn)行低通或者高通濾波操作,低通濾波(LPF)有利于去噪,模糊圖像,高通濾波(HPF)有利于找到圖像邊界。
(一)2D濾波器cv2.filter2D( )
img = cv2.imread('kenan.jpg', 0) kernel = np.ones((5, 5), np.float32)/25dst = cv2.filter2D(img, -1, kernel) cv2.imshow('dst', dst) cv2.imshow('yuantu', img) cv2.waitKey(0) cv2.destroyAllWindows()(二)均值濾波
?OpenCV中有一個(gè)專門的平均濾波模板供使用------歸一化卷積模板,所有的濾波模板都是使卷積框覆蓋區(qū)域所有像素點(diǎn)與模板相乘后得到的值作為中心像素的值。OpenCV中均值模板可以用cv2.blur和cv2.boxFilter,比如一個(gè)3*3的模板其實(shí)就可以如下表示;
模板大小m*n是可以設(shè)置的。如果不想要前面的1/9,可以使用非歸一化模板cv2.boxFitter。
cv2.blur()是一個(gè)通用的2D濾波函數(shù),它的使用需要一個(gè)核模板。該濾波函數(shù)是單通道運(yùn)算的, 如果是彩色圖像,那么需要將彩色圖像的各個(gè)通道提取出來,然后分別對(duì)各個(gè)通道濾波。如果不想使用歸一化模板,那么應(yīng)該使用cv2.boxFilter(), 并且傳入?yún)?shù)normalize=False
img = cv2.imread('kenan.jpg', 0) blur = cv2.blur(img, (3, 5)) # 模板大小為3*5, 模板的大小是可以設(shè)定的 box = cv2.boxFilter(img, -1, (3, 5)) cv2.imshow('gray', img) cv2.imshow('gray_new', blur) cv2.imshow('gray_new2', box) cv2.waitKey(0) cv2.destroyAllWindows()(三)高斯模糊模板
在上一目錄中,我們的卷積模板中的值全是1,現(xiàn)在把卷積模板中的值換一下,不全是1了,換成一組符合高斯分布的數(shù)值放在模板里,這時(shí)模板中的數(shù)值將會(huì)中間的數(shù)值最大,往兩邊走越來越小,構(gòu)造一個(gè)小的高斯包。這樣可以減少原始圖像信息的丟失。
在OpenCV實(shí)現(xiàn)的函數(shù)為cv2.GaussianBlur()。對(duì)于高斯模板,我們需要制定的是高斯核的高和寬(奇數(shù)),沿x與y方向的標(biāo)準(zhǔn)差(如果只給x,y=x,如果都給0,那么函數(shù)會(huì)自己計(jì)算)。高斯 核可以有效的去除圖像的高斯噪聲。當(dāng)然也可以自己構(gòu)造高斯核,相關(guān)函數(shù)為:cv2.GaussianKernel()。
# 高斯模糊模板 img = cv2.imread('kenan.jpg', 0) for i in range(2000): # 在圖像中加入點(diǎn)噪聲_x = np.random.randint(0, img.shape[0])_y = np.random.randint(0, img.shape[1])img[_x, _y] = 255 blur = cv2.GaussianBlur(img, (5, 5), 0) # (5,5)表示的是卷積模板的大小,0表示的是沿x與y方向上的標(biāo)準(zhǔn)差 cv2.imshow('img', img) cv2.imshow('blur', blur) cv2.waitKey(0) cv2.destroyAllWindows()運(yùn)行結(jié)果為:
(四)中值濾波模板
中值濾波模板就是用卷積框中像素的中值代替中心值,達(dá)到去噪聲的目的。這個(gè)模板一般用于去除椒鹽噪聲。前面的濾波器都是用計(jì)算得到的一個(gè)新值來取代中心像素的值,而中值濾波是用中心像素周圍(也可以使他本身)的值來取代他,卷積核的大小也是個(gè)奇數(shù)。
# 中值濾波模板 img = cv2.imread('kenan.jpg', 0) for i in range(2000): # 加入椒鹽噪聲_x = np.random.randint(0, img.shape[0])_y = np.random.randint(0, img.shape[1])img[_x][_y] = 255 blur = cv2.medianBlur(img, 5) # 中值濾波函數(shù) cv2.imshow('img', img) cv2.imshow('medianblur_img', blur) cv2.waitKey(0) cv2.destroyAllWindows()結(jié)果為:
可以看到,中值濾波對(duì)于這些白點(diǎn)噪聲的去除,效果是非常好的。
(五)雙邊濾波
雙邊濾波(Bilateral ?filter)是一種可以保證邊界清晰的去噪的濾波器。之所以可以達(dá)到此去噪聲效果,是因?yàn)闉V波器是由兩個(gè)函數(shù)構(gòu)成。一個(gè)函數(shù)是由幾何空間距離決定濾波器系數(shù)。另一個(gè)由像素差決定濾波器系數(shù)。它的構(gòu)造比較復(fù)雜,即考慮了圖像的空間關(guān)系,也考慮圖像的灰度關(guān)系。雙邊濾波同時(shí)使用了空間高斯權(quán)重和灰度相似性高斯權(quán)重,確保了邊界不會(huì)被模糊掉。
cv2.bilateralFilter(img, d, 'p1', 'p2')函數(shù)有四個(gè)參數(shù)需要,d是領(lǐng)域的直徑,后面兩個(gè)參數(shù)是空間高斯函數(shù)標(biāo)準(zhǔn)差和灰度值相似性高斯函數(shù)標(biāo)準(zhǔn)差。
# 雙邊濾波 img = cv2.imread('rose1.jpg', 0) for i in range(2000): # 添加椒鹽噪聲_x = np.random.randint(0, img.shape[0])_y = np.random.randint(0, img.shape[1])img[_x][_y] = 255 # 9表示的是濾波領(lǐng)域直徑,后面的兩個(gè)數(shù)字:空間高斯函數(shù)標(biāo)準(zhǔn)差,灰度值相似性標(biāo)準(zhǔn)差 blur = cv2.bilateralFilter(img, 9, 80, 80) cv2.imshow('img', img) cv2.imshow('blur_img', blur) cv2.waitKey(0) cv2.destroyAllWindows()結(jié)果為:
雙邊濾波函數(shù)后面的兩個(gè)參數(shù)設(shè)置的越大,圖像的去噪越多,但隨之而來的是圖像ji將變得模糊,所以根據(jù)需要調(diào)整好后兩個(gè)參數(shù)的大小。
總結(jié)
以上是生活随笔為你收集整理的python+OpenCV图像处理(六)图像平滑与滤波的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理学习笔记(二):SIFT(尺
- 下一篇: TensorFlow实现简单的卷积网络