【问题标题】:Unexpected output image while adding two numpy array添加两个numpy数组时出现意外的输出图像
【发布时间】:2019-05-23 16:07:47
【问题描述】:

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

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

【问题讨论】:

  • 您的代码根本没有使用noise 变量。
  • 哦,是的,我在写我的问题时实际上错过了那行代码。谢谢你指出这一点。我已经纠正了。你现在能找出问题所在吗?
  • 如果将1 更改为0.1 会怎样?
  • fast 是一个浮点数组。 cv2.imshow 期望浮点数组的值在 [0, 1] 范围内。试试cv2.imshow('Noisy', fast/fast.max())
  • 另请注意,np.random.normal(0, 1, (row, col)) 将包含负值,这意味着 fast + noise 可能具有负值。这就是你想要的吗?

标签: python-3.x numpy opencv4android


【解决方案1】:

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

试试这个

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

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

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

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

【讨论】:

  • 是的,它解决了问题。但是我不能只使用数据类型 float 的 numpy 数组来查看图像吗?请澄清。
  • imshow 按照此线程中的说明工作-> stackoverflow.com/questions/48331211/…。因此,您应该决定是使用 [0, 1] 范围内的浮点图像还是 [0, 255] 范围内的 uint8 图像或具有更大整数范围的 uint16/uint32 图像。由于随机函数在浮点范围 [0, 1] 上生成,我建议您通过将图像除以 255.0 来转换图像,使其在 [0, 1] 浮点范围内并从那里开始工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2022-01-10
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多