转换为uint8

时间:2018-11-17 04:28:15

标签: python numpy cv2 rgba

我有一个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)

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

如何防止颜色被忽略?

2 个答案:

答案 0 :(得分:2)

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

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

另外,请记住,cv2颜色空间是BGR而不是RGB,因此转换后必须切换通道。

答案 1 :(得分:2)

希望这将帮助您了解如何从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