【问题标题】:OpenCV - Gaussian NoiseOpenCV - 高斯噪声
【发布时间】:2014-08-26 05:21:42
【问题描述】:

这是我的问题:我正在尝试创建一个简单的程序,将高斯噪声添加到输入图像中。唯一的限制是输入图像的类型为 CV_64F(即双精度),并且值必须保持在 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 之间进行归一化,并且在添加噪声之后也必须保持不变。

提前谢谢你。

【问题讨论】:

    标签: opencv normalization gaussian noise


    【解决方案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 的噪声方差非常大,这意味着 input + noise 有大约 92% 的可能性会超出范围 [0, 1],假设输入均匀分布在 [0, 1] ]。所以你的饱和图像将主要是黑白的,输入图像对结果的影响很小。

    【讨论】:

    • 非常感谢您的帮助。您的代码有效,我只需要对彩色图像进行一次小的调整。我没有使用clamp_1和clamp_0,而是将其更改为: input = cv::max(input, 0);输入 = cv::min(输入, 1);因为当第二个参数是标量时,每个通道都会进行最小和最大比较。我不确定你解释的第一部分是否正确,对不起。如果我们尝试限制高斯分布(例如,在 0,1 中),我们将不再从高斯分布中获取随机数。另一方面,为什么我们不能在添加噪声后对结果进行归一化?
    • 实际上,通过将方差更改为更小的值,如果我使用我在第一篇文章中编写的代码的第二个版本(带有规范化行的那个),图像会实际显示,只是它看起来更暗。怎么了?
    • @user3438376 认为您的像素只有 4 个像素 = [1 0.8 0.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 在不知道最亮和最暗像素的值的情况下,无法说出三个单独的像素会发生什么。
    猜你喜欢
    • 2016-02-07
    • 2016-08-17
    • 2014-09-23
    • 1970-01-01
    • 2013-01-04
    • 2017-10-11
    • 2021-12-07
    • 2011-09-12
    • 2011-12-08
    相关资源
    最近更新 更多