【问题标题】:CV2 not displaying colors when converting to uint8转换为 uint8 时 CV2 不显示颜色
【发布时间】:2018-11-18 02:18:36
【问题描述】:

我有一个 python 列表,其中包含表示为 int32 的 PNG 图像的 RGBA 数据,该数据是从 Java 套接字服务器发送过来的。

此数据的示例输出为 numpy 数组,没有任何转换:

[[-12763847 -12763847 -12763847 ...  -5590160 -12039396 -12434915]
 [-12763847 -12763847 -12763847 ...  -6643102 -12828909 -12830184]
 [-12763847 -12763847 -12763847 ...  -8419763 -13487094 -12435167]]

当然,CV2 接受 uint8 作为数据类型(显示为 int32 会显示黑屏),因此我将列表转换为带有 dtype = np.uint8 的 numpy 数组,其内容如下:

image_data = np.array(data_list, dtype = np.uint8)

此示例输出:

[[ 57  57  57 ... 112  28  29]
 [ 57  57  57 ...  98  19  24]
 [ 57  57  57 ...  77  10  33]]

但是,当我使用显示图像时

cv2.imshow("Image", image_data)

我得到一个显示图像的窗口,但是是灰度的;它没有颜色。

如何防止颜色被忽略?

【问题讨论】:

  • 仔细查看整数。的字节将包含颜色信息。有效地摆脱其中两个只会给你蓝色通道。

标签: python numpy cv2 rgba


【解决方案1】:

希望这将帮助您了解如何从 32 位值中提取红色、绿色和蓝色通道。我从数组的第一行开始。

im=np.array([-12763847,-12763847,-12763847,-5590160,-12039396,-12434915],dtype=np.int32)

R = ((im & 0xff).astype(np.uint8)
# array([ 57,  57,  57, 112,  28,  29], dtype=uint8)

G = ((im>>8) & 0xff).astype(np.uint8)
# array([ 61,  61,  61, 179,  75,  66], dtype=uint8)

B = ((im>>16) & 0xff).astype(np.uint8)
# array([ 61,  61,  61, 170,  72,  66], dtype=uint8)

如果这些值看起来正确,您应该能够将它们合并为彩色图像:

img = cv2.merge((B,G,R))

请记住,OpenCV 使用 BGR 通道排序,而不是更传统的 RGB


您的 32 位数字中的字节顺序可能与我上面的猜测不同。最简单的测试方法是在你的相机前放一张红卡,看看会发生什么,然后是绿卡,然后是蓝卡。四个通道(R、G、B、A)应由以下给出,但这可能是实验的问题:

(im    ) & 0xff
(im>>8 ) & 0xff
(im>>16) & 0xff
(im>>24) & 0xff

【讨论】:

  • 不用担心,我已经知道在哪里移动位了 :) 感谢您向我展示 cv2.merge()!
  • 酷 - 祝你的项目好运!请记住,问题(和答案)是免费的,所以如果您再次遇到困难,请回来。
  • 顺便说一句,您可以使用im = Image.merge("RGB", (b, g, r)) 对 PIL/Pillow 执行相同的操作,但我猜您对 OpenCV 很满意。
【解决方案2】:

要使用 cv2 输出彩色图像,您需要将图像的形状设为 (x,y,3),最后一个轴是颜色。

由于您的数据是 RGBA 的 int32 表示,我假设每个数字实际上包含 4 个不同的数字,其中前 2 个字节是红色的 uint8,第二个绿色,第三个蓝色和最后一个 alpha:(0000 0001, 0000 0010, 0000 0100,0000 1000) 在这个例子中 r是 1,g 是 2,b 是 4,alpha 是 8。
您需要将这 8 个字节提取到单独的颜色中。

另外请记住,cv2色彩空间是BGR而不是RGB,所以转换后需要切换通道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多