圖像模糊



注:原創不易,轉載請務必注明原作者和出處,感謝支持!

一 什么是圖像模糊

圖像模糊是圖像處理中最簡單和常用的操作之一,其主要目的之一是給圖像預處理的時候降低圖像噪聲。比如,在大目標提取之前去除圖像中的一些瑣碎細節。圖像的模糊通常依靠圖像的卷積操作來實現。圖像模糊又被稱為平滑濾波。

常見的圖像模糊方法可以總結如下:
(1) 歸一化均值濾波器(API為blur()
(2) 高斯濾波器(API為GaussianBlur()
(3) 中值濾波器(API為medianBlur()
(4) 雙邊濾波器(API為bilateralFilter()


二 圖像模糊原理與實現

歸一化均值濾波
歸一化均值濾波是最簡單的濾波器,輸出像素值是對應核窗口內像素的均值(所有像素加權系數相等,當然也可以是不相等的)。該濾波器的核如下所示:

\[K=\frac{1}{K_{width} \cdot K_{height}} \begin{bmatrix} 1&1&1&...&1\\ 1&1&1&...&1\\ .&.&.&...&1\\ .&.&.&...&1\\ 1&1&1&...&1\\ \end{bmatrix} \]

OpenCV提供了歸一化均值濾波器API為blur()

void cv::blur(
	InputArray src,					// 原圖像
    OutputArray dst,				// 濾波后圖像
    Size ksize,						// 濾波器大小
    Point anchor = Point(-1, -1),	// 錨點位置,默認為卷積核的中心
    int borderType = BORDER_DEFAULT
);

下面是原圖和濾波器大小分別為3x3、7x7和11x11時的濾波效果

高斯濾波
二維高斯函數的公式為:

\[G(x,y) = Ae^{\frac{-(x-u_x)^2}{2\sigma_x^2} + \frac{-(y-u_y)^2}{2\sigma_y^2}} \]

和一維高斯函數一樣,中間像素\((x,y)\)的值是最大的,周邊像素的加權系數隨着它們遠離中間像素的距離增大而減小。

OpenCV中的高斯濾波器API的詳細信息如下:

void cv::GaussianBlur(
	InputArray src,						// 輸入圖像
    OutputArray dst,					// 輸出圖像
    Size ksize,							// 濾波器大小
    double sigmaX,						// 對應公式中的sigma X
    double sigmaY = 0,					// 對應公式中的sigma Y
    int borderType = BORDER_DEFAULT
);

下面是原圖和濾波器大小分別為3x3、7x7和11x11時的濾波效果(其中sigmaX和sigmaY均為5)

中值濾波
中值濾波原理比較簡單,其是將圖像中的每個像素用領域像素中的中值來代替。中值濾波對椒鹽噪聲有很好的抑制作用。OpenCV中提供了APImedianBlur()來完成中值濾波。

void cv::medianBlur(
	InputArray src,
    OutputArray dst,
    int ksize
);

下面是使用中值濾波去除椒鹽噪聲的實驗效果的原圖和濾波器大小分別為3、5、7時的實際濾波效果

雙邊濾波
雙邊濾波的原理。和加權均值濾波器的原理一樣,雙邊濾波的輸出像素值同樣是依賴領域像素的加權組合。

\[g(i,j) = \frac{\sum_{k,l}f(k,l)w(i,j,k,l)}{\sum_{k,l}w(i,j,k,l)} \]

區別在於,權重系數\(w(i,j,k,l)\)的選取。在雙邊濾波中,\(w(i,j,k,l)\)被設置為定義域核

\[d(i,j,k,l)=exp(- \frac{(i-k)^2+(j-l)^2}{2 \sigma_d^2}) \]

注意,該式子相當於是二維正態分布公式的簡化版。

和依賴於數據的值域核

\[r(i,j,k,l) = exp(- \frac{||f(i,j)-f(k,l)||^2}{2\sigma_r^2}) \]

的乘積,也即

\[w(i,j,k,l)=exp(- \frac{(i-k)^2+(j-l)^2}{2 \sigma_d^2} - \frac{||f(i,j)-f(k,l)||^2}{2\sigma_r^2}) \]

定量分析:
當像素差異大時(邊緣處),\(r(i,j,k,l) \rightarrow 0\),此時,高斯濾波效果將大大減弱。
當像素差異小時(非邊緣處),\(r(i,j,k,l) \rightarrow 1\),此時,高斯濾波效果幾乎不變。
因此,雙邊濾波具有較好的保邊效果。

OpenCV中提供了APIbilateralFilter()來完成雙邊濾波操作。

bilateralFilter(
	InputArray src,					// 輸入圖像
    OutputArray dst,				// 輸出圖像
    int d,							// 濾波過程中每個像素領域的直徑
    double sigmaColor,				// 顏色空間的sigma值
    double sigmaSpace,				// 坐標空間的sigma值
    int borderType = BORDER_DEFAULT
);

下面的實驗中,像素直徑d設為9,sigmaColor和sigmaSpace分別設為(50, 50)、(150, 150)、(200, 200)

請注意在實現效果圖中圖像邊緣的保持情況


三 參考文獻

(1) 《計算機視覺——算法與應用》
(2) 《數字圖像處理(第三版)》
(3) OpenCV Documentation


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM