【问题标题】:Unable to write a valid binary threshold image in opencv (python)无法在opencv(python)中写入有效的二进制阈值图像
【发布时间】:2018-04-17 07:44:41
【问题描述】:

我正在尝试将 RGB 图像转换为 YUV 空间,然后尝试添加颜色阈值以创建二进制图像。

我这样做如下:

img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)

b_channel = cv2.cvtColor(img, cv2.COLOR_RGB2Lab)[:, :, 2]
l_channel = cv2.cvtColor(img, cv2.COLOR_RGB2LUV)[:, :, 0]
s_channel = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)[:, :, 2]

s_binary = np.zeros_like(s_channel)
s_binary[(s_channel > s_thresh_min) & (s_channel <= s_thresh_max)] = 1

b_binary = np.zeros_like(b_channel)
b_binary[(b_channel > b_thresh_min) & (b_channel <= b_thresh_max)] = 1

l_binary = np.zeros_like(l_channel)
l_binary[(l_channel > l_thresh_min) & (l_channel <= l_thresh_max)] = 1

combined_binary = np.zeros_like(b_binary)
combined_binary[(l_binary == 1) | (b_binary == 1) | (s_binary == 1)] = 1
f, ax1 = plt.subplots(1, 1, figsize=(10, 5))

ax1.imshow(combined_binary)

这一切都很好,我可以在屏幕上看到二进制图像。

但是,当我尝试使用 cv2.imwrite 将其保存在磁盘上时,我得到一个黑色图像。

cv2.imwrite(file_name, combined_binary)

我真的很困惑为什么 imshow 和 imwrite 之间会发生这种变化。

有什么提示吗?

谢谢

【问题讨论】:

  • 我很困惑,为什么将它传递给 YUV,然后再传递给其他 3 个颜色空间(来自 RGB 而不是 YUV)?紫色和黄色的图像是combined_binary 吗?什么是filename 分机? combined_binary 是 np.uint8` 类型的吗?
  • 我只是在尝试转换成不同的色彩空间。我什至尝试只使用 RGB(YUV 没有颜色)但同样的问题。
  • “我得到一张黑色图像。” ——不,你没有。您会使用 2 种颜色获得图像——全黑(强度 0)和“稍微不那么全黑”(强度 1)。当然,这些对于人类来说是很难通过视觉来区分的。这两个函数的不同行为是由于它们的不同意图。一个用于按原样存储图像,另一个用于将其可视化,以便人类可以清楚地看到它(因此是假色)。
  • 是的,你是对的。正如下面答案中所建议的,我将 numpy 数组乘以 255 并且能够看到图像。我只是想确保后处理步骤有效并且我得到一个有效的图像,然后再将它提供给网络。谢谢你的建议。
  • @blackbug 这就是我询问类型的原因。可能它是一个浮点数,它的值从 0.0-1.0 。或者可能是因为是二进制的......它是真值或假值(在很多情况下是 0 和 1)

标签: python opencv computer-vision


【解决方案1】:

可能需要将您的输出数组乘以 255。阈值通常返回 0 和 1。不确定 opencv,但我在使用其他软件包时遇到了类似的问题。它可能看起来是黑色的,但实际上是 0 和 1。

【讨论】:

  • 谢谢。你说的对。我将它乘以 255 并且能够看到像素。
猜你喜欢
  • 1970-01-01
  • 2020-03-23
  • 2016-11-15
  • 1970-01-01
  • 2012-01-15
  • 2020-12-16
  • 2015-09-01
  • 1970-01-01
  • 2021-02-10
相关资源
最近更新 更多