Python 3.x 为什么在图像中加入高斯噪声会产生白屏?

Python 3.x 为什么在图像中加入高斯噪声会产生白屏?,python-3.x,image,opencv,image-processing,gaussian,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

我在下面添加的图像(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()

问题在于,当您将
np.uint8
类型的图像添加到另一个float类型的图像时,将产生一个float数组。到目前为止,您已经知道:

如果图像是32位浮点,则像素值将乘以255。也就是说,值范围[0,1]被映射到[0255]

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

现在谈谈解决办法:

  • 将其转换为uint8->您必须小心下溢(负数)和溢出(超过255)。尝试双侧截断,并决定如何处理小数部分(舍入、截断、ceil)

  • 将数据规格化为0-1->取决于您想要执行的操作,这可能是危险的,因为它可能会更改颜色,例如,如果所有颜色都在120-150之间,您将获得规格化图像颜色,就像它是从0-255

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


  • 浮点值中的图像必须介于0-1之间,将图像uint8添加到图像浮点。。。。您需要进行饱和(平均值0可以生成负值),然后必须将其转换为np.uint(至少要显示它)或将其规格化为0-1值。否则,任何大于1的值都将显示为white@api55转换到uint8成功了。Thanks@api55为什么要在评论中给出答案?我建议将你的评论转移到实际答案上,这样OP就可以接受它,这个问题就可以被认为已经得到了回答。@JonathonReinhart我的错,我当时时间不多,只是发布了评论。但我现在把它作为一个完整的答案加了进去:)