我有一个由True和False值组成的矩阵。我想将其打印为一个图像,其中所有True值都是白色,False值是黑色。矩阵称为索引。我尝试过以下方法:
indices = indices.astype(int) #To convert the true to 1 and false to 0
indices*=255 #To change all the 1's to 255
cv2.imshow('Indices',indices)
cv2.waitKey()
这是打印全黑图像。当我尝试打印(indices==255).sum()
时,它返回值669,这意味着索引矩阵中有669个元素/像素应为白色。但我只能看到纯黑色的图像。我该如何解决这个问题?
答案 0 :(得分:1)
据我所知,opencv
表示图像为浮动矩阵,范围从0到1,或整数,其值介于该类型的最小值和最大值之间。
int
没有边界(除了可以用所有可用内存表示的边界之外)。但是,如果使用np.uint8
,则意味着您正在使用(无符号)字节,其中最小值为0,最大值为255。
所以有几种选择。最受欢迎的两个是:
强制转换为np.uint8
,然后乘以255:
indices = indices.astype(np.uint8) #convert to an unsigned byte
indices*=255
cv2.imshow('Indices',indices)
cv2.waitKey()
使用float
表示形式:
indices = indices.astype(float)
cv2.imshow('Indices',indices)
cv2.waitKey()
请注意,您也可以选择使用np.uint16
来使用无符号的16位整数。在这种情况下,你将不得不乘以65'535。这种方法的优点是你可以使用任意颜色深度(虽然大多数图像格式使用24位颜色(每个通道8位),没有理由不使用48位颜色。例如,如果你正在做图像处理有光泽的杂志,然后使用更多的颜色深度可能是有益的。
此外,即使最终结果是24位色标,人们有时可以更好地使用更高的色深来处理图像处理中的不同步骤。