【OpenCV學習筆記】之圖像平滑(線性/非線性濾波器)

一、圖像平滑(smoothing)

         圖像平滑(smoothing)也稱爲“模糊處理”(bluring), 是一項簡單且使用頻率很高的圖像處理方法。可以用來壓制、弱化或消除圖像中的細節、突變、邊緣和噪聲。但最常見的是用來減少圖像上的噪聲或者失真。降低圖像分辨率時,平滑處理是很重要的。

說到噪聲,兩種噪聲應該提一下:

椒鹽噪聲:噪聲的幅值基本上相同,但是噪聲出現的位置是隨機的;(中值濾波效果好)

高斯噪聲:每一點都存在噪聲,但噪聲的幅值是隨機分佈的。

二、圖像濾波與濾波器

         何爲圖像濾波呢?指的是在儘量保留圖像細節特徵的條件下對目標圖像的噪聲進行抑制,是圖像處理中不可缺少的一項操作。好的濾波可以有效的圖像處理的有效性和可靠性。我們知道,信號或者圖像的能量大部分是集中在幅度譜的低頻和中頻段,而高頻段往往會伴有噪聲的存在。因此,我們設計好的濾波器必須能夠較好區分高低頻段。

對於圖像濾波一般有兩點要求:(1)不能損壞圖像的重要特徵信息(如輪廓和邊緣等);

                                                        (2)圖像經濾波處理後清晰度更高;

還有兩點目的:(1)抽出圖像的特徵作爲圖像識別的特徵模式;

                            (2)適應圖像處理時項目的要求,儘可能的降低噪聲;

        平滑濾波是低頻增強的空間域濾波技術。它的目的有兩類:一類是模糊;另一類是消除噪聲。空間域的平滑濾波一般採用簡單平均法進行,就是求鄰近像元點的平均亮度值。鄰域的大小與平滑的效果直接相關,鄰域越大平滑的效果越好,但鄰域過大,平滑會使邊緣信息損失的越大,從而使輸出的圖像變得模糊,因此需合理選擇鄰域的大小(即平滑核、窗口的大小)。

空間濾波技術分類

      一、根據空間濾波增強目的可分爲:平滑濾波和銳化濾波;

     二、根據空間濾波的特點可分爲:線性濾波和非線性濾波。

  (1)平滑濾波,能減弱或消除圖像中的高頻分量,但不影響低頻分量。因爲高頻分量對應圖像中的區域邊緣等灰度值具有較大、較快變化的部分,平滑濾波將這些分量綠區可減少局部灰度的起伏,使圖像變得比較平滑。實際應用中,平滑濾波即可以用來消除噪聲,又可以用在提取較大的目標前過濾去除較小的細節或將目標內的小間斷連接起來。

 (2)銳化濾波,能減弱或消除圖像中的低頻分量,但不影響高頻分量。因爲低頻分量對應圖像中灰度值緩慢變化的區域,因而與圖像的整體特性如整體對比度和平均灰度值等有關。銳化濾波將這些分量濾去可使圖像反差增加,邊緣明顯。實際應用中,銳化濾波可用於增強圖像中被模糊的細節或景物的邊緣。

下面是常用的一些濾波器,分爲線性濾波和非線性濾波

         方框濾波–> boxblur函數來實現 –>線性濾波 
         均值濾波(鄰域平均濾波)–> blur函數 –>線性濾波 
         高斯濾波–>GaussianBlur函數 –>線性濾波 
         中值濾波–>medianBlur函數 –>非線性濾波 
         雙邊濾波–>bilateralFilter函數 –>非線性濾波

三、線性濾波器Linear Filter

幾種常見的線性濾波器: 
(1)低通濾波器:允許低頻率通過;
(2)高通濾波器:允許高頻率通過; 
(3)帶通濾波器 :允許一定區域的頻率通過;
(4)帶阻濾波器 :阻止一定範圍內的頻率並且允許其他頻率通過;
(5)全通濾波器 :允許所有頻率通過,僅僅改變相位;
(6)陷波濾波器(Band stop filter):阻止一個狹窄頻率範圍通過的特殊帶阻濾波器。

線性濾波的原理分析:

        線性鄰域濾波是一種常用的鄰域算子;鄰域算子(局部算子)是利用給定像素周圍的像素值的決定此像素的最終輸出值的一種算子。下面這個圖解可以很好的說明這個過程:

鄰域算子(局部算子)是利用給定像素周圍的像素值的決定此像素的最終輸出值的一種算子。而線性鄰域濾波是一種常用的鄰域算子,像素的輸出值取決於輸入像素的加權和,具體過程如下圖。

鄰域算子(局部算子)是利用給定像素周圍的像素值的決定此像素的最終輸出值的一種算子。而線性鄰域濾波是一種常用的鄰域算子,像素的輸出值取決於輸入像素的加權和,具體過程如下圖:

        假設有6x6的圖像像素點矩陣。卷積過程:6x6上面是個3x3的窗口,從左向右,從上向下移動,黃色的每個像個像素點值之和取平均值賦給中心紅色像素作爲它卷積處理之後新的像素值。每次移動一個像素格。

        而平滑(smoothing)/模糊(bluring)的數學理論幕後黑手——卷積:

                                                                        

      線性濾波處理的輸出像素值g(i,j)也就是上面的紅心的值,是輸入圖像f(i+k,j+l)的加權和。h(k,l)是核,也是窗口大小;

3.1 方框濾波(box Filter)

    感覺很少用到,而且當normalize=true時,實際就是均值濾波:

C++ void boxFilter(InputArray src,    //輸入圖像
            OutputArray dst,   //輸出圖像
            int depth,       //輸出圖像的深度,-1表示使用原圖深度,即src.depth()
            Size ksize,       //內核的大小,Size(w,h)
            Point anchor=Point(-1,-1),    //錨點
            boolnormalize=true,         //一個標識符,表示內核是否被其區域歸一化(narmalized)了
           int borderType=BORDER_DEFAULT )  //一般不管 

3.2 均值濾波(Mean Filter)

         均值濾波實際上就是用均值替代原圖像中的各個像素值。

        均值濾波是典型的線性濾波算法,它是指在圖像上對目標像素給一個模板,該模板包括了其周圍的臨近像素(假設我3*3,窗口,則以目標像素爲中心的周圍8個像素,構成一個濾波模板,即去掉目標像素本身),再用模板中的全體像素的平均值來代替原來(目標核的)像素值。對噪聲圖像特別是有大的孤立點的圖像非常敏感,即使有極少數量點存在較大差異也會導致平均值的明顯波動。

原理分析:(K爲模板)

                                         

 處理後的目標點像素值:  g(x,y)=\frac{1}{M}\sum f(x,y),M是包括目標像素在內的像素總和。

Opencv的API介紹:

C++ void blur(InputArray src,       //輸入圖像
          OutputArraydst,       //輸出圖像
          Size ksize,         //內核大小
          Point anchor=Point(-1,-1),     //錨點
          int borderType=BORDER_DEFAULT )  //一般不管

優缺點分析:

        在降低噪聲的同時使圖像變得模糊,特別是在景物的邊緣和細節處,模板越大,雖然噪聲的抑制效果越好,但同時畫面的模糊越嚴重。(均值濾波的固有缺陷)

3.3 高斯濾波(Gaussian Filter)

         高斯濾波是一種線性平滑濾波,適用於消除高斯噪聲,廣泛應用於圖像處理的減噪過程。通俗的講,高斯濾波就是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過加權平均後得到。

高斯濾波的具體操作:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。進行高斯濾波的通常原因是真實圖像在空間內的像素是緩慢變化的,因此臨近點的像素變化不會很明顯,但是隨機的兩個點就可能形成很大的像素差。正是基於這一點,高斯濾波在保留信號的條件下減少噪聲。遺憾的是,這種方法在接近邊緣處就無效了,因此高斯濾波會破平邊緣。但是,高斯平滑濾波器對於抑制服從正態分佈的噪聲仍然是非常有效的。

高斯函數

                            

二維高斯函數:

                                               

OpenCV裏面的API介紹:

C++ void GaussianBlur(InputArray src,      //輸入圖像
             OutputArray dst,    //輸出圖像
             Size ksize,       //內核的大小
             double sigmaX,     //高斯核函數在X方向的標準偏差  
             double sigmaY=0,    //高斯核函數在Y方向的標準偏差
             intborderType=BORDER_DEFAULT )  //一般不用管

四、非線性濾波(Nonlinear filtering)

4.1 中值濾波(Median bluring)

        中值濾波法是一種基於排序統計理論的一種能有效抑制噪聲的非線性平滑技術,它將每一像素點的灰度值設置爲該點某鄰域窗口內的所有像素點灰度值的中值,也就是將中心像素的值用所有像素值的中間值(不是平均值)替換。中值濾波通過選擇中間值避免圖像孤立噪聲點的影響,對脈衝噪聲、斑點噪聲、椒鹽噪聲有良好的濾除作用,特別是在濾除噪聲的同時,能夠保護信號的邊緣,使之不被模糊。這些優良特性是線性濾波方法所不具有的。此外,中值濾波的算法比較簡單,也易於用硬件實現。所以,中值濾波方法一經提出後,便在數字信號處理領得到重要的應用。

                                                     原理:

        其中,f(x,y),g(x,y)分別爲原圖像和處理後的圖像,W爲模板,通常爲3*3、5*5區域,也可以有不同的形狀,如線形、圓形、十字形、圓環形等。

優缺點分析:

優點:中值濾波在一定條件下可以克服常見的線性濾波器(最小均方濾波器、方框濾波器、均值濾波器)等給圖像帶來的細節模糊分影響。想想也知道,從他們的原理來看,均值濾波器加入了噪聲成分進去,而中值濾波器在一定程度上有過濾噪聲的作用,使得其在降噪方面也有很好的效果。

缺點:中值濾波比較耗費時間,是均值濾波的5倍以上。

OpenCV裏面的API介紹:

C++:  void medianBlur(InputArray src,OutputArray dst,int ksize)
//參數詳解:

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

4.2  雙邊濾波(Bilateral Filtering)

        雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結合圖像的空間鄰近度和像素值相似度的一種折衷處理,同時考慮空域信息和灰度相似性,達到保邊去噪的目的。具有簡單、非迭代、局部的特點。雙邊濾波能夠提供一種不會將邊緣平滑掉的方法,但作爲代價,需要更多的處理時間。與高斯濾波類似,雙邊濾波會依據每個像素及其領域構造一個加權平均值,加權計算包括兩個部分,其中第一部分加權方式與高斯平滑中相同,第二部分也屬於高斯加權,但不是基於中心像素點與其他像素點的空間距離之上的加權,而是基於其他像素與中心像素的亮度差值的加權。可以將雙邊濾波視爲高斯平滑,對相似的像素賦予較高的權重,不相似的像素賦予較小的權重,也可用於圖像分割之中。

        雙邊濾波器的好處是可以做邊緣保存(edge preserving),一般過去用的維納濾波或者高斯濾波去降噪,都會較明顯地模糊邊緣,對於高頻細節的保護效果並不明顯。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差sigma-d,它是基於空間分佈的高斯濾波函數,所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的保存。但是由於保存了過多的高頻信息,對於彩色圖像裏的高頻噪聲,雙邊濾波器不能夠乾淨的濾掉,只能夠對於低頻信息進行較好的濾波。

原理分析:

                                    

其中定義域濾波和值域濾波可以用下圖形象表示:

                                    

OpenCV裏面的API介紹:

C++ void bilateralFilter(InputArray src,OutputArray dst,int d,double sigmaColor,double sigmaSpace,int borderType=BORDER_DEFAULT)
//參數詳解如下:

//第一個參數,InputArray類型的src,輸入圖像,即源圖像,需要爲8爲或者浮點型單通道、三通道的圖像;
//第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖像有一樣的尺寸和類型;
//第三個參數,int類型的d,表示在過濾過程中每個像素鄰域的直徑。如果這個參數被設置爲負值,那麼OpenCV會從第五個參數sigmaSpace來計算出它;
//第四個參數,double類型的sigmaColor,顏色空間濾波器的sigma值,這個參數的值越大,就表明該像素鄰域內有越寬廣的顏色會被混合到一起,產生較大的半相等顏色區域;
//第五個參數,double類型的 sigmaSpace,座標空間中的sigma值,座標空間的標註方差。它的數值越大,意味着越遠的像素會相互影響,從而使更大區域中足夠相似的顏色獲取相同的顏色,當d>0時,d制定了鄰域大小且與sigmaSpace無關,否則,d正比於sigmaSpace;
//第六個參數,int類型的borderType,用於推斷圖像外部像素的某種邊界模式,有默認值BORDER_DEFAULT。

綜合示例程序: 

                                       (均值濾波)                                                                                       (高斯濾波

                                              (中值濾波)                                                                               (雙邊高斯濾波

分析:

  1. 均值模糊無法克服邊緣像素信息丟失缺陷。原因是均值濾波是基於平均權重;
  2. 高斯模糊部分克服了該缺陷,但是無法完全避免,因爲沒有考慮像素值的不同;
  3. 中值模糊,雖然抑制噪聲算法比均值濾波略爲複雜,但保持畫面清晰度的效果更好;
  4.  高斯雙邊模糊是邊緣保留的濾波方法,避免了邊緣信息丟失,保留了圖像輪廓不變。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章