我有一个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)
我得到一个显示图像的窗口,但是是灰度的;它缺少颜色。
如何防止颜色被忽略?
答案 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