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

Unexpected output image while adding two numpy array

我正在尝试使用 opencv-python 向我的图像添加高斯噪声。我已经创建了噪声函数,但是将噪声函数添加到图像会产生意想不到的结果。

我使用 numpy.random 中的正态高斯分布创建了一个噪声函数。然后在调整噪声函数的大小后,我将它添加到我的 image.I 尝试打印数组。总和在 [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()

在上述代码的结果中,我得到了一张褪色的图像,只有一些区域稍微可见。

您正在将图像加载为 uint8,但在对浮点数求和时得到一个浮点数。为了看到结果,您需要再次将其转换为 int。

试试这个

cv2.imshow('Noisy', fast.astype(np.uint8))

当然,只有当噪声大到足以使像素值从一个整数跳到下一个整数时,您才会得到值的变化。

作为替代方案,您可以使用 scikit-image 在 [0,1] 或 [-1, 1] 范围内工作,这通常使用这些其他约定。

[补充说明] cv2.imshow 按照此堆栈溢出线程中的说明工作 -> 因此,您应该决定是否使用 [0, 1] 范围内的浮点图像或 [0, 255] 范围内的 uint8 图像或具有更大整数范围的 uint16/uint32 图像。由于随机函数通常在 0 左右的小浮点范围内生成,我建议您通过将图像除以 255.0 来转换图像,使其在 [0, 1] 范围内浮点并从那里开始工作。