【问题标题】:Why does adding Gaussian noise to image give white screen?为什么向图像添加高斯噪声会产生白屏?
【发布时间】:2018-11-11 12:04:54
【问题描述】:

我在下面添加的图像(water_coins.jpg)中添加了一些高斯噪声,但它返回给我一个完全白色的空白屏幕(对于“noi”和“hoho”)。我不知道为什么

import numpy as np
import cv2


def gauss_noise(image):
    row, col, ch = image.shape
    mean = 0
    var = 0.01
    sigma = var ** 0.5
    gauss = np.random.normal(mean, sigma, (row, col, ch))
    gauss = gauss.reshape(row, col, ch)
    print(image)
    cv2.imshow("hoho", gauss + image)
    noisy = image + gauss
    return noisy


img = cv2.imread('water_coins.jpg')
noi = gauss_noise(img)
cv2.imshow("Noisy Gauss image", noi)
cv2.imshow("ho", img)
cv2.waitKey()

【问题讨论】:

  • 浮点值中的图像必须从 0 到 1,您将图像 uint8 添加到图像浮点数......您需要进行饱和度(意味着 0 可以生成负值)然后您有将其转换为 np.uint (至少显示它)或将其标准化为 0-1 值。如果不是,任何大于 1 的值都将显示为白色
  • @api55 转换为 uint8 有效。谢谢
  • @api55 为什么要在评论中给出答案?我建议将您的评论移至实际答案,以便 OP 可以接受它,并且可以考虑回答这个问题。
  • @JonathonReinhart 我的错,我当时没有多少时间,只是发表了评论。但我现在添加它作为一个完整的答案:)

标签: python-3.x image opencv image-processing gaussian


【解决方案1】:

问题在于,当您将np.uint8 类型的图像添加到另一个浮点类型的图像时,它将产生一个浮点数组。通过documentation of imshow,您可以:

如果图像是32位浮点,像素值乘以255。即取值范围[0,1]映射到[0,255]。

这意味着任何大于 1.0 的值都是白色的,只有 0 是黑色的,在您的情况下,它们中的大多数都是白色的,因此是白色图像。

现在是解决方案:

  1. 将其转换为 uint8 -> 必须小心下溢(负数)和上溢(超过 255)。尝试双边截断,并决定如何处理小数部分(round、truncate、ceil)。

  2. 将数据标准化为 0-1 -> 取决于您要执行的操作,这可能很危险,因为它可能会改变颜色,例如,如果所有颜色都在 120-150 左右,您将进入标准化图像颜色,就像它是从 0 到 255 一样。

  3. 添加前将噪声数组转换为np.uint8,并使用cv2.add避免饱和问题(下溢和上溢)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 2013-10-14
    • 2016-02-07
    • 2013-04-07
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多