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
#include
#include
#include
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);
}





 

 

opencv3_note3:几种常见的图像噪声以及去除方法(blur相应笔记)_第1张图片

你可能感兴趣的:(opencv3)