OpenCV 線性濾波

薛定諤的貓兒發表於2019-03-30

線性濾波

影像濾波與濾波器

影像濾波,指的是在儘量保留影像特徵的條件下對目標影像得噪聲進行抑制,是影像處理當中不可缺少的部分。

平滑錄播室低頻增強的空間域濾波技術,它的目的有兩類:一類是模糊,一類是消除噪音。常見的濾波有:

  • 方框濾波 -- BoxBlur 函式
  • 均值濾波 -- Blur 函式
  • 高斯濾波 -- Gaussianblur 函式
  • 中值濾波 -- mediaBlur 函式
  • 雙邊濾波 -- bilateralFilter 函式

線性濾波簡介

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

  • 低通濾波器 允許低頻通過
  • 高通濾波器 允許高頻通過
  • 帶通濾波器 允許一定範圍的頻率通過
  • 帶阻濾波器 允許一定範圍的頻率通過並阻止其他的頻率通過
  • 全通濾波器 允許所有頻率通過,只改變相位
  • 陷波濾波器 阻止一個狹窄頻率範圍通過

濾波和模糊

  • 高斯濾波是指用高斯函式作為濾波函式的濾波操作;
  • 高斯模糊就是高斯低通濾波。

鄰域運算元與線性鄰域濾波

鄰域運算元是利用給定畫素周圍的畫素值決定此畫素的最終輸出值的一種運算元。線性濾波就是一種常見的鄰域運算元。

卷積核卷積

線性濾波處理的輸出畫素值g(i , j) 是輸入畫素值f(i + k,j + I)的加權和,如下:

加權值和

其中的h(k,l),我們稱其為"核",時濾波器的加權係數,即濾波器的"濾波係數",f表示輸入畫素值,h表示加權係數"核",g表示輸出畫素值,整體可以簡單寫作:

卷積公式簡單表達

常見的線性濾波操作

  • 方框濾波 -- boxblur函式
  • 均值濾波 -- blur函式
  • 高斯濾波 -- GaussianBlur函式

方框濾波

void boxFilter(
    InputArray src,
    OutPutArray dst,
    int ddepth,  //輸出影像的深度,-1表示原圖深度
    Size ksize,  //核心的大小
    Point anchor = Point(-1,-1),  //表示錨點,即平滑的那個點
    boolnormalize = true,  //一個識別符號,表示核心是否被其區域歸一化
    int borderType = BORDER_DEFAULT  //用於推斷影像外部畫素的某種邊界模式
)
複製程式碼

當normalize=true的時候,方框濾波就變成了我們熟悉的均值濾波,均值濾波就是方框濾波歸一化後的特殊情況

方框濾波

效果

核心大小(5,5) 核心大小(7,7)
核心大小(5,5)
核心大小(7,7)

均值濾波

均值濾波也稱為線性濾波,其採用的主要方法為鄰域平均法。線性濾波的基本原理是用均值代替原影像中的各個畫素值,即對待處理的當前畫素點(x,y),選擇一個模板,該模板由其近鄰的若干畫素組成,求模板中所有畫素的均值,再把該均值賦予當前畫素點(x,y),作為處理後影像在該點上的灰度g(x,y),即g(x,y)=1/m ∑f(x,y) m為該模板中包含當前畫素在內的畫素總個數。

void blur(
    InputArray src,
    OutPutArray dst,
    Size ksize,  //核心的大小
    Point anchor = Point(-1,-1),  //表示錨點,即平滑的那個點
     int borderType = BORDER_DEFAULT  //用於推斷影像外部畫素的某種邊界模式
)
複製程式碼

均值濾波

高斯濾波

從數學的角度上來看,影像的高斯模糊過程就是影像與正態分佈作卷積。

void GaussianBlur(
    InputArray src,
    OutPutArray dst,
    Size ksize,  //高斯核心的大小
    double sigmax,   //表示高斯函式在X方向的標準偏差
    double sigmay = 0,  //表示高斯函式在Y方向的標準偏差
    int borderType = BORDER_DEFAULT  //用於推斷影像外部畫素的某種邊界模式
)
複製程式碼

一維高斯函式

一維高斯函式

二維高斯函式

二維高斯函式

效果

高斯核心大小(5,5) 高斯核心大小(9,9)
高斯核心大小(5,5)
高斯核心大小(9,9)

相關文章