图像去噪声:
图像去噪声在OCR、机器人视觉与机器视觉领域应用开发中是重要的图像预处理手段之一,对图像二值化与二值分析很有帮助,OpenCV中常见的图像去噪声的方法有:
- 均值模糊去噪声
- 高斯模糊去噪声
- 中值滤波去噪声
- 非局部均值去噪声
- 双边滤波去噪声
- 形态学去噪声
均值、高斯、中值去噪在前面几个章节都已经介绍过了,今天主要介绍非局部均值去噪声及其API函数。
非局部均值去噪声:
考虑图像中一个小的窗口(5 x 5),有很大可能图像中的其他区域也存在一个相似的窗口。有时这个相似窗口就在邻域周围。如果我们找到这些相似的窗口并取他们的平均值会怎样呢?对于特定的窗口这样做往往会取得意想不到的效果。
上图中的蓝色窗口看起来是相似的,绿色窗口看起来也是相似的。所以我们可以选取包含目标像素的一个小窗口,然后在图像中搜索相似的窗口,最后求取所有窗口的平均值,并用这个值取代目标像素的值。这种方法就是非局部平均值去噪。
非局部均值去噪去噪效果很好,但通常会耗费相当可观的时间。
相关API:
适用于彩色图像的:
void fastNlMeansDenoisingColored( InputArray src, OutputArray dst,
float h = 3, float hColor = 3,
int templateWindowSize = 7, int searchWindowSize = 21 );
- src:输入一张8-bit,3-channel的图像
- dst:输出图像要求与输入通信有相同的尺寸和大小
- h:亮度元件参数调节滤波器强度。较大的h值可以很好地去除噪声,但也可能去除图像细节;较小的h值可以保留细节,但也可能保留一些噪声;
- hColor:hColor 与 h 相同,但适用于颜色组件。对于大多数图像,值等于10就足以消除彩色噪声,而不会扭曲颜色;
- templateWindowSize:用于计算权重的模板补丁的像素大小。应该是奇数。推荐值7像素;
- searchWindowSize:用于计算给定像素加权平均值的窗口的像素大小。应该是奇数。线性影响性能:更大的搜索窗口大小-更大的去噪时间。推荐值21像素。
#ifndef DAY25
#define DAY25
#include
#include
using namespace std;
using namespace cv;
void gaussian_noise(Mat &image);
void day25() {
Mat src = imread("G:/opencvTest/girl2.jpg");
if (src.empty()) {
printf("could not load image...\n");
return;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
gaussian_noise(src);
Mat result1, result2, result3, result4;
blur(src, result1, Size(5, 5));
imshow("均值滤波", result1);
GaussianBlur(src, result2, Size(5, 5), 0);
imshow("高斯滤波", result2);
medianBlur(src, result3, 3);
imshow("中值滤波", result3);
fastNlMeansDenoisingColored(src, result4, 15, 15, 10, 30);
imshow("非局部均值滤波", result4);
waitKey();
}
void gaussian_noise(Mat &image) {
Mat noise = Mat::zeros(image.size(), image.type());
// 通过randn产生高斯随机噪声来填充矩阵,15是高斯均值,30是高斯方差
randn(noise, 15, 30);
Mat dst;
add(image, noise, dst);
imshow("gaussian noise", dst);
dst.copyTo(image);
}
#endif // !DAY25
原图来源于网络,侵权速删~