这是我的问题:我正在尝试创建一个简单的程序,它将高斯噪声添加到输入图像。唯一的限制是输入图像的类型为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 :(得分: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]。因此,您的饱和图像将主要为黑色和白色,输入图像对结果的影响很小。