添加两个Numpy数组时出现意外的输出图像

时间:2019-05-22 13:10:03

标签: python-3.x numpy opencv4android

我正在尝试使用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()

以上代码的结果是,我得到的图像褪色,只有一些区域可见。

1 个答案:

答案 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]浮动范围内并从那里开始工作。