1. 程式人生 > >《OpenCV3程式設計入門》第6章-學習筆記1-線性濾波:方框濾波+均值濾波+高斯濾波【理論知識基礎】

《OpenCV3程式設計入門》第6章-學習筆記1-線性濾波:方框濾波+均值濾波+高斯濾波【理論知識基礎】

目錄

影象濾波的目的:

濾波處理的要求 

平滑濾波目的有兩類

OpenCV常用線性濾波器:

OpenCV常用非線性濾波器:

線性濾波器定義及常用的線性濾波器:

濾波和模糊

鄰域運算元與線性濾波器

 OpenCV常用線性濾波器:

【方框濾波(box Filter)】

【均值濾波】 

【高斯濾波】 

GaussianBlur函式


 影象濾波的目的:

一是抽出物件的特徵作為影象識別的特徵模式;另一個是為適應影象處理的要求,消除影象數字化時所混入的噪聲。

濾波處理的要求 

一是不能損壞影象的輪廓及邊緣等重要資訊;二是使影象清晰視覺效果好。

平滑濾波目的有兩類

一類是模糊;另一類是消除噪音。平滑濾波是低頻增強的空間域濾波技術。

OpenCV常用線性濾波器:

  • 方框濾波——boxblur函式
  • 均值濾波(鄰域平均濾波)——blur函式
  • 高斯濾波——GaussianBlur函式

OpenCV常用非線性濾波器:

  • 中值濾波——medianBlur函式
  • 雙邊濾波——bilateralFilter函式

線性濾波器定義及常用的線性濾波器:

線性濾波器經常用於剔除輸入訊號中不想要的頻率或者從許多頻率中選擇一個想要的頻率 

  • 允許低頻率通過的低通濾波器。
  • 允許高頻率通過的高通濾波器。
  • 允許一定範圍頻率通過的帶通濾波器。
  • 阻止一定範圍頻率通過並且允許其它頻率通過的帶阻濾波器。
  • 允許所有頻率通過、僅僅改變相位關係的全通濾波器。
  • 阻止一個狹窄頻率範圍通過的特殊帶阻濾波器,陷波濾波器(Band-stop filter)。
     

濾波和模糊

濾波可分低通濾波和高通濾波兩種

低通濾波是模糊影象;高通濾波是銳化影象

舉例:高斯濾波:模糊就是高斯低通濾波,高斯濾波可以高通濾波也可以是低通濾波

鄰域運算元與線性濾波器

鄰域運算元(區域性運算元)是利用給定畫素周圍的畫素值的決定此畫素的最終輸出值的一種運算元。

鄰域運算元除了用於區域性色調調整以外,還可以用於影象濾波,實現影象的平滑和銳化,影象邊緣增強或者影象噪聲的去除。

而線性鄰域濾波是一種常用的鄰域運算元,畫素的輸出值取決於輸入畫素的加權和

       

以上圖為例:

原始影象是8行8列的。運算元h是3行3列,每個小格子代表的是權重,與原始影象上每3*3的格子想成得到濾波後的值

比如紅色是原始的,乘以h,得到藍色的

原始影象是8*8的,經過乘以3*3的運算元,就變成了6*6的影象。(可以把運算元從原始影象左上角往右平移,能平移6次!)

                              

                                          其中f表示輸入畫素值,h表示加權係數“核“,g表示輸出畫素值 

                                                                                     

 OpenCV常用線性濾波器:

方框濾波——boxblur函式

均值濾波——blur函式

高斯濾波——GaussianBlur函式

【方框濾波(box Filter)】

C++: void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
  1. 第一個引數,InputArray型別的src,輸入影象,即源影象,填Mat類的物件即可。該函式對通道是獨立處理的,且可以處理任意通道數的圖片,但需要注意,待處理的圖片深度應該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  2. 第二個引數,OutputArray型別的dst,即目標影象,需要和源圖片有一樣的尺寸和型別。
  3. 第三個引數,int型別的ddepth,輸出影象的深度,-1代表使用原圖深度,即src.depth()。
  4. 第四個引數,Size型別(對Size型別稍後有講解)的ksize,核心的大小。一般這樣寫Size( w,h )來表示核心的大小( 其中,w 為畫素寬度, h為畫素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
  5. 第五個引數,Point型別的anchor,表示錨點(即被平滑的那個點),注意他有預設值Point(-1,-1)。如果這個點座標是負值的話,就表示取核的中心為錨點,所以預設值Point(-1,-1)表示這個錨點在核的中心。
  6. 第六個引數,bool型別的normalize,預設值為true,一個識別符號,表示核心是否被其區域歸一化(normalized)了。
  7. 第七個引數,int型別的borderType,用於推斷影象外部畫素的某種邊界模式。有預設值BORDER_DEFAULT,我們一般不去管它

                                                

當normalize=true的時候,方框濾波就變成了我們熟悉的均值濾波。也就是說,均值濾波是方框濾波歸一化(normalized)後的特殊情況。其中,歸一化就是把要處理的量都縮放到一個範圍內,比如(0,1),以便統一處理和直觀量化。

【均值濾波】 

均值濾波,是最簡單的一種濾波操作,輸出影象的每一個畫素是核視窗內輸入影象對應畫素的畫素的平均值( 所有畫素加權係數相等),其實說白了它就是歸一化後的方框濾波 

  • blur函式內部中其實就是呼叫了一下boxFilter。
  • 均值濾波是典型的線性濾波演算法,主要方法為鄰域平均法,即用一片影象區域的各個畫素的均值來代替原影象中的各個畫素值。
  • 均值濾波本身存在著固有的缺陷,即它不能很好地保護影象細節,在影象去噪的同時也破壞了影象的細節部分,從而使影象變得模糊,不能很好地去除噪聲點。

                                                        

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

【高斯濾波】 

  • 高斯濾波就是對整幅影象進行加權平均的過程,每一個畫素點的值,都由其本身和鄰域內的其他畫素值經過加權平均後得到。
  • 用一個模板(或稱卷積、掩模)掃描影象中的每一個畫素,用模板確定的鄰域內畫素的加權平均灰度值去替代模板中心畫素點的值。
  • 高斯平滑也用於計算機視覺演算法中的預先處理階段,以增強影象在不同比例大小下的影象效果(參見尺度空間表示以及尺度空間實現)。從數學的角度來看,影象的高斯模糊過程就是影象與正態分佈做卷積。由於正態分佈又叫作高斯分佈,所以這項技術就叫作高斯模糊。
  • 影象與圓形方框模糊做卷積將會生成更加精確的焦外成像效果。由於高斯函式的傅立葉變換是另外一個高斯函式,所以高斯模糊對於影象來說就是一個低通濾波操作。
  • 高斯濾波器是一類根據高斯函式的形狀來選擇權值的線性平滑濾波器。高斯平滑濾波器對於抑制服從正態分佈的噪聲非常有效。

 一維零均值高斯濾波函式:

                                          

二維零均值高斯濾波函式:

                                        

GaussianBlur函式

作用是用高斯濾波器來模糊一張圖片

 C++: void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )
  1. 第一個引數,InputArray型別的src,輸入影象,即源影象,填Mat類的物件即可。它可以是單獨的任意通道數的圖片,但需要注意,圖片深度應該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  2. 第二個引數,OutputArray型別的dst,即目標影象,需要和源圖片有一樣的尺寸和型別。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。
  3. 第三個引數,Size型別的ksize高斯核心的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數和奇數。或者,它們可以是零的,它們都是由sigma計算而來。
  4. 第四個引數,double型別的sigmaX,表示高斯核函式在X方向的的標準偏差。
  5. 第五個引數,double型別的sigmaY,表示高斯核函式在Y方向的的標準偏差。若sigmaY為零,就將它設為sigmaX,如果sigmaX和sigmaY都是0,那麼就由ksize.width和ksize.height計算出來。
  6. 為了結果的正確性著想,最好是把第三個引數Size,第四個引數sigmaX和第五個引數sigmaY全部指定到。
  7. 第六個引數,int型別的borderType,用於推斷影象外部畫素的某種邊界模式。有預設值BORDER_DEFAULT,我們一般不去管它。