圖像處理基礎(3):均值濾波器及其變種

均值濾波器能夠歸爲低通濾波器,是一種線性濾波器,其輸出爲鄰域模板內的像素的簡單平均值,主要用於圖像的模糊和降噪。
均值濾波器的概念很是的直觀,使用濾波器窗口內的像素的平均灰度值代替圖像中的像素值,這樣的結果就是下降圖像中的「尖銳」變化。這就形成,均值濾波器能夠下降噪聲的同時,也會模糊圖像的邊緣。均值濾波器的處理結果是過濾掉圖像中的「不相關」細節,其中「不相關」細節指的是:與濾波器模板尺寸相比較小的像素區域。函數

根據均值計算方法的不一樣,均值濾波器有如下幾種:spa

  • 算術均值濾波器
  • 幾何均值濾波器
  • 諧波均值濾波器
  • 逆諧波均值濾波器

算術均值濾波器 Arithmetic Mean Filter

這是最簡單的均值濾波器,能夠去除均勻噪聲和高斯噪聲,但會對圖像形成必定程度的模糊。
\(S_xy\)表示中心點在\((x,y)\)處,大小爲\(m \times n\)的濾波器窗口。算術均值濾波器就是簡單的計算窗口區域的像素均值,而後將均值賦值給窗口中心點處的像素:
\[ f(x,y) = \frac{1}{mn}\sum_{(x,y) \in S_{xy}} g(s,t) \]
其中,\(g(s,t)\)表示原始圖像,\(f(x,y)\)表示均值濾波後獲得的圖像。
基於上述公式,能夠很容易的獲得的算術均值濾波器的窗口模板,下面以\(3 \times 3\)爲例
\[ \frac{1}{9} \left [ \begin{array}{c} 1 & 1 & 1 \\ 1& 1 & 1 \\ 1 & 1 & 1 \end{array} \right ] \]
在OpenCV中,函數blur表示使用該模板的均值濾波器,其聲明以下:3d

void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );

src是輸入圖像,dst爲輸出圖像;ksize是濾波器模板窗口的大小;後兩個參數分別表示,待處理像素在模板窗口的位置,默認值是窗口的中心位置,因此窗口的大小通常爲奇數,最後一個參數表示對編解類型的處理,使用默認值便可。其調用示例blur(src,dst,Size(5,5),模板窗口的大小爲\(5 \times 5\)code

盒狀濾波器

當濾波器的模板的全部的係數都相等時稱之爲盒狀濾波器 Box Filter。其使用的模板以下(\(3 \times 3\) 爲例):
\[ \alpha \left [ \begin{array}{c} 1 & 1 & 1 \\ 1& 1 & 1 \\ 1 & 1 & 1 \end{array} \right ] \]
\(\alpha = 1\)時,盒狀濾波器能夠很方便的計算圖像像素鄰域的和,對計算圖像的各類積分特性例如圖像的協方差矩陣,是頗有幫助的。OpenCV中的函數boxFilter就是盒狀濾波器,其聲明以下:orm

void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );

blur的參數比較相似,所不一樣的ddepth是濾波後圖像的深度,-1表示和原圖像的深度相同;參數normalize表示是否有歸一化的參數,這是由於在boxFilter使用的模板以下:
\[ K = \alpha \left [ \begin{array}{c} 1 & 1 & 1 \\ 1& 1 & 1 \\ 1 & 1 & 1 \end{array} \right ] \]
其中,
\[ \alpha = \left \{ \begin{array}{cl} \frac{1}{width * height} & where normalize = true \\ 1& otherwise \end{array} \right. \]
也就是說,當normalize = true時,這也是一個默認值,其就是一個算術均值濾波器;normalize=false,盒狀濾波器的做用就是計算模板窗口內的像素的和,而後將值賦給窗口中心位置的像素,主要用來計算鄰域像素的和。blog

加權的均值濾波器

不一樣於上面的全部像素的係數都是相同的,加權的均值濾波器使用的模板係數,會根據像素和窗口中心像素的距離而取不一樣的係數。賦予中心點最高的權重,而後隨着離中心點的距離增長而減少係數,這樣作的目的是在平滑圖像的同時儘可能下降對圖像的模糊。最經常使用的加權模板以下(\(3 \times 3\))爲例:
\[ \frac{1}{16}\left [ \begin{array}{ccc} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{array} \right ] \]it

其餘的一些非線性均值濾波器

除了上述算術均值濾波器,根據計算均值方法的不一樣還有幾種均值濾波。opencv

幾何均值濾波器 Geometric Mean Filter其公式以下:
\[ f(x,y) = \left[ \prod_{(s,t)\in S_{xy}g(s,t)} \right]^{\frac{1}{mn}} \]
濾波後圖像的像素由模板窗口內像素的乘積的\(\frac{1}{mn}\)冪給出。 和算術均值濾波器相比,幾何均值濾波器可以更好的取出高斯噪聲,而且可以更多的保留圖像的邊緣信息。但,其對0值是很是敏感的,在濾波器的窗口內只要有一個像素的灰度值爲0,就會形成濾波器的輸出結果爲0。ast

諧波均值濾波器 Harmonic Mean Filter 其公式以下:
\[ f(x,y) = \frac{mn}{\sum\limits_{(x,y) \in S_{xy}}\frac{1}{g(s,t)}} \]
諧波均值濾波器對鹽粒噪聲(白噪聲)效果較好,不適用於胡椒噪聲;比較適合處理高斯噪聲。模板

逆諧波均值濾波器 Contra-Harmonic Mean Filter其公式以下:
\[ f(x,y) = \frac{\sum\limits_{(x,y) \in S_{xy}}g(s,t)^{Q+1}}{\sum\limits_{(x,y) \in S_{xy}}g(s,t)^{Q}} \]
其中Q稱爲濾波器的階數,該濾波器能夠用來消除椒鹽噪聲。可是須要不一樣同時處理鹽粒噪聲和胡椒噪聲,當Q爲正時,能夠消除胡椒噪聲;當Q爲負時,消除鹽粒噪聲。當Q=0時,該濾波器退化爲算術均值濾波器;Q=-1時,退化爲諧波均值濾波器。

\(Y_p\)均值濾波器 非線性均值濾波器中的一種,其公式以下:
\[ f(x,y) = \left[ \sum\limits_{(x,y) \in S_{xy}} \frac{g(s,t)^P}{N} \right ]^{\frac{1}{P}} \]
P爲負數時能夠有效的濾去鹽粒(白)噪聲,正的異常值;P爲正時能夠過濾胡椒(黑)噪聲,負的異常值。

基於OpenCV的實現

上述濾波器的實現大同小異,只是計算均值的方法不一樣。

Mat tmp;
    copyMakeBorder(m, tmp, ksize / 2, ksize / 2, ksize / 2, ksize / 2, BorderTypes::BORDER_REFLECT); // 擴展邊界
    int rows = tmp.rows - ksize / 2;
    int cols = (tmp.cols - ksize / 2) * tmp.channels();
    for (int i = ksize / 2; i < rows - ksize / 2; i++)
    {
        for (int j = ksize / 2; j < cols - ksize / 2; j++)
        {
           // 遍歷窗口內的像素,計算均值
        }
    }
    Rect rect(ksize / 2, ksize / 2, m.cols, m.rows);
    m = tmp(rect);

下面就再也不貼全的代碼,只給出根據不一樣的公式計算均值的代碼。
幾何均值濾波器

// 取得窗口像素
            double mul = 1;
            for (int a = -ksize / 2; a <= ksize / 2; a++)
            {
                for (int b = -ksize / 2; b <= ksize / 2; b++)
                {
                    mul *= tmp.at<uchar>(i + a, j + b);
                }
            }
            auto pixel = pow(mul, 1.0 / (ksize * ksize));
            if (pixel < 0)
                pixel = 0;
            else if (pixel >= 255)
                pixel = 255;
            tmp.at<uchar>(i, j) = static_cast<uchar>(pixel);

基本就是遍歷圖像的像素,而後在濾波器的窗口內根據均值的計算方式計算均值;幾何濾波器,就是將濾波器窗口內的像素乘積,而後去乘積的\(\frac{1}{ksize *ksize}\)冪。須要說明的是:幾何均值濾波器有個致命的缺陷,那就是當窗口內像素只要有一個值爲0,則其計算獲得的值就是0,這在去去噪時表現的比較明顯,例如:

因爲噪聲的污染比較嚴重,在使用幾何均值濾波器去噪時,會獲得一塊黑色區域(灰度值爲0)。

加權的均值濾波器

// 取得窗口像素
            int sum = 0;
              int weightSum = 0;
            for (int a = -ksize / 2; a <= ksize / 2; a++)
            {
                for (int b = -ksize / 2; b <= ksize / 2; b++)
                {
                    auto weight = pow(2, ksize - abs(a) - abs(b) - 1);
                    weightSum += weight;
                    sum += weight * tmp.at<uchar>(i + a, j + b);
                }
            }
            auto pixel = static_cast<int>(sum / weightSum);
            if (pixel < 0)
                pixel = 0;
            else if (pixel > 255)
                pixel = 255;
            tmp.at<uchar>(i,j) = pixel;

主要是權值係數的計算,能夠發現必定的關係,和中心越近的其權值越高,具體公式:\(2^{ksize - a - b - 1},其中a,b爲和中心在x,y方向的距離\)

加權的均值濾波器去噪效果和均值濾波器至關,可是在保護圖像細節方面比均值濾波器效果要好,上圖是\(3 \times 3\)的濾波器,窗口較小,二者的區別不是較大。
下圖是\(7 \times 7\)的濾波器,對比就比較明顯了。

至於,其餘的幾種:諧波濾波器、逆諧波濾波器和\(Y_p\)均值濾波器,實現都差很少,代碼就再也不貼出了。

總結

均值濾波器可以去除均勻分佈和高斯分佈的噪聲,可是在過濾掉噪聲的同時,會對圖像形成必定的模糊,使用的窗口越大,形成的模糊也就越明顯。
根據計算均值方法的不一樣,有多種均值濾波,常用的是算術均值濾波器,計算簡單,可是對圖像形成的模糊交明顯;另外,有加權的均值濾波器,給窗口內的像素不一樣的係數,距離中心越近則係數越大。
使用加權的均值濾波器,去除噪聲的能力和算術均值濾波器至關,可是對圖像形成的模糊較輕,可以更好的保護圖像的細節。(上面已有對比)

幾何均值濾波器,在過濾噪聲的同時也能更好的保護圖像的細節,可是有個缺陷:在濾波的過程當中,窗口內的像素只要有一個爲0,則其得出的值就是0.

至於餘下的幾種,在可以去除高斯噪聲,而且對椒鹽噪聲也有必定的做用,具體以下:

  • 諧波均值濾波器 能過濾鹽粒噪聲,對胡椒噪聲無效
  • 逆諧波均值濾波器,當階數Q爲正時,能夠過濾胡椒噪聲;Q爲負時能夠過濾鹽粒噪聲。不能同時對椒鹽噪聲起做用。
  • \(Y_p\)均值濾波器, 和逆諧波均值濾波器相似。當P爲正時,可以過濾椒鹽噪聲;P爲負時,可以過濾鹽粒噪聲。
相關文章
相關標籤/搜索