OpenCV - 高斯噪声

时间:2014-07-04 23:16:26

标签: opencv normalization gaussian noise

这是我的问题:我正在尝试创建一个简单的程序,它将高斯噪声添加到输入图像。唯一的限制是输入图像的类型为CV_64F(即double),并且值必须在0和1之间保持标准化。

我写的代码如下:

Mat my_noise;
my_ noise = Mat (input.size(), input.type());

randn(noise, 0, 5); //mean and variance

input += noise;

上述代码不起作用,生成的图像无法正常显示。我认为这是因为它超出了0,1范围。我修改了这样的代码:

Mat my_noise;
my_ noise = Mat (input.size(), input.type());

randn(noise, 0, 5); //mean and variance

input += noise;

normalize(input, input, 0.0, 1.0, CV_MINMAX, CV_64F);

但它仍然无效。同样,生成的图像无法正确显示。问题出在哪儿?请记住:输入图像的类型为CV_64F,并且在添加噪声之前将值归一化在0和1之间,并且在添加噪声之后也必须保持这样。

提前谢谢。

1 个答案:

答案 0 :(得分:3)

您的问题是高斯噪声可能具有任意幅度,无法在[0,1]中表示。添加噪声后重新正规化是一个错误,因为只有一个大的噪声值会影响整个图像。

在添加噪声时,您需要做的是饱和图像,将大于1.0的值钳制为1.0,将小于0.0的值钳制为0.0。

这样的东西
cv::Mat noise(input.size(), input.type());
cv::randn(noise, 0, 5); //mean and variance
input += noise;

cv::Mat  clamp_1 = cv::Mat::ones(input.size(), input.type());
cv::Mat  clamp_0 = cv::Mat::zeros(input.size(), input.type());
input = cv::max(input, clamp_0);
input = cv::min(input, clamp_1);

同样,噪声方差为5非常大,这意味着假设输入均匀分布在[0]上,input + noise将超出范围[0,1]的概率大约为92%。 ,1]。因此,您的饱和图像将主要为黑色和白色,输入图像对结果的影响很小。