Python 3.x 为什么在图像中加入高斯噪声会产生白屏?
我在下面添加的图像(water_coins.jpg)中添加了一些高斯噪声,但它返回给我一个完全白色的空白屏幕(对于“noi”和“hoho”)。我不明白为什么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
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是黑色的,在您的情况下,大多数值都是白色的,因此是白色图像
现在谈谈解决办法:
np.uint8
,并使用cv2.add避免饱和问题(下溢和溢出)浮点值中的图像必须介于0-1之间,将图像uint8添加到图像浮点。。。。您需要进行饱和(平均值0可以生成负值),然后必须将其转换为np.uint(至少要显示它)或将其规格化为0-1值。否则,任何大于1的值都将显示为white@api55转换到uint8成功了。Thanks@api55为什么要在评论中给出答案?我建议将你的评论转移到实际答案上,这样OP就可以接受它,这个问题就可以被认为已经得到了回答。@JonathonReinhart我的错,我当时时间不多,只是发布了评论。但我现在把它作为一个完整的答案加了进去:)