基於Python的Opencv學習

基於Python的Opencv學習第七天

各位小夥伴,大家好。今天我們一起來學習一下對圖像平滑處理的相關內容,一起來看一下吧!

一.均值濾波

對任意一點的像素值進行均值濾波,意思是選取周圍N*N個像素值的均值。在這裏插入圖片描述
例如:紅色點的像素值=藍色背景區域像素值之和(這個和含紅色值)除以25(即25個不同的值相加除以25後的值賦給紅色區域)

紅色點的像素新值=((197+25+106+156+159)+(149+40+107+5+71)+(163+198+226+223+156)+(222+37+68+193+157)+(42+72+250+41+75))/25

這裏選取的N行,N列在我們opencv中被稱作核,將是我們需要調用opencv函數裏面的重要參數。

在opencv中進行均值濾波需要調用blur()函數,來看看具體語法:
處理結果=cv2.blur(原始圖像,核大小)

這裏參數很簡單,一個是需要處理的原始圖像
一個是我們自定義的核大小:以(寬度,高度)形式表示的元組在這裏插入圖片描述

來看示例代碼和結果:

>>> import cv2
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> b=cv2.blur(a,(5,5))
>>> cv2.imshow("a",a)
>>> cv2.imshow("b",b)
>>> 

這裏採取(5,5)就是對每一個點選取周圍5*5個區域進行均值濾波處理,當此處選取的區域越大,圖像就會更加模糊,如果選取爲(1,1)就會發現圖像和原圖像相同,沒有進行濾波
在這裏插入圖片描述
這裏我們可以看到b圖像更加平滑(這裏可能看上去有點模糊處理的感覺,而且似乎看不出來平滑,但是如果對圖像進行椒鹽噪聲攻擊就能看得很清楚)
在這裏插入圖片描述

二.方框濾波

在方塊濾波時,我們需要調用boxFilter()函數,具體語法如下:
處理結果=cv2.boxFilter(原始圖像,目標深度圖像,核大小,normalize屬性)

來看具體參數:
原始圖像:即我們需要處理的圖像
目標深度大小:int類型的目標圖像深度。通常使用“-1”表示與原始圖像一致
核大小:與均值濾波介紹的相同,可參考均值濾波部分

normalize屬性:是否對目標圖像進行歸一化處理
normalize=1(或者該參數不填):對目標圖像進行歸一化處理,其結果和均值濾波相同(即進行歸一化處理就等同於均值濾波)
normalize=0:不進行歸一化處理

這裏介紹一下歸一化處理:
如果進行歸一化處理就是所有NN個像素值加起來之後除以(NN)

如果不進行歸一化處理就是所有N*N個像素值加起來然後直接賦給待處理那點的像素值,這裏很容易發生溢出,因爲通常周圍幾個值加起來肯定大於最大值255,所以如果選取的核大小很大,那麼很容易得到一片空白。

首先來看進行歸一化處理的代碼和結果:

>>> import cv2
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>>> b=cv2.boxFilter(a,-1,(5,5),normalize=1)
>>> c=cv2.blur(a,(5,5))
>>> cv2.imshow("b",b)
>>> cv2.imshow("c",c)
>>>

在這裏插入圖片描述
如圖,b是進行方塊濾波(歸一化處理的結果),c是進行均值濾波結果,兩者相同作用。

再來看一下不進行歸一化處理的代碼和結果:

>>> import cv2
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> d=cv2.boxFilter(a,-1,(5,5),normalize=0)
>>> cv2.imshow("d",d)
>>> 

在這裏插入圖片描述
這裏由於選取核大小過大,導致這裏的d圖出現一片白色,已經發生溢出事件。

>>> import cv2
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>>> e=cv2.boxFilter(a,-1,(2,2),normalize=0)
>>> cv2.imshow("e",e)
>>> 

在這裏插入圖片描述
這裏可以看到選取核大小較小,還能看到一點圖像,但是像素點值已經很大,白色很明顯。

三.高斯濾波

高斯濾波即讓臨近的像素具有更高的重要度,對周圍像素計算加權平均值,較近的像素具有較大的權重值。
這裏和均值濾波不同的是,均值濾波是所有值採用1然後相加除以NN,相當於每一個值都除以N*N,但是高斯濾波就是每個值採取不同的比例,靠近待處理像素值的點的權重高,遠離的則權重低,但是所有的和加起來等於“1”。

如下圖可以看出,選取核大小爲3*3,則權重可以如下選取。

在這裏插入圖片描述

在這裏插入圖片描述
這幅圖更能夠容易理解高斯濾波算法

在opencv中我們需要調用GaussianBlur()函數,來看具體語法:
dst=cv2.GaussianBlur(src,ksize,sigmaX)

src:原始圖像
ksize:核大小(N,N)必須是奇數
sigmaX:X方向方差,控制權重

這裏注重解釋一下sigmaX,一般情況下我們選擇

sigmaX=0,這時opencv會自動計算出:
sigmaX=0.3
*((ksize-1)*0.5-1)+0.8
而且Y方向方差等於X方向方差

import cv2
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
cv2.imshow("a",a)
b=cv2.GaussianBlur(a,(3,3),0)
cv2.imshow("b",b)

在這裏插入圖片描述
這裏選取核大小比較小,不容易看出結果,如果選取核大小較大,可以看到圖像更加平滑。

四.中值濾波

中值濾波顧名思義,就是讓選取的核大小裏面的像素值按照大小排列,取排序像素集中位於中間位置的值作爲中值濾波後的像素值。
在這裏插入圖片描述
這幅圖能夠非常詳細的表達中值濾波的含義。

在opencv中,我們調用medianBlur()函數,具體語法如下:
dst=cv2.medianBlur(src,ksize)

參數含義爲:
src:需要處理的原圖像
ksize:選取的核大小,必須是比1大的奇數,如3,5,7等
以前核大小是元組的形式,這裏就是一個數字,如填入3,即核大小爲3*3

import cv2
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
cv2.imshow("a",a)
b=cv2.medianBlur(a,3)
cv2.imshow("b",b)

在這裏插入圖片描述
這裏是代碼和結果展示,由於選取核大小較小,所有結果不是特別明顯。

今天給小夥伴們講了一下圖像平滑處理的各種濾波算法,都比較簡單,在opencv裏面就像做填空題一樣,但是還是需要了解清楚各個參數的含義,只要清楚了含義,填空就方便多了。今天就到這裏,我們下一篇博客見(轉載註明出處)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章