opencv3_note3:幾種常見的圖像噪聲以及去除方法(blur相應筆記)

1.噪聲

1-1:概念:

噪聲指的是存在於圖像中不必要的或者說是多餘的干擾信息,一般分爲外部噪聲和內部噪聲。

https://baike.baidu.com/item/%E5%9B%BE%E5%83%8F%E5%99%AA%E5%A3%B0/4116468?fr=aladdin

1-2:常見噪聲及介紹

1-2-1:椒鹽噪聲(脈衝噪聲)

由於傳感器在傳輸過程中產生了一定錯誤,在亮的地方存在黑色像素(胡椒噪聲),在暗的地方存在白色像素(鹽),因而在一張圖像上會隨機出現黑白雜點

1-2-2:隨機噪聲

在時間上隨機產生大量起伏,從而逐漸積累產生噪聲

1-2-3:高斯噪聲

該類噪聲的概率密度函數服從高斯分佈(正態分佈)的一類噪聲

(注:正態分佈,又稱常態分佈,記爲N(μ,σ^2),其中μ,σ^2爲分佈的參數,分別爲高斯分佈的期望和方差。當有確定值時,p(x)也就確定了,特別當μ=0,σ^2=1時,X的分佈爲標準正態分佈)

2.處理方式

在opencv3中,存在線性濾波器和非線性濾波器等概念 用來處理對應的噪聲,使用濾波操作平滑化圖像

下面介紹五種濾波器的使用方法

一般而言:椒鹽噪聲使用均值濾波解決,隨機噪聲使用中值濾波,高斯噪聲使用高斯濾波處理

 

//picture adress:C:\\Users\\ASUS\\Pictures\\opencv_Pirture\\1.jpg
//實現方框濾波 均值濾波和高斯濾波
//實現圖像的濾波操作,降噪;
//實現圖片濾波的目的:降低噪聲(由於傳感器的材料特性,工作環境 電子元器件的結構,導致圖像不清晰 ),通俗地來說 噪聲是引起較強視覺效果的孤立像素點或者像素塊 實現圖片的不清晰
//增加兩種非線性濾波方法
//1.中值濾波 雖然時間較長 但是可以有效的去除中值噪聲和椒鹽噪聲
//2.雙邊濾波 可以做邊緣保存 對低頻信息有較好的保存
//頭文件和命名空間
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//全局變量
Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3, g_dstImage4, g_dstImage5;
int g_nBoxFillerValue = 3;//方波濾波參數值
int g_nMeanBlurValue = 3;//均值濾波參數值
int g_nGaussianBlurValue = 3;//高斯濾波參數值
int g_nMedianblurValue = 10;//中值濾波參數值
int g_nBilateralFilterValue = 10;//雙邊濾波參數值

							 //設立回調函數
static void on_BoxFiller(int, void*);
static void on_MeanBlur(int, void*);
static void on_GaussianBlur(int, void*);
static void on_MedianBlur(int, void*);
static void on_BilateralFilterValue(int, void*);

//主函數
int main()
{
	system("color 09");
	g_srcImage = imread("C:\\Users\\ASUS\\Pictures\\opencv_Pirture\\2.jpg");
	if (!g_srcImage.data)
	{
		printf("讀取錯誤");
	}
	//clone the picture
	g_dstImage1 = g_srcImage.clone();
	g_dstImage2 = g_srcImage.clone();
	g_dstImage3 = g_srcImage.clone();
	g_dstImage4 = g_srcImage.clone();
	g_dstImage5 = g_srcImage.clone();

	//show the orign picture
//	namedWindow("原圖", 1);
	imshow("原圖", g_srcImage);
	
	//1.方形濾波
	namedWindow("方形濾波", 1);
	createTrackbar("內核值:", "方形濾波", &g_nBoxFillerValue, 40, on_BoxFiller);
	on_BoxFiller(g_nBoxFillerValue, 0);

	//2.均值濾波
	namedWindow("均值濾波", 1);
	createTrackbar("內核值:", "均值濾波", &g_nMeanBlurValue, 40, on_MeanBlur);
	on_MeanBlur(g_nMeanBlurValue, 0);

	//3.高斯濾波
	namedWindow("高斯濾波", 1);
	createTrackbar("內核值:", "高斯濾波", &g_nGaussianBlurValue, 40, on_GaussianBlur);
	on_GaussianBlur(g_nGaussianBlurValue, 0);
	//4.中值濾波
	namedWindow("中值濾波", 1);
	createTrackbar("內核值:", "中值濾波", &g_nMedianblurValue, 50, on_MedianBlur);
	on_MedianBlur(g_nMedianblurValue, 0);
	//5.雙邊濾波
	namedWindow("雙邊濾波", 1);
	createTrackbar("內核值:", "雙邊濾波", &g_nBilateralFilterValue, 50, on_BilateralFilterValue);
	on_BilateralFilterValue(g_nBilateralFilterValue, 0);

	cout << endl << "\t調整滾動條觀察效果" << endl;
	cout << "按q鍵退出程序" << endl;
	while (char(waitKey(27)) != 'q');//如果沒有按q 程序一直運行
	return 0;

}


//core  API

//on_BoxFiller
static void on_BoxFiller(int, void*)
{
	boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFillerValue + 1, g_nBoxFillerValue + 1));
	imshow("方形濾波", g_dstImage1);
}
//on_MeanBlur
static void on_MeanBlur(int, void*)
{
	blur(g_srcImage, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1), Point(-1, -1));//point(-1,-1);設定錨點爲中心
	imshow("均值濾波", g_dstImage2);
}
//on_GaussianBlur
static void on_GaussianBlur(int, void*)
{
	GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlurValue * 2 + 1, g_nGaussianBlurValue * 2 + 1), 0, 0);//0值爲sigmaX sigmaY
	imshow("高斯濾波", g_dstImage3);
}
//on_MeanBlur
static void on_MedianBlur(int, void*)
{
	medianBlur(g_srcImage, g_dstImage4, g_nMedianblurValue*2+1);//設置爲奇數值
	imshow("中值濾波", g_dstImage4);
}
static void on_BilateralFilterValue(int, void*)
{
	bilateralFilter(g_srcImage, g_dstImage5, g_nBilateralFilterValue, g_nBilateralFilterValue * 2, g_nBilateralFilterValue / 2);//sigmaX,sigmaY,sigmaZ(空間)
	imshow("雙邊濾波", g_dstImage5);
}





 

 

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