添加两个 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] 范围内浮点并从那里开始工作。
我正在尝试使用 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 按照此堆栈溢出线程中的说明工作 ->