添加两个Numpy数组时出乎意料的输出图像



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

在上述代码的结果中,我得到的图像被清洗了,只有一些区域略微可见。

您将图像加载为UINT8,但是当浮动时,您会浮出水面。为了查看结果,您需要再次将其施放为int。

尝试这个

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

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

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

[额外澄清]cv2.imshow工作如此堆栈溢出线程所述 ->链接因此,您应该确定在[0,1]中使用的浮动图像是[0,2]中的UINT8图像[0,255]或UINT16/UINT32图像具有较大整数范围的图像。由于随机函数通常会在0左右的小浮子范围内生成,我建议您通过将图像除以255.0将其转换为255.0,以将其在[0,1] float范围内并从那里进行工作。