一、编程环境:
OpenCV | 4.1.0 |
IDE | Visual Studio 2017 Enterprise (15.9.13) |
操作系统 | Windows 10 x64 中文专业版 (1903) |
二、图像噪声:
图像噪声产生的原因很复杂,有的可能是数字信号在传输过程中发生了丢失或者受到干扰,有的是成像设备或者环境本身导致成像质量不稳定,反应到图像上就是图像的亮度与颜色呈现某种程度的不一致性。
从噪声的类型上,常见的图像噪声分为以下几种:
- 椒盐噪声
是一种随机在图像中出现的稀疏分布的黑白像素点, 对椒盐噪声一种有效的去噪手段就是图像中值滤波。
- 高斯噪声/符合高斯分布
一般会在数码相机的图像采集(acquisition)阶段发生,这时它的物理、电、光等各种信号都可能导致产生高斯分布噪声。
- 均匀分布噪声
均匀/规则噪声一般都是因为某些规律性的错误导致的。
三、程序说明:
本示例程序通过代码生成两种图像噪声:椒盐噪声、高斯噪声。
- 生成图像椒盐噪声函数:
void salt_pepper_noise(Mat &image);
- 生成图像高斯噪声函数:
void gaussian_noise(Mat &image);
四、程序代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void salt_pepper_noise(Mat &image);
void gaussian_noise(Mat &image);
int main(int argc, char** argv) {
Mat src = imread("../images/test.jpg");
if (src.empty()) {
printf("不能打开图像!\n");
return -1;
}
namedWindow("1--原图", WINDOW_AUTOSIZE);
imshow("1--原图", src);
Mat src_noise = src.clone();
// 图像加入椒盐噪声
salt_pepper_noise(src);
// 图像加入高斯噪声
gaussian_noise(src_noise);
waitKey(0);
return 0;
}
// 椒盐噪声
void salt_pepper_noise(Mat &image) {
RNG rng(123456);
int h = image.rows;
int w = image.cols;
int nums = 5000;
for (int i = 0; i < nums; i++) {
// 生成噪声点
int x = rng.uniform(0, w);
int y = rng.uniform(0, h);
// 把噪声点写到图像上
if (i % 2 == 1) {
image.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
}
else {
image.at<Vec3b>(y, x) = Vec3b(0, 0, 0);
}
}
imshow("2--椒盐噪声", image);
}
// 高斯噪声
void gaussian_noise(Mat &image) {
// 生成噪声
Mat noise = Mat::zeros(image.size(), image.type());
randn(noise, (15, 15, 15), (30, 30, 30));
// 把噪声加到图像上
Mat dst;
add(image, noise, dst);
imshow("3--高斯噪声", dst);
}