python openCV:在numpy映像数组中倒转颜色



我一直在尝试操纵非常简单的8 x 8图像(可变 "abc")的颜色(bgr值),但是当我尝试使用倒颜色查看新图像时(可变 "target"),我得到的只是黑色图片。谁能帮我吗?

更改代码后,我什至尝试检查两个阵列以进行确切的匹配,以便一次尝试复制一个像素的图像,并且条件等同于True,但图片仍然是黑色的。

我在下面发布了代码:

import cv2
import numpy as np    
abc = cv2.imread("new.png")
(x1, y1) = abc.shape[:2]
a1 = []
a2 = []
a3 = []
for i in range(x1):
    for d in range(y1):
        for g in range(3):
            if g == 0:
                a1.append(abc[i, d, g])
            elif g == 1:
                a2.append(abc[i, d, g])
            elif g == 2:
                a3.append(abc[i, d, g])
u = 0
target = np.empty(shape=(x1, y1, 3), dtype="int32")
for i in range(x1):
    for d in range(y1):
              target[i, d, 1] = a2[u]
              target[i, d, 2] = a3[u]
              target[i, d, 0] = a1[u]
              u = u + 1
if (abc == target).all():
    print "equal/match"
cv2.imshow('target', target)
cv2.waitKey(0)
cv2.destroyAllWindows()

我想向您指出cv2.imshow:http://docs.opencv.org/modules/highgui/doc/doc/user_inter_interface.html#imshow

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

  • 如果图像是8位未签名,则显示为
  • 如果图像为16位unsigned或32位整数,则像素为256。也就是说,值 [0,255*256]映射到[0,255]
  • 如果图像为32位浮点,则像素值乘以255。也就是说,值范围[0,1]映射到[0,255]

您的情况是第二点。您正在做的是,输入图像最有可能是未签名的8位整数。因为您创建了类型int(实际上是int32)的输出图像,所以这等同于32位整数的图像,因此发生的事情是所有值都被分配为256。对于8位Unsigned整数类型,所有值均在0到255之间,因此除以256使您的所有像素 black (即[0,255] / 256 --> [0,0]假定整数司)。

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

target = np.empty(shape=(x1, y1, 3), dtype=np.uint8)

次要注释

您可以非常有效地完成第三维的切片

因此,target可以非常简单地是以下内容,而无需使用for循环或临时列表以通过空间坐标复制:

target = abc[:,:,[1,2,0]]

附加的奖励是target将维护与abc相同的数据类型。在此处阅读 numpy索引和切片:http://docs.scipy.org/doc/numpy/reference/rares.indexing.html

最新更新