这是我的问题:我正在尝试创建一个简单的程序,将高斯噪声添加到输入图像。唯一的限制是输入图像的类型为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]上,
input + noise
大约有92%的机会在[0,1]范围之外。因此,您的饱和图像将大部分为黑白图像,而输入图像对结果几乎没有影响。
关于opencv - OpenCV-高斯噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24581587/