我在下面添加了一些高斯噪声(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 :(得分:3)
问题在于,当您将类型为np.uint8
的图像添加到另一个类型为float的图像时,将生成一个float数组。通过documentation of imshow你有:
如果图像是32位浮点,则像素值乘以255.即,值范围[0,1]映射到[0,255]。
这意味着任何大于1.0的值都将为白色,只有0将为黑色,在您的情况下,大多数将为白色,因此为白色图像。
现在解决方案:
将其转换为uint8 - >您必须小心下溢(负数)和溢出(超过255)。尝试双面截断,并决定如何处理小数部分(圆形,截断,细胞)。
将数据标准化为0-1 - >取决于你想要做什么,这可能是危险的,因为它可能会改变颜色,例如,如果所有颜色都在120-150左右,你将得到标准化的图像颜色,就像它是0-255。
在添加之前将噪声数组转换为np.uint8
,并使用cv2.add来避免饱和问题(下溢和溢出)