Python OpenCV:在numpy图像数组中反转颜色

时间:2015-05-18 23:06:02

标签: python image opencv image-processing numpy

我一直试图操纵一个非常简单的8 x 8图像(变量"abc")的颜色(BGR值),但当我尝试用反转颜色查看新图像时(变量{{1}我得到的只是一张黑色照片。有人可以帮帮我吗?

我甚至尝试在更改代码后检查两个数组是否完全匹配,以便尝试一次一个像素地复制图像,条件等于"target"但图片仍为黑色。

我已经发布了以下代码:

True

1 个答案:

答案 0 :(得分:2)

我想指出cv2.imshow的文档:http://docs.opencv.org/modules/highgui/doc/user_interface.html#imshow

阅读说明中有关您要显示的图像类型的内容:

  • 如果图像是8位无符号,则按原样显示。
  • 如果图像是16位无符号或32位整数,则像素除以256.即,值范围[0,255*256]映射到[0,255]
  • 如果图像是32位浮点,则像素值乘以255.即,值范围[0,1]映射到[0,255]

你的情况是第二点。你要做的是输入图像很可能是无符号的8位整数开始。因为您创建了类型为int的输出图像(实际上是int32),这相当于32位整数类型的图像,所以发生的是所有值都被除以256.对于8位无符号整数类型,所有值都在0到255之间,因此除以256会使所有像素黑色(即[0,255] / 256 --> [0,0]假定整数除法)。

要解决此问题,您需要为输出正确创建正确的图像类型。在您的情况下,我将假设您的输入数据类型为uint8,根据我看到的情况,这是最有意义的,因此只需更改target以便{{1}是} dtype

uint8

次要注意事项

您可以通过切片非常有效地完成您想要的内容。

因此,target = np.empty(shape=(x1, y1, 3), dtype=np.uint8) 可以非常简单地成为以下内容,而不使用target循环或临时列表来复制空间坐标元组:

for

额外的好处是target = abc[:,:,[1,2,0]] 将保持target所采用的相同数据类型。阅读abc索引和切片:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html