我一直在尝试操纵非常简单的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
,以便dtype
是uint8
:
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