線(xiàn)性濾波專(zhuān)場(chǎng):方框?yàn)V波、均值濾波與高斯濾波
一、理論與概念講解
1.關(guān)于平滑處理
“平滑處理“(smoothing)也稱(chēng)“模糊處理”(bluring),是一項(xiàng)簡(jiǎn)單且使用頻率很高的圖像處理方法。平滑處理的用途有很多,最常見(jiàn)的是用來(lái)減少圖像上的噪點(diǎn)或者失真。在涉及到降低圖像分辨率時(shí),平滑處理是非常好用的方法。
2.濾波與濾波器
首先看一下濾波的概念,濾波是將信號(hào)中特定波段頻率濾除的操作,是抑制和防止干擾的一項(xiàng)重要措施。而濾波器就是建立的一個(gè)數(shù)學(xué)模型,通過(guò)這個(gè)模型來(lái)將圖像數(shù)據(jù)進(jìn)行能量轉(zhuǎn)化,能量低的就排除掉,噪聲就是屬于低能量部分。一種形象的比喻法是:我們可以把濾波器想象成一個(gè)包含加權(quán)系數(shù)的窗口,當(dāng)使用這個(gè)濾波器平滑處理圖像時(shí),就把這個(gè)窗口放到圖像之上,透過(guò)這個(gè)窗口來(lái)看我們得到的圖像。
? 濾波器的種類(lèi)有很多, 在新版本的OpenCV中,提供了如下五種常用的圖像平滑處理操作方法,且他們分別被封裝在單獨(dú)的函數(shù)中,使用起來(lái)非常方便:
方框?yàn)V波——boxblur函數(shù)
均值濾波——blur函數(shù)
高斯濾波——GaussianBlur函數(shù)
中值濾波——medianBlur函數(shù)
雙邊濾波——bilateralFilter函數(shù)
今天我們要講解的是作為線(xiàn)性濾波的方框?yàn)V波,均值濾波和高斯濾波。兩種非線(xiàn)性濾波操作——中值濾波和雙邊濾波,我們留待下次講解。
3.對(duì)線(xiàn)性濾波器的簡(jiǎn)介
線(xiàn)性濾波器:線(xiàn)性濾波器經(jīng)常用于剔除輸入信號(hào)中不想要的頻率或者從許多頻率中選擇一個(gè)想要的頻率。
幾種常見(jiàn)的線(xiàn)性濾波器:
允許低頻率通過(guò)的 低通濾波器 。
允許高頻率通過(guò)的 高通濾波器 。
允許一定范圍頻率通過(guò)的 帶通濾波器 。
阻止一定范圍頻率通過(guò)并且允許其它頻率通過(guò)的 帶阻濾波器 。
允許所有頻率通過(guò)、僅僅改變相位關(guān)系的 全通濾波器 。
阻止一個(gè)狹窄頻率范圍通過(guò)的特殊 帶阻濾波器 , 陷波濾波器 (Band-stop filter)。
4.關(guān)于濾波和模糊
關(guān)于濾波和模糊,大家往往在初次接觸的時(shí)候會(huì)弄混淆,“一會(huì)兒說(shuō)濾波,一會(huì)兒又說(shuō)模糊,什么玩意兒啊”。我們上文已經(jīng)提到過(guò),濾波是將信號(hào)中特定波段頻率濾除的操作,是抑制和防止干擾的一項(xiàng)重要措施。為了方便說(shuō)明,就拿我們經(jīng)常用的高斯濾波來(lái)作例子吧。 我們知道,濾波可分低通濾波和高通濾波兩種。 而高斯濾波是指用高斯函數(shù)作為濾波函數(shù)的濾波操作 ,至于是不是模糊,要看是高斯低通還是高斯高通,低通就是模糊,高通就是銳化。其實(shí)說(shuō)白了是很簡(jiǎn)單的,對(duì)吧:高斯濾波是指用高斯函數(shù)作為濾波函數(shù)的濾波操作。高斯模糊就是高斯低通濾波。
5.線(xiàn)性濾波
線(xiàn)性濾波是一種常用的鄰域算子,像素的輸出值取決于輸入像素的加權(quán)和,具體過(guò)程如圖。圖注:鄰域?yàn)V波(卷積):左邊圖像與中間圖像的卷積產(chǎn)生右邊圖像。目標(biāo)圖像中藍(lán)色標(biāo)記的像素是利用原圖像中紅色標(biāo)記的像素計(jì)算得到的。線(xiàn)性濾波處理的輸出像素值 是輸入像素值 的加權(quán)和 :其中的加權(quán)和為 ,我們稱(chēng)其為“核”,濾波器的加權(quán)系數(shù),即濾波器的“濾波系數(shù)”。
上面的式子可以簡(jiǎn)單寫(xiě)作:
其中f表示輸入像素值,h表示加權(quán)系數(shù)“核“,g表示輸出像素值
在新版本的OpenCV中,提供了如下三種常用的線(xiàn)性濾波操作,他們分別被封裝在單獨(dú)的函數(shù)中,使用起來(lái)
非常方便:
方框?yàn)V波——boxblur函數(shù)
均值濾波——blur函數(shù)
高斯濾波——GaussianBlur函數(shù)
下面我們來(lái)對(duì)他們進(jìn)行一一介紹。
6.方框?yàn)V波(box Filter)
方框?yàn)V波(box Filter)被封裝在一個(gè)名為boxblur的函數(shù)中,即boxblur函數(shù)的作用是使用方框?yàn)V波器(box filter)來(lái)模糊一張圖片,從src輸入,從dst輸出。
函數(shù)原型如下:
C++: void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point
anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
參數(shù)詳解:
第一個(gè)參數(shù),InputArray類(lèi)型的src,輸入圖像,即源圖像,填Mat類(lèi)的對(duì)象即可。該函數(shù)對(duì)通道是獨(dú)立處
理的,且可以處理任意通道數(shù)的圖片,但需要注意,待處理的圖片深度應(yīng)該為CV_8U, CV_16U, CV_16S,
CV_32F 以及 CV_64F之一。
第二個(gè)參數(shù),OutputArray類(lèi)型的dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類(lèi)型。
第三個(gè)參數(shù),int類(lèi)型的ddepth,輸出圖像的深度,-1代表使用原圖深度,即src.depth()。
第四個(gè)參數(shù),Size類(lèi)型(對(duì)Size類(lèi)型稍后有講解)的ksize,內(nèi)核的大小。一般這樣寫(xiě)Size( w,h )來(lái)表示
內(nèi)核的大?。?其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表
示5x5的核大小
第五個(gè)參數(shù),Point類(lèi)型的anchor,表示錨點(diǎn)(即被平滑的那個(gè)點(diǎn)),注意他有默認(rèn)值Point(-1,-1)。如
果這個(gè)點(diǎn)坐標(biāo)是負(fù)值的話(huà),就表示取核的中心為錨點(diǎn),所以默認(rèn)值Point(-1,-1)表示這個(gè)錨點(diǎn)在核的中心
。
第六個(gè)參數(shù),bool類(lèi)型的normalize,默認(rèn)值為true,一個(gè)標(biāo)識(shí)符,表示內(nèi)核是否被其區(qū)域歸一化
?。╪ormalized)了。
第七個(gè)參數(shù),int類(lèi)型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認(rèn)值BORDER_DEFAULT
,我們一般不去管它。
boxFilter()函數(shù)方框?yàn)V波所用的核為:
其中:
其中f表示原圖,h表示核,g表示目標(biāo)圖,當(dāng)normalize=true的時(shí)候,方框?yàn)V波就變成了我們熟悉的均值濾波。也就是說(shuō),均值濾波是方框?yàn)V波歸一化(normalized)后的特殊情況。其中,歸一化就是把要處理的量都縮放到一個(gè)范圍內(nèi),比如(0,1),以便統(tǒng)一處理和直觀(guān)量化。而非歸一化(Unnormalized)的方框?yàn)V波用于計(jì)算每個(gè)像素鄰域內(nèi)的積分特性,比如密集光流算法(dense optical flow algorithms)中用到的圖像倒數(shù)的協(xié)方差矩陣(covariance matrices of imagederivatives)如果我們要在可變的窗口中計(jì)算像素總和,可以使用integral()函數(shù)。
7.均值濾波
均值濾波,是最簡(jiǎn)單的一種濾波操作,輸出圖像的每一個(gè)像素是核窗口內(nèi)輸入圖像對(duì)應(yīng)像素的像素的平均值( 所有像素加權(quán)系數(shù)相等),其實(shí)說(shuō)白了它就是歸一化后的方框?yàn)V波。
我們?cè)谙挛倪M(jìn)行源碼剖析時(shí)會(huì)發(fā)現(xiàn),blur函數(shù)內(nèi)部中其實(shí)就是調(diào)用了一下boxFilter。
下面開(kāi)始講均值濾波的內(nèi)容吧。
1)均值濾波的理論簡(jiǎn)析
均值濾波是典型的線(xiàn)性濾波算法,主要方法為鄰域平均法,即用一片圖像區(qū)域的各個(gè)像素的均值來(lái)代替原圖像中的各個(gè)像素值。一般需要在圖像上對(duì)目標(biāo)像素給出一個(gè)模板(內(nèi)核),該模板包括了其周?chē)呐R近像素(比如以目標(biāo)像素為中心的周?chē)?(3x3-1)個(gè)像素,構(gòu)成一個(gè)濾波模板,即去掉目標(biāo)像素本身)。再用模板中的全體像素的平均值來(lái)代替原來(lái)像素值。即對(duì)待處理的當(dāng)前像素點(diǎn)(x,y),選擇一個(gè)模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,再把該均值賦予當(dāng)前像素點(diǎn)(x,y),作為處理后圖像在該點(diǎn)上的灰度個(gè)g(x,y),即個(gè)g(x,y)=1/m ∑f(x,y) ,其中m為該模板中包含當(dāng)前像素在內(nèi)的像素總個(gè)數(shù)。
2)均值濾波的缺陷
均值濾波本身存在著固有的缺陷,即它不能很好地保護(hù)圖像細(xì)節(jié),在圖像去噪的同時(shí)也破壞了圖像的細(xì)節(jié)部分,從而使圖像變得模糊,不能很好地去除噪聲點(diǎn)。
3)在OpenCV中使用均值濾波——blur函數(shù)
blur函數(shù)的作用是,對(duì)輸入的圖像src進(jìn)行均值濾波后用dst輸出。
blur函數(shù)文檔中,給出的其核是這樣的:
這個(gè)內(nèi)核一看就明了,就是在求均值,即blur函數(shù)封裝的就是均值濾波。
blur 函數(shù)的原型:
C++: void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int
borderType=BORDER_DEFAULT )
第一個(gè)參數(shù),InputArray類(lèi)型的src,輸入圖像,即源圖像,填Mat類(lèi)的對(duì)象即可。該函數(shù)對(duì)通道是獨(dú)立處
理的,且可以處理任意通道數(shù)的圖片,但需要注意,待處理的圖片深度應(yīng)該為CV_8U, CV_16U, CV_16S,
CV_32F 以及 CV_64F之一。
第二個(gè)參數(shù),OutputArray類(lèi)型的dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類(lèi)型。比如可以用
Mat::Clone,以源圖片為模板,來(lái)初始化得到如假包換的目標(biāo)圖。
第三個(gè)參數(shù),Size類(lèi)型(對(duì)Size類(lèi)型稍后有講解)的ksize,內(nèi)核的大小。一般這樣寫(xiě)Size( w,h )來(lái)表示
內(nèi)核的大?。?其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表
示5x5的核大小
第四個(gè)參數(shù),Point類(lèi)型的anchor,表示錨點(diǎn)(即被平滑的那個(gè)點(diǎn)),注意他有默認(rèn)值Point(-1,-1)。如
果這個(gè)點(diǎn)坐標(biāo)是負(fù)值的話(huà),就表示取核的中心為錨點(diǎn),所以默認(rèn)值Point(-1,-1)表示這個(gè)錨點(diǎn)在核的中心
。
第五個(gè)參數(shù),int類(lèi)型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認(rèn)值BORDER_DEFAULT
,我們一般不去管它。
8.高斯濾波
1)高斯濾波的理論簡(jiǎn)析
高斯濾波是一種線(xiàn)性平滑濾波,適用于消除高斯噪聲,廣泛應(yīng)用于圖像處理的減噪過(guò)程。通俗的講,高斯濾波就是對(duì)整幅圖像進(jìn)行加權(quán)平均的過(guò)程,每一個(gè)像素點(diǎn)的值,都由其本身和鄰域內(nèi)的其他像素值經(jīng)過(guò)加權(quán)平均后得到。高斯濾波的具體操作是:用一個(gè)模板(或稱(chēng)卷積、掩模)掃描圖像中的每一個(gè)像素,用模板確定的鄰域內(nèi)像素的加權(quán)平均灰度值去替代模板中心像素點(diǎn)的值。大家常常說(shuō)高斯濾波最有用的濾波操作,雖然它用起來(lái),效率往往不是最高的。高斯模糊技術(shù)生成的圖像,其視覺(jué)效果就像是經(jīng)過(guò)一個(gè)半透明屏幕在觀(guān)察圖像,這與鏡頭焦外成像效果散景以及普通照明陰影中的效果都明顯不同。高斯平滑也用于計(jì)算機(jī)視覺(jué)算法中的預(yù)先處理階段,以增強(qiáng)圖像在不同比例大小下的圖像效果(參見(jiàn)尺度空間表示以及尺度空間實(shí)現(xiàn))。從數(shù)學(xué)的角度來(lái)看,圖像的高斯模糊過(guò)程就是圖像與正態(tài)分布做卷積。由于正態(tài)分布又叫作高斯分布,所以這項(xiàng)技術(shù)就叫作高斯模糊。
? ? ? ? 圖像與圓形方框模糊做卷積將會(huì)生成更加精確的焦外成像效果。由于高斯函數(shù)的傅立葉變換是另外一個(gè)高斯函數(shù),所以高斯模糊對(duì)于圖像來(lái)說(shuō)就是一個(gè)低通濾波操作。高斯濾波器是一類(lèi)根據(jù)高斯函數(shù)的形狀來(lái)選擇權(quán)值的線(xiàn)性平滑濾波器。高斯平滑濾波器對(duì)于抑制服從正態(tài)分布的噪聲非常有效。一維零均值高斯函數(shù)為:其中,高斯分布參數(shù)Sigma決定了高斯函數(shù)的寬度。對(duì)于圖像處理來(lái)說(shuō),常用二維零均值離散高斯函數(shù)作平滑濾波器。
二維高斯函數(shù)為:
2)在OpenCV中使用高斯濾波——GaussianBlur函數(shù)
GaussianBlur函數(shù)的作用是用高斯濾波器來(lái)模糊一張圖片,對(duì)輸入的圖像src進(jìn)行高斯濾波后用dst輸出。
它將源圖像和指定的高斯核函數(shù)做卷積運(yùn)算,并且支持就地過(guò)濾(In-placefiltering)。
C++: void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double
sigmaY=0, intborderType=BORDER_DEFAULT )
第一個(gè)參數(shù),InputArray類(lèi)型的src,輸入圖像,即源圖像,填Mat類(lèi)的對(duì)象即可。它可以是單獨(dú)的任意通
道數(shù)的圖片,但需要注意,圖片深度應(yīng)該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
第二個(gè)參數(shù),OutputArray類(lèi)型的dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類(lèi)型。比如可以用
Mat::Clone,以源圖片為模板,來(lái)初始化得到如假包換的目標(biāo)圖。
第三個(gè)參數(shù),Size類(lèi)型的ksize高斯內(nèi)核的大小。其中ksize.width和ksize.height可以不同,但他們都必
須為正數(shù)和奇數(shù)?;蛘撸鼈兛梢允橇愕?,它們都是由sigma計(jì)算而來(lái)。
第四個(gè)參數(shù),double類(lèi)型的sigmaX,表示高斯核函數(shù)在X方向的的標(biāo)準(zhǔn)偏差。
第五個(gè)參數(shù),double類(lèi)型的sigmaY,表示高斯核函數(shù)在Y方向的的標(biāo)準(zhǔn)偏差。若sigmaY為零,就將它設(shè)為
sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計(jì)算出來(lái)。
為了結(jié)果的正確性著想,最好是把第三個(gè)參數(shù)Size,第四個(gè)參數(shù)sigmaX和第五個(gè)參數(shù)sigmaY全部指定到。
第六個(gè)參數(shù), int類(lèi)型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認(rèn)值BORDER_DEFAULT,我們一般不去管它。
嗯,第一部分的理論介紹大概就是這些了,我們接著進(jìn)入第二部分,OpenCV的源碼剖析。
評(píng)論