ab1*_*123 3 opencv image image-processing gaussian python-3.x
我在下面添加的图像(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()
Run Code Online (Sandbox Code Playgroud)
问题是,当您将一个类型np.uint8为 float的图像添加到另一个类型为 float 的图像时,它将导致一个 float 数组。通过imshow的文档,你有:
如果图像是 32 位浮点数,则像素值乘以 255。即值范围 [0,1] 映射到 [0,255]。
这意味着任何大于 1.0 的值都是白色的,只有 0 是黑色的,在你的情况下,它们中的大部分都是白色的,因此是白色的图像。
现在解决方案:
将其转换为 uint8 -> 您必须小心下溢(负数)和溢出(超过 255)。尝试两侧截断,并决定如何处理小数部分(舍入、截断、ceil)。
将数据标准化为 0-1 -> 取决于您想要执行的操作,这可能很危险,因为它可能会改变颜色,例如,如果所有颜色都在 120-150 左右,您将获得标准化的图像颜色,就好像它一样是从 0-255。
将噪声数组转换为np.uint8添加前,并使用 cv2.add 避免饱和问题(下溢和溢出)