为什么在图像中添加高斯噪声会产生白屏?

时间:2018-06-01 10:53:27

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

我在下面添加了一些高斯噪声(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()

Water_coins.jpg

1 个答案:

答案 0 :(得分:3)

问题在于,当您将类型为np.uint8的图像添加到另一个类型为float的图像时,将生成一个float数组。通过documentation of imshow你有:

  

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

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

现在解决方案:

  1. 将其转换为uint8 - >您必须小心下溢(负数)和溢出(超过255)。尝试双面截断,并决定如何处理小数部分(圆形,截断,细胞)。

  2. 将数据标准化为0-1 - >取决于你想要做什么,这可能是危险的,因为它可能会改变颜色,例如,如果所有颜色都在120-150左右,你将得到标准化的图像颜色,就像它是0-255。

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