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