【5】OpenCV入門-圖像模糊去噪

1.圖像模糊去噪原理

圖像在採集、傳輸的過程中,因爲人爲或者系統的因素難免會產生噪聲。這時候就需要對圖像進行預處理降低噪聲。圖像模糊降噪的數學原理是圖像的卷積操作。假設有一幅6x6的圖像矩形。

在6x6的圖像像素矩陣上有一個紅色中心黃色邊框的3x3的窗口,從上到下,從左到右移動。3x3窗口每個位置都對應一個權重,當窗口移動到某一位置時,圖像像素矩陣對應像素與權重相乘並求和,將得到的值賦給中心像素。這樣就完成了圖像的模糊去噪。

其中3x3窗口稱爲卷積核,中心的紅色像素稱爲錨點。

2.濾波算法

(1)均值濾波

在均值濾波中各個像素的權重都相同,但均值濾波會印製邊緣,同時對於椒鹽噪聲的抑制也不理想。

OpenCV中均值濾波的函數爲blur()

函數原型:

參數說明:①src-輸入圖像,可以是多通道圖像

                   ②dst-輸出圖像

                   ③ksize-卷積核的大小,前面提到了3x3的卷積核,你還可以設置成5x5等。注意卷積核長寬要設置成奇數大小。

                   ④anchor-錨點位置。Point(-1,-1)表示讓OpenCV設置默認位置一般是中心點。

                    ⑤borderType-邊緣填充的方式,細心的同學一定注意到了上面進行圖像卷積的時候,邊緣的像素是無法計算的,這就需要對圖像的邊緣進行填充。OpenCV中填充邊緣的方式有如下幾種:

其中使用得比較多的是BORDER_CONSTANT、BORDER_REPLICATE和BORDER_DEFAULT。

BORDER_CONSTANT-設置像素的值,即用常像素填充

BORDER_REPLICATE-複製邊緣的像素並進行延申。

BORDER_DEFAULT-使用邊緣像素映射。

(2)高斯濾波

高斯函數介紹:

                                          

       

高斯函數服從正態分佈越靠近中心,值越大。從圖中可以看出  和對圖像的影響是 影響圖像波峯的位置,越大圖像的峯值越低,反之圖像峯值越高。上面介紹的是一維情況下的高斯函數,二維空間中的高斯函數同理:

                                                 

                              

從二維高斯函數可以看出越靠近中心值越大,對應圖像處理中,即越靠近中心錨點的像素所佔的權重越大。這樣處理的好處是可以保留一定的細節。

OpenCV中高斯濾波的函數爲:GaussianBlur()

函數原型:

參數說明:①sigmaX-二維高斯函數中的

                  ②sigmaY-二維高斯函數中的

(3)中值濾波

中值濾波是一種非線性的濾波方式,它對卷積窗口對應的像素進行排序,然後將排序後的像素中值賦值給錨點(中心點),這種處理方式有助於抑制椒鹽噪聲,一般椒鹽噪聲都是最大或者最小的像素值。

OpenCV中的中值濾波函數爲:medianBlur()

函數原型:

參數說明:ksize-窗口的長或寬,中值濾波中窗口一定是矩形,所有ksize只需要是一個int型的數據。

(4)雙邊濾波

前面介紹的濾波方式均值濾波、高斯濾波對服從高斯分佈或者均勻分佈的噪聲都有着很好的濾除作用,但是這兩種濾波方式也會抑制邊緣。雖然高斯濾波在均值濾波的基礎上有所改進,但是效果仍不理想,如是就有雙邊濾波的出現。雙邊濾波是在高斯濾波的基礎上改進的,雙邊濾波的權重不僅考慮了像素的歐式距離(像素距離中心點的距離),還考慮了像素範圍域的差異(考慮卷積核中心像素與其他像素的像素值差異)。在計算中心像素的時候同時考慮這兩個權重。

其中(x,y)是卷積核中除錨點外的點,f(x,y)是(x,y)點的像素,其它同高斯濾波,通過分析可以看出某點的像素和中心點像素差值越大則其在卷積核中佔的權重越小,那麼非邊緣像素對邊緣像素的影響就會變小,這就達到保留邊緣的作用。

從圖中可以看出,輸入的邊緣得到很好的保留,同時噪聲得到了很好的剔除。

OpenCV中的函數:bilateralFilter()

函數原型:

參數說明:①d-卷積核的尺寸。如果d的值爲負,則從sigmaSpace計算d的值。

                  ②sigmaColor,sigmaSpace-分別是值域和空間域的σ,對應與

3 代碼演示

#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
using namespace cv;
using namespace std;
#define DIRECTORY "E:/PrivateRepository/ProgramFolder/image/"
/***圖像模糊***/
int main()
{
	//【1】加載圖像
	string directory = "";
	directory = directory + DIRECTORY + "test.jpg";
	//1.讀取圖像
	Mat src = imread(directory);
	//2.判斷是否讀取正確
	if (src.empty())
	{
		printf("could not load the image");
		return -1;
	}
	//【2】創建圖像顯示窗口標題
	char srcTitle[] = "srcImage";
	char lineBlurTitle[] = "AvBlurImage";
	char gaussianBlurTitle[] = "gaussianBlurImage";
	char medianBlurTitle[] = "medianBlurImage";
	char bilateralBlurTitle[] = "bilateralBlurImage";
	//【3】模糊圖像blur
	Mat lineBlurImage;
	blur(src, lineBlurImage, Size(5, 5));
	//【4】高斯模糊GaussianBlur
	Mat gaussianBlurImage;
	GaussianBlur(src, gaussianBlurImage, Size(5, 5), 5, 5);
	//【5】中值模糊medianBlur
	Mat medianBlurImage;
	medianBlur(src, medianBlurImage, 5);
	//【6】雙邊模糊bilateralFilter
	Mat bilateralBlurImage;
	bilateralFilter(src, bilateralBlurImage, 5, 100, 11);
	//【7】顯示圖像
	imshow(srcTitle, src);
	imshow(lineBlurTitle, lineBlurImage);
	imshow(gaussianBlurTitle, gaussianBlurImage);
	imshow(medianBlurTitle, medianBlurImage);
	imshow(bilateralBlurTitle, bilateralBlurImage);
	waitKey(0);
	destroyAllWindows();
	return 0;
}

從圖中可以看出中值濾波對椒鹽噪聲的濾除效果最好,雙邊濾波很好得濾除了噪聲同時保留了邊緣。

總結:

高斯分佈或者均勻分佈的噪聲可以使用均值濾波、高斯濾波和雙邊濾波。雙邊濾波對邊緣保留效果最好,適合邊緣較多的圖像,但是運行速度會比較慢。均勻和高斯濾波對邊緣的保留不怎麼好,但是速度快點,其中高斯濾波對邊緣的保留效果較好一點。

椒鹽噪聲只有用中值濾波比較好。

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