Opencv之圖像濾波

圖像濾波,即在盡量保留圖像細節(jié)特征的條件下對目標圖像的噪聲進行抑制,是圖像預(yù)處理中不可缺少的操作,其處理效果的好壞將直接響到后續(xù)圖像處理和分析的有效性和可靠性。(濾波就是要去除沒用的信息,保留有用的信息,可能是低頻,也可能是高頻)

濾波的目的有兩個:

1、抽出對象的特征作為圖像識別的特征模式;
2、是為適應(yīng)圖像處理的要求,消除圖像數(shù)字化時所混入的噪聲。

對濾波處理的要求有兩條:

一、是不能損壞圖像的輪廓及邊緣等重要信息;
二、是使圖像清晰視覺效果好。

噪聲

從統(tǒng)計學(xué)的觀點來看,凡是統(tǒng)計特征不隨時間變化的噪聲稱為平穩(wěn)噪聲,而統(tǒng)計特征隨時間變化的噪聲稱為非平穩(wěn)噪聲。幅值基本相同,但是噪聲出現(xiàn)的位置是隨機的,稱為椒鹽噪聲;如果噪聲的幅值是隨機的,根據(jù)幅值大小的分布,有高斯型和瑞利型兩種,分別稱為高斯噪聲瑞利噪聲

高斯噪聲:是指噪聲服從高斯分布,即某個強度的噪聲點個數(shù)最多,離這個強度越遠噪聲點個數(shù)越少,且這個規(guī)律服從高斯分布。高斯噪聲是一種加性噪聲,即噪聲直接加到原圖像上,因此可以用線性濾波器濾除。

椒鹽噪聲:類似把椒鹽撒在圖像上,因此得名,是一種在圖像上出現(xiàn)很多白點或黑點的噪聲,如電視里的雪花噪聲等。椒鹽噪聲可以認為是一種邏輯噪聲,用線性濾波器濾除的結(jié)果不好,一般采用中值濾波器濾波可以得到較好的結(jié)果。

1. 方框濾波

方框濾波算法的原理很簡單,指定一個XY的矩陣大小,目標像素的周圍XY矩陣內(nèi)的像素全部相加作為目標像素的值,就這么簡單.
方框濾波所用到的核:

方框濾波核

當(dāng)normalize為true時,方框濾波也就成了均值濾波。也就是說均值濾波是方框濾波歸一化后的特殊情況。歸一化就是將要處理的量縮放到一定范圍,比如(0,1)。

openCV中的函數(shù)調(diào)用:

 /**
     *  第一個參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數(shù)對通道是獨立處理的,且可以處理任意通道數(shù)的圖片,但需要注意,待處理的圖片深度應(yīng)該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
     *  第二個參數(shù),OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。
     *  第三個參數(shù),int類型的ddepth,輸出圖像的深度,-1代表使用原圖深度,即src.depth()。
     *  第四個參數(shù),Size類型的ksize,內(nèi)核的大小。一般這樣寫Size( w,h )來表示內(nèi)核的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
     *  第五個參數(shù),Point類型的anchor,表示錨點(即被平滑的那個點),注意他有默認值Point(-1,-1)。如果這個點坐標是負值的話,就表示取核的中心為錨點,所以默認值Point(-1,-1)表示這個錨點在核的中心。
     *  第六個參數(shù),bool類型的normalize,默認值為true,一個標識符,表示內(nèi)核是否被其區(qū)域歸一化(normalized)了。
     *  第七個參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
     */
boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor=Point(-1,-1),
                             bool normalize=true,
                             int borderType=BORDER_DEFAULT );

2. 均值濾波

均值濾波方法是,對待處理的當(dāng)前像素,選擇一個模板,該模板為其鄰近的若干個像素組成,用模板的均值來替代原像素的值的方法。


濾波函數(shù)

方法優(yōu)缺點

優(yōu)點:算法簡單,計算速度快;
缺點:降低噪聲的同時使圖像產(chǎn)生模糊,特別是景物的邊緣和細節(jié)部分。

openCV中的函數(shù)調(diào)用:

    /**
     *  第一個參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數(shù)對通道是獨立處理的,且可以處理任意通道數(shù)的圖片,但需要注意,待處理的圖片深度應(yīng)該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
     *  第二個參數(shù),OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。
     *  第三個參數(shù),Size類型(對Size類型稍后有講解)的ksize,內(nèi)核的大小。一般這樣寫Size( w,h )來表示內(nèi)核的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
     *  第四個參數(shù),Point類型的anchor,表示錨點(即被平滑的那個點),注意他有默認值Point(-1,-1)。如果這個點坐標是負值的話,就表示取核的中心為錨點,所以默認值Point(-1,-1)表示這個錨點在核的中心。
     *  第五個參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
     */
void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor=Point(-1,-1),
                        int borderType=BORDER_DEFAULT );

3. 中值濾波

中值濾波方法是,對待處理的當(dāng)前像素,選擇一個模板,該模板為其鄰近的若干個像素組成,對模板的像素由小到大進行排序,再用模板的中值來替代原像素的值的方法。

優(yōu)缺點

優(yōu)點:抑制效果很好,畫面的清析度基本保持;
缺點:對高斯噪聲的抑制效果不是很好

openCV中的函數(shù)調(diào)用:

 /**
     *  第一個參數(shù),InputArray類型的src,函數(shù)的輸入?yún)?shù),填1、3或者4通道的Mat類型的圖像;當(dāng)ksize為3或者5的時候,圖像深度需為CV_8U,CV_16U,或CV_32F其中之一,而對于較大孔徑尺寸的圖片,它只能是CV_8U。
     *  第二個參數(shù),OutputArray類型的dst,即目標圖像,函數(shù)的輸出參數(shù),需要和源圖片有一樣的尺寸和類型。我們可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。
     *  第三個參數(shù),int類型的ksize,孔徑的線性尺寸(aperture linear size),注意這個參數(shù)必須是大于1的奇數(shù),比如:3,5,7,9 ...
     */
medianBlur( InputArray src, OutputArray dst, int ksize );

4. 雙邊濾波

雙邊濾波(Bilateralfilter)是一種非線性的濾波方法,是結(jié)合圖像的空間鄰近度和像素值相似度的一種折衷處理,同時考慮空域信息和灰度相似性,達到保邊去噪的目的。具有簡單、非迭代、局部的特點。
雙邊濾波器的好處是可以做邊緣保存(edgepreserving),一般過去用的維納濾波或者高斯濾波去降噪,都會較明顯地模糊邊緣,對于高頻細節(jié)的保護效果并不明顯。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差sigma-d,它是基于空間分布的高斯濾波函數(shù),所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的保存。但是由于保存了過多的高頻信息,對于彩色圖像里的高頻噪聲,雙邊濾波器不能夠干凈的濾掉,只能夠?qū)τ诘皖l信息進行較好的濾波。

雙邊濾波原理

濾波算法中,目標點上的像素值通常是由其所在位置上的周圍的一個小局部鄰居像素的值所決定。在2D高斯濾波中的具體實現(xiàn)就是對周圍的一定范圍內(nèi)的像素值分別賦以不同的高斯權(quán)重值,并在加權(quán)平均后得到當(dāng)前點的最終結(jié)果。而這里的高斯權(quán)重因子是利用兩個像素之間的空間距離(在圖像中為2D)關(guān)系來生成。通過高斯分布的曲線可以發(fā)現(xiàn),離目標像素越近的點對最終結(jié)果的貢獻越大,反之則越小。其公式化的描述一般如下所述:


圖像處理之雙邊濾波介紹與源碼實現(xiàn)

其中的c即為基于空間距離的高斯權(quán)重,而用來對結(jié)果進行單位化。
高斯濾波在低通濾波算法中有不錯的表現(xiàn),但是其卻有另外一個問題,那就是只考慮了像素間的空間位置上的關(guān)系,因此濾波的結(jié)果會丟失邊緣的信息。

openCV中的函數(shù)調(diào)用:

/**
     *  第一個參數(shù),InputArray類型的src,輸入圖像,即源圖像,需要為8位或者浮點型單通道、三通道的圖像。
     *  第二個參數(shù),OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。
     *  第三個參數(shù),int類型的d,表示在過濾過程中每個像素鄰域的直徑。如果這個值我們設(shè)其為非正數(shù),那么OpenCV會從第五個參數(shù)sigmaSpace來計算出它來。
     *  第四個參數(shù),double類型的sigmaColor,顏色空間濾波器的sigma值。這個參數(shù)的值越大,就表明該像素鄰域內(nèi)有更寬廣的顏色會被混合到一起,產(chǎn)生較大的半相等顏色區(qū)域。
     *  第五個參數(shù),double類型的sigmaSpace坐標空間中濾波器的sigma值,坐標空間的標注方差。他的數(shù)值越大,意味著越遠的像素會相互影響,從而使更大的區(qū)域足夠相似的顏色獲取相同的顏色。當(dāng)d>0,d指定了鄰域大小且與sigmaSpace無關(guān)。否則,d正比于sigmaSpace。
     *  第六個參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。注意它有默認值BORDER_DEFAULT。
     */
void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType=BORDER_DEFAULT )

5. 高斯濾波

高斯濾波是一種線性平滑濾波,適用于消除高斯噪聲,廣泛應(yīng)用于圖像處理的減噪過程。通俗的講,高斯濾波就是對整幅圖像進行加權(quán)平均的過程,每一個像素點的值,都由其本身和鄰域內(nèi)的其他像素值經(jīng)過加權(quán)平均后得到。
高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內(nèi)像素的加權(quán)平均灰度值去替代模板中心像素點的值。
若使用3×3模板,則計算公式如下:

g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]2+f(x,y)4}/16;
其中,f(x,y)為圖像中(x,y)點的灰度值,g(x,y)為該點經(jīng)過高斯濾波后的值。

openCV中的函數(shù)調(diào)用:

/**
     *  第一個參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。它可以是單獨的任意通道數(shù)的圖片,但需要注意,圖片深度應(yīng)該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
     *  第二個參數(shù),OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。
     *  第三個參數(shù),Size類型的ksize高斯內(nèi)核的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數(shù)和奇數(shù)?;蛘?,它們可以是零的,它們都是由sigma計算而來。
     *  第四個參數(shù),double類型的sigmaX,表示高斯核函數(shù)在X方向的的標準偏差。
     *  第五個參數(shù),double類型的sigmaY,表示高斯核函數(shù)在Y方向的的標準偏差。若sigmaY為零,就將它設(shè)為sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計算出來。
     為了結(jié)果的正確性著想,最好是把第三個參數(shù)Size,第四個參數(shù)sigmaX和第五個參數(shù)sigmaY全部指定到。
     *  第六個參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。注意它有默認值BORDER_DEFAULT。
     */
void GaussianBlur( InputArray src,
                                               OutputArray dst, Size ksize,
                                               double sigmaX, double sigmaY=0,
                                               int borderType=BORDER_DEFAULT );
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容