opencv对图像进行滤波(opencv c++ 图像噪声及去噪)
1 、噪声类型及生成
1.1 、类型
高斯噪声 、椒盐噪声 、泊松噪声 、乘性噪声 ,等 。
具体解释参考:(31条消息) 图像噪声简介_yeler082的博客-CSDN博客_图像噪声
高斯噪声 泊松噪声
乘性噪声 椒盐噪声
原图
1.2 、来源
图像获取过程中
两种常用类型的图像传感器CCD和CMOS采集图像过程中 ,由于受传感器材料属性 、工作环境 、电子元器件和电路结构等影响 ,会引入各种噪声 ,如电阻引起的热噪声 、场效应管的沟道热噪声 、光子噪声 、暗电流噪声 、光响应非均匀性噪声 。
图像信号传输过程中
由于传输介质和记录设备等的不完善 ,数字图像在其传输记录过程中往往会受到多种噪声的污染 。另外 ,在图像处理的某些环节当输入的对象并不如预想时也会在结果图像中引入噪声 。
生成椒盐噪声:
void QuickDemo::noise_img(Mat& image) { Mat img; image.copyTo(img); //产生椒盐噪声 RNG rng(12345); int h = img.rows;//行数 int w = img.cols;//列数 int nums = 10000;//噪点个数定义 //通过循环随机在图像上任意点生加上黑白噪声(生成概率相同) for (auto i = 0; i < nums; ++i) { //图像随机点坐标生成 int x = rng.uniform(0, w); int y = rng.uniform(0, h); if (i % 2 == 1) { img.at<Vec3b>(y, x) = Vec3b(255, 255, 255); } else img.at<Vec3b>(y, x) = Vec3b(0, 0, 0); } namedWindow("椒盐噪声", WINDOW_FREERATIO); imshow("椒盐噪声", img); }生成高斯噪声:
利用现有API
randn(inputMat, 与输入图像相同维度的均值 ,与输入图像相同维度的方差);
inputMat——在生成噪声图像时的输入矩阵为与原始图像大小类型均相同的空矩阵 。
void QuickDemo::noise_img(Mat& image) { //产生高斯噪声 Mat noise = Mat::zeros(image.size(), image.type()); randn(noise, (25, 25, 25), (30, 30, 30));//生成噪声图像 Mat dst; add(noise, image, dst); namedWindow("高斯噪声", WINDOW_FREERATIO); imshow("高斯噪声", dst); }参考:(31条消息) 图像噪声简介_yeler082的博客-CSDN博客_图像噪声
2、去除噪声
2.1 、中值滤波
将异常像素点取其周围一层或多层像素点 ,进行排列 ,将排列后的中值取代异常像素点值 。
常用于去除椒盐噪声(因为椒盐噪声是在图像上均匀随机产生的极限像素点值) ,但当异常点占原图大部分时就会无效果 。
opencvAPI
mediaBlur(input ,output , kernelSize);
kernelSize——卷积核大小 ,int型;
代码:
Mat dst; medianBlur(img, dst, 5); namedWindow("中值滤波", WINDOW_FREERATIO); imshow("中值滤波", dst);2.2 、高斯滤波
顾名思义 ,对高斯噪声效果较好
GaussianBlur(dst2, dst, Size(5, 5), 0); namedWindow("高斯滤波", WINDOW_FREERATIO); imshow("高斯滤波", dst);2.3、边缘保留滤波(EPF)
a)高斯双边滤波
API
d——双边模糊近邻选用像素点半径,和sigmaSpace一起控制卷积核大小 ,如果为0 ,则只由sigmaSpace制卷积核大小 。
sigmaColor——双边模糊颜色阈值,像素值大于该值的像素点将被处理 。
sigmaSpace——双边模糊空间阈值 ,控制卷积核大小 。
bilateralFilter(img, dst, 0, 100, 10);b)非局部均值滤波
对像素点进行处理时 ,对周围像素点赋予权值 ,像素值相近的周边点赋予较高权值 ,像素值差距大的赋予较低权值 。
API
官网OpenCV: Denoising
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!