Python OpenCV學(xué)習(xí)之圖像濾波詳解
背景
圖像濾波的作用簡單來說就是將一副圖像通過濾波器得到另一幅圖像;明確一個概念,濾波器又被稱為卷積核,濾波的過程又被稱為卷積;實際上深度學(xué)習(xí)就是訓(xùn)練許多適應(yīng)任務(wù)的濾波器,本質(zhì)上就是得到最佳的參數(shù);當(dāng)然在深度學(xué)習(xí)之前,也有一些常見的濾波器,本篇主要介紹這些常見的濾波器;
一、卷積相關(guān)概念
卷積核大小一般為奇數(shù)的原因:
1、增加padding的原因;
2、保證錨點在中間,防止位置發(fā)生偏移;
卷積核大小的影響:卷積核越大,感受野越大,提取的特征越好,同時計算量也越大;
邊界擴充(padding)作用:使得輸出數(shù)據(jù)的尺寸與輸入相等;
計算公式:
N = (W - F + 2P)/ S + 1
- N:輸出圖像大小
- W:原圖大小
- F:卷積核大小
- P:擴充尺寸
- S:步長大小
二、卷積實戰(zhàn)
首先介紹兩個簡單的濾波:低通濾波與高通濾波;
低通濾波:低于閾值的可通過,去除噪音或平滑圖像;
高通濾波:高于閾值的可 通過,用于邊緣檢測;
函數(shù)原型:
filter2D(src,ddepth,kernel,[anchor,delta,borderType])
ddepth:位深,一般設(shè)定為-1;
代碼案例:
kernel = np.ones((5, 5), np.float32) / 25 result = cv2.filter2D(img, -1, kernel)
這是一個平均卷積,起到一個降噪的作用,但效果并不明顯;
三、均值濾波
首先介紹一個方盒濾波,實際上就是全為1的卷積核乘以權(quán)重a;
函數(shù)原型:boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
說明:當(dāng)normalize為True時,乘以1/W*H,也就是均值濾波,所以一般不用這個濾波函數(shù);
均值濾波函數(shù)原型:blur(src,ksize,[anchor,borderType])
注意:一般均值濾波就是使用這個API;
代碼案例:
result = cv2.blur(img, 5)
四、高斯濾波
原理:越靠近中心,權(quán)重越大,離中心越遠(yuǎn),權(quán)重越?。?/p>
函數(shù)原型:
GaussianBlur(img,kernel,sigmaX,[sigmaY,…])
說明:對效果有影響的參數(shù)為kernel和sigmaX,這兩者越大圖像平滑(模糊)的效果會越明顯;
代碼案例:
gauss = cv2.imread('gaussian.png') result = cv2.GaussianBlur(gauss, (5, 5), 5) cv2.imshow('org', gauss) cv2.imshow('result', result) cv2.waitKey(0)
從圖中可看出,處理后高斯噪點減少了,但整體圖像也變模糊了;
五、中值濾波
本質(zhì):取中間值作為卷積結(jié)果;
作用:對胡椒噪音有很好的處理效果;
函數(shù)原型:
medianBlur(img,ksize)
代碼案例:
img = cv2.imread('papper.png') result = cv2.medianBlur(img, 5) cv2.imshow('org', img) cv2.imshow('result', result) cv2.waitKey(0)
從上圖可以看出,效果是相當(dāng)不錯的;
六、雙邊濾波
作用:可以保留邊緣,同時對邊緣內(nèi)的區(qū)域進(jìn)行平滑處理;(主要進(jìn)行美顏)
函數(shù)原型:
bilateralFilter(img,d,sigmaColor,sigmaSpace)
案例代碼:
img = cv2.imread('1.jpg') result = cv2.bilateralFilter(img, 9, 50, 50) cv2.imshow('org', img) cv2.imshow('result', result) cv2.waitKey(0)
從圖中可以看出,美顏效果是比較明顯的,并且對于邊緣輪廓也處于能接受范圍;
七、Sobel算子
上述介紹的幾種濾波均為低通濾波,接下來介紹高通濾波,最主要作用是檢測邊緣;
實現(xiàn)步驟:
x軸方向求導(dǎo) —— y軸方向求導(dǎo) —— 最終結(jié)果為二者相加
函數(shù)原型:
Sobel(src,ddepth,dx,dy,ksize=3,…)
代碼案例:
chess = cv2.imread('chess.png') # 求y方向邊緣 dy = cv2.Sobel(chess, cv2.CV_64F, 1, 0, ksize=5) # 求x方向邊緣 dx = cv2.Sobel(chess, cv2.CV_64F, 0, 1, ksize=5) # 二者相加 result = dy + dx cv2.imshow('chess', chess) cv2.imshow('dy', dy) cv2.imshow('dx', dx) cv2.imshow('result', result) cv2.waitKey(0)
從上圖可以明顯看出,當(dāng)dx設(shè)置為1時,求得y方向上的邊緣信息,反之也是,最終二者相加的結(jié)果也就是Sobel算子的結(jié)果。不能一開始就設(shè)定dx,dy為1,這樣子不能達(dá)到該效果;
八、Scharr算子
定義:與Sobel類似,但使用的kernel值不同,并且只能為3x3,只能求x方向或y方向一個方向的邊緣信息;
函數(shù)原型:
Scharr(src,ddepth,dx,dy)
在這里就不演示了,該算子不常用,主要優(yōu)點是能檢測到不明顯的邊緣,當(dāng)Sobel的ksize設(shè)置為-1時等同;
九、拉普拉斯算子
優(yōu)點:可同時求得兩個方向的邊緣;
缺點:對噪音比較敏感,一般需要先進(jìn)行去噪在調(diào)用拉普拉斯算子;
函數(shù)原型:
Laplacian(img,ddepth,ksize=1)
代碼案例:
chess = cv2.imread('chess.png') result = cv2.Laplacian(chess, cv2.CV_64F, ksize=5) cv2.imshow('chess', chess) cv2.imshow('result', result) cv2.waitKey(0)
從效果上看,比起Sobel步驟更加簡單,并且效果也比較好,缺點就是如果噪聲過多的話效果會比較差;
十、Canny算法
實現(xiàn)步驟:
1、使用5x5高斯濾波消除噪音;
2、使用Sobel計算圖像梯度的方向(0°、45°、90°、135°);
3、取局部極大值;
4、閾值計算;
函數(shù)原型:
Canny(img,minVal,maxVal,…)
其中的minVal和maxVal代表邊緣的閾值,兩者差值過大的話會損失一定的邊緣信息;
代碼案例:
img = cv2.imread('1.jpg') result = cv2.Canny(img, 100, 200) cv2.imshow('org', img) cv2.imshow('result', result) cv2.waitKey(0)
以上就是Python OpenCV學(xué)習(xí)之圖像濾波詳解的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV圖像濾波的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python機器學(xué)習(xí)NLP自然語言處理基本操作關(guān)鍵詞
本文是Python機器學(xué)習(xí)NLP自然語言處理系列文章,帶大家開啟一段學(xué)習(xí)自然語言處理 (NLP) 的旅程. 本文主要學(xué)習(xí)NLP自然語言處理關(guān)鍵詞的操作2021-09-09用python按照圖像灰度值統(tǒng)計并篩選圖片的操作(PIL,shutil,os)
這篇文章主要介紹了用python按照圖像灰度值統(tǒng)計并篩選圖片的操作(PIL,shutil,os),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06python中pandas.DataFrame排除特定行方法示例
這篇文章主要給大家介紹了關(guān)于python中pandas.DataFrame排除特定行的方法,文中給出了詳細(xì)的示例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03Pytorch中的model.train()?和?model.eval()?原理與用法解析
pytorch可以給我們提供兩種方式來切換訓(xùn)練和評估(推斷)的模式,分別是:model.train()?和?model.eval(),這篇文章主要介紹了Pytorch中的model.train()?和?model.eval()?原理與用法,需要的朋友可以參考下2023-04-04Python虛擬機字節(jié)碼教程之裝飾器實現(xiàn)詳解
在本篇文章當(dāng)中主要給大家介紹在?cpython?當(dāng)中一些比較常見的字節(jié)碼,從根本上理解?python?程序的執(zhí)行。在本文當(dāng)中主要介紹一些?python?基本操作的字節(jié)碼,并且將從字節(jié)碼的角度分析函數(shù)裝飾器的原理2023-04-04解決python中用matplotlib畫多幅圖時出現(xiàn)圖形部分重疊的問題
今天小編就為大家分享一篇解決python中用matplotlib畫多幅圖時出現(xiàn)圖形部分重疊的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07