Python OpenCV之常用濾波器使用詳解
1. 濾波器
1.1 什么是濾波器
濾波器是對圖像做平滑處理 的一種常用工具。
平滑處理即在盡可能地保留原圖像信息的情況下,對像素值進行微調(diào),使鄰近的像素值之間,值的大小趨于“平滑”,以去除圖像內(nèi)的噪聲、降低細節(jié)層次信息等的一系列的操作過程。本篇blog將為大家展示OpenCV中的均值濾波器 、中值濾波器 、高斯濾波器 和 雙邊濾波器。
濾波器的算法邏輯為,指定一個濾波核的大?。ㄔ摯笮”硎緟⑴c計算的像素數(shù)據(jù)的范圍),以圖像中的每一個像素都作為波的核心,通過該范圍內(nèi)的數(shù)據(jù),以一定的計算方式進行計算,將計算結果該值賦值給該像素。
1.2 關于濾波核
以大小為n×n的濾波核為例,對于每一個像素數(shù)據(jù),我們可以在數(shù)組中得到以一個像素為中心的n×n的矩陣,此即參與計算的數(shù)據(jù)的范圍(邊界)。這樣的矩陣結構即被稱為濾波核。
1.3 素材選擇
使用圖像《龍門石窟》(longmen.jpg) shape:(350, 600, 3)

2.均值濾波器 cv2.blur()
2.1 語法簡介
均值濾波器,也稱低通濾波器
顧名思義,均值濾波器即對濾波核內(nèi)的數(shù)據(jù)求均值,然后將這個值賦值給矩陣核心位置。
均值濾波器可以使用cv2.blur() 方法實現(xiàn)
cv2.blur()的語法:
dst = blur(src, ksize, dst=None, anchor=None, borderType=None)
其中
- scr 即圖像
- ksize 濾波核大小。使用一個元組表示,形如(a, b),a表示height(高度),b表示width(寬度)。
- anchor 波核錨點
- borderType 邊界類型
下邊以3×3,5×5,10×10三種濾波核為例,分別展示圖像經(jīng)過均值濾波器處理后的效果。
2.2 代碼示例
2.2.1 3×3 濾波核為例
import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.blur(img, (3, 3))
cv2.imshow("3*3", dst1)
cv2.waitKey()
cv2.destroyAllWindows()
濾波效果如下:

2.2.2 5×5 濾波核為例
import cv2
img = cv2.imread("longmen.jpg")
dst2 = cv2.blur(img, (5, 5))
cv2.imshow("5*5", dst2)
cv2.waitKey()
cv2.destroyAllWindows()
濾波效果如下:

2.2.3 10×10濾波核為例
import cv2
img = cv2.imread("longmen.jpg")
dst3 = cv2.blur(img, (10, 10))
cv2.imshow("10*10", dst3)
cv2.waitKey()
cv2.destroyAllWindows()

可以看出,濾波核大小越大,圖像越趨于模糊。
3. 中值濾波器 cv2.medianBlur()
中值濾波器,即對濾波核內(nèi)所有數(shù)據(jù)排序,將中間值賦值給濾波核核心位置的數(shù)字。
medianBlur(src, ksize, dst=None)
其中 ksize必須是奇數(shù),是偶數(shù)的話會發(fā)生報錯。
不同于均值濾波器的方法,cv2.blur(),cv2.blur()的ksize參數(shù)是一個元組,而cv2.blur()的ksize參數(shù)是一個數(shù)值。
代碼示例
import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.medianBlur(img, 3)
cv2.imshow("3*3", dst1)
cv2.waitKey()
cv2.destroyAllWindows()
濾波后效果如下:

4. 高斯濾波器 cv2.GaussianBlur()
高斯濾波器也被稱為高斯模糊 或 高斯平滑 。
高斯濾波器可以在降低圖片噪聲、細節(jié)層次的同時保留更多的圖像信息,使經(jīng)過處理的圖像呈現(xiàn)出“磨砂玻璃”的濾鏡效果。
使用均值濾波時,每個像素都是均等權重的。使用高斯濾波器求的是不同權重下的均值,越靠近核心的像素的權重越大,約靠近邊緣的像素的權重則越小。
與濾波核對應的由每個數(shù)據(jù)權重組成的矩陣結構,是一個卷積核。卷積核中所有權重值的和為1。卷積核中的數(shù)值會隨著核的大小而變化。
OpenCV使用cv2.GaussianBlur()方法實現(xiàn)高斯濾波器。其語法如下:
GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
其中
- src 為目標圖像
- ksize 是濾波核大小,寬高必須是奇數(shù) 。格式為是元組形式。
修改sigmaX 和 sigmaY都會改變卷積核中的權重值。這里涉及卷積方面的知識。
borderType 是邊界類型。
以9×9的濾波核為例
import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.GaussianBlur(img, (9, 9), 0, 0)
cv2.imshow("9*9", dst1)
cv2.waitKey()
cv2.destroyAllWindows()
濾波后效果如下:

5. 雙邊濾波器 cv2.bilateralFilter()
前三種濾波方式都會使圖像變得平滑的同時,邊緣區(qū)域變得模糊不清。
雙邊濾波是可以在濾波過程中起到保護圖像邊界信息作用的濾波操作方法。
其邏輯為:
如果圖像在邊緣區(qū)域,則加大邊緣像素的權重,盡可能地讓邊緣區(qū)域的像素值保持不變。如果不在邊緣區(qū)域(在平坦區(qū)域),則使用類似高斯濾波器的算法進行。
雙邊濾波器的語法為:
bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
scr 即目標圖像
d過濾期間使用的每個像素鄰域的直徑。如果為非正,則根據(jù)sigmaSpace計算。即如果為15,則表示15×15的濾波核。
sigmaColor參與計算的顏色的范圍,只有像素小于這個值時,以其為核心的濾波核才參與濾波計算。否則不參與。當sigmaColor值為255時,表示所有像素值為核心的濾波核都會參與。
sigmaSpace坐標空間的σ \sigmaσ值,σ \sigmaσ越大,參與計算的像素數(shù)量就越多。
borderType邊界的樣式。
還以圖片"longmen.jpg"為例,
選擇20×20的濾波核,
參與計算的像素值范圍為:小于125的像素值;
坐標空間的σ \sigmaσ值為,200
import cv2
img = cv2.imread("longmen.jpg")
# 雙邊濾波,選取范圍直徑為15,顏色范圍為125
dst = cv2.bilateralFilter(img, 15, 125, 200)
cv2.imshow("bilateral", dst)
cv2.waitKey()
cv2.destroyAllWindows()
雙邊濾波效果如下:

可以看出,相比以上濾波效果,雙邊濾波保留了較清晰的圖像邊緣信息。
到此這篇關于Python OpenCV之常用濾波器使用詳解的文章就介紹到這了,更多相關Python OpenCV濾波器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
flask 框架操作MySQL數(shù)據(jù)庫簡單示例
這篇文章主要介紹了flask 框架操作MySQL數(shù)據(jù)庫,結合實例形式詳細分析了flask框架操作MySQL數(shù)據(jù)庫的連接、表格創(chuàng)建、數(shù)據(jù)增刪改查等相關使用技巧,需要的朋友可以參考下2020-02-02
python判斷文件是否存在,不存在就創(chuàng)建一個的實例
今天小編就為大家分享一篇python判斷文件是否存在,不存在就創(chuàng)建一個的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
Python 數(shù)據(jù)分析之Beautiful Soup 提取頁面信息
Beautiful Soup 提供一些簡單的、python 式的函數(shù)用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數(shù)據(jù),因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序2021-10-10

