【OpenCV】OpenCV實戰從入門到精通之二十三 -- 教你深入理解線性濾波有哪些

本文是《OpenCV實戰從入門到精通》系列之第23篇

【OpenCV】OpenCV實戰從入門到精通之一 -- OpenCV宏的講解

【OpenCV】OpenCV實戰從入門到精通之二 -- OpenCV如何進行圖像腐蝕操作

【OpenCV】OpenCV實戰從入門到精通之三 -- canny邊緣檢測

【OpenCV】OpenCV實戰從入門到精通之四 -- 常用的函數講解(mat、imread、imshow、imwrite、nameWindow)

【OpenCV】OpenCV實戰從入門到精通之五 -- 教你使用Rect()函數

【OpenCV】OpenCV實戰從入門到精通之六 -- 教你如何使用滑動條-createTrackbar()函數

【OpenCV】OpenCV實戰從入門到精通之七 -- 教你如何使用鼠標操作SetMouseCallback

【OpenCV】OpenCV實戰從入門到精通之八 -- 帶你深入理解Mat容器

【OpenCV】OpenCV實戰從入門到精通之九 -- OpenCV有哪些常用的數據結構和函數 

【OpenCV】OpenCV實戰從入門到精通之十 -- 教你如何使用OpenCV繪製基本圖形

【OpenCV】OpenCV實戰從入門到精通之十一 -- LUT函數講解及像素在矩陣中如何存儲

【OpenCV】OpenCV實戰從入門到精通之十二 -- 教你如何使用指針訪問像素

【OpenCV】OpenCV實戰從入門到精通之十三 -- 教你如何使用迭代器訪問像素

OpenCV】OpenCV實戰從入門到精通之十四 -- 教你如何使用動態地址運算配合at訪問元素

【OpenCV】OpenCV實戰從入門到精通之十五 -- 教你如何對ROI區域進行疊加

【OpenCV】OpenCV實戰從入門到精通之十六 -- 教你如何對ROI圖像通過線性混合進行操作

【OpenCV】OpenCV實戰從入門到精通之十七 -- 教你如何分離顏色通道

【OpenCV】OpenCV實戰從入門到精通之十八 -- 教你如何防止顏色溢出對圖像進行保護 

【OpenCV】OpenCV實戰從入門到精通之十九 -- 教你如何創建Trackbar圖像對比度、亮度值調整 

【OpenCV】OpenCV實戰從入門到精通之二十 -- 教你深入理解離散傅里葉變換 

【OpenCV】OpenCV實戰從入門到精通之二十一 -- 帶你學習離散傅里葉變換有哪幾個重要函數應用

【OpenCV】OpenCV實戰從入門到精通之二十二 -- 教你深入理解XML和YAML

目錄

本文是《OpenCV實戰從入門到精通》系列之第23篇

 圖像濾波的目的:

濾波處理的要求 

平滑濾波目的有兩類

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,我們一般不去管它。 

 

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