我一直在尝试操纵一个非常简单的 8 x 8 图像(变量 "abc"
)的颜色(BGR 值),但是当我尝试使用反转颜色查看新图像时(变量“目标”
),我得到的只是一张黑色图片。有人可以帮我吗?
我什至在更改代码后尝试检查两个数组是否完全匹配,以便尝试一次复制一个像素,并且条件等于 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/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
即可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/arrays.indexing.html
关于Python OpenCV : inverting colors in a numpy image array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314156/