Opencv 高斯噪声

Opencv 高斯噪声,opencv,normalization,gaussian,noise,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的范围。

这是我的问题:我试图创建一个简单的程序,将高斯噪声添加到输入图像中。唯一的限制是输入图像的类型为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之间标准化,并且在添加噪波之后也必须保持相同


提前谢谢。

您的问题是高斯噪声可以具有任意振幅,并且不能在[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,1]上,
输入+噪声
将超出范围[0,1]的可能性约为92%。因此,您的饱和图像大部分是黑白的,而输入图像对结果几乎没有影响。

非常感谢您的帮助。你的代码运行正常,我只需要对彩色图像做一个小的调整。我没有使用clamp_1和clamp_0,而是将其更改为:input=cv::max(input,0);输入=cv::min(输入,1);因为当第二个参数是标量时,每个通道都会进行最小和最大比较。对不起,我不确定你解释的第一部分是否正确。如果我们试图限制高斯分布(例如,在0,1中),我们不再从高斯分布中获取随机数。另一方面,为什么我们不能在添加噪声后对结果进行标准化呢?实际上,通过将方差更改为更小的值,如果我使用我在第一篇文章中编写的代码的第二个版本(带有标准化行的版本),图像将实际显示,只是看起来更暗。怎么了?@ USER 34 38 76认为你只有一个像素,只有4个像素= [ 1,0.8,0,0.2 ]。现在假设我们将噪声添加到图像中的一个像素,因此它是[1 2 0.4 0.2]。然后,当对图像进行规格化时,会得到[0.5 1 0.2 0.1],图像会变暗。显然,这是一个人为的情况,它更容易使情况下,图像变得更轻。会发生什么在很大程度上取决于图像是什么-亮的图像会变得更暗,暗的图像会变得更亮。我想我知道错在哪里:1)我第一篇文章中的标准偏差太高,给出的值超出了0,1。2) 图像变得“更暗”与标准化本身有关,与噪声无关。这就是我所做的。我有一个标准化为0,1的图像,这里是它的一些强度值:0.466111,0.533333,0.523333。如果我对这张图像应用另一个0,1的标准化,那么强度是如何变化的:0.830295,1,0.974755。他们改变了,导致图片改变!它是如何从0.466111传递到0.830295的?通常的标准化公式在这里不起作用。知道吗?@user3438376如果不知道最亮和最暗像素的值,就不可能说出三个单独像素的情况。