我正在尝试使用opencv-python将高斯噪声添加到我的图像中。我已经创建了噪波函数,但是将噪波函数添加到图像会产生意外的结果。
我使用numpy.random中的正态高斯分布创建了一个噪声函数。然后调整噪声函数的大小后,将其添加到图像中,然后尝试打印数组。总和在间隔[0,255]中,但是图像的某些部分也会被洗掉。我也尝试打印数组的数据类型。最初是uint8,后来是float64(我认为那没有什么不同)。
import numpy as np
import cv2
fast = cv2.imread('Fast8.jpg', 0)
row, col = fast.shape
noise = np.random.normal(0, 1, (row, col))
fast = fast + noise
cv2.namedWindow('Noisy', cv2.WINDOW_NORMAL)
cv2.imshow('Noisy', fast)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上代码的结果是,我得到的图像褪色,只有一些区域可见。
答案 0 :(得分:1)
您正在将图像加载为uint8,但是在对float求和时,会得到一个float。为了查看结果,您需要再次将其转换为int。
尝试一下
cv2.imshow('Noisy', fast.astype(np.uint8))
当然,只有在噪声大到足以使像素值从一个整数跳到下一个整数时,您才会获得值的更改。
作为替代方案,您可以使用scikit-image在[0,1]或[-1,1]范围内工作,而scikit-image通常使用其他约定。
[额外说明] cv2.imshow按照此堆栈溢出线程中的解释进行工作-> LINK 因此,您应该决定是否使用[0,1]范围内的浮动图像或[0,255]范围内的uint8图像或整数范围较大的uint16 / uint32图像。由于随机函数通常在0左右的较小浮动范围内生成,因此建议您通过将图像除以255.0来转换图像,以使其在[0,1]浮动范围内并从那里开始工作。