【OpenCV 4】图像噪声

一、编程环境:

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


五、运行效果:

猜你喜欢

转载自blog.csdn.net/kingkee/article/details/93617051