我正在尝试计算图像中独特颜色的数量。我有一些我认为应该可以工作的代码,但是当我在图像上运行它时,它说我可能有16777216种颜色中有252种不同的颜色。鉴于图像是BGR,这似乎是错误的,所以它们的颜色应该不是更多不同(数千而不是数百种吗?)?
def count_colours(src):
unique, counts = np.unique(src, return_counts=True)
print(counts.size)
return counts.size
src = cv2.imread('../../images/di8.jpg')
src = imutils.resize(src, height=300)
count_colours(src) # outputs 252 different colours!? only?
该值正确吗?如果没有,我该如何修复函数count_colours()
?
编辑:这正确吗?
def count_colours(src):
unique, counts = np.unique(src.reshape(-1, src.shape[-1]), axis=0, return_counts=True)
return counts.size
答案 0 :(得分:1)
@ Edeki Okoh的评论是正确的。您需要找到一种方法来考虑颜色通道。可能有一个更干净的解决方案,但是执行此操作的方法很笨拙。每个颜色通道的值都在0到255之间,因此我们加1以确保它倍增。蓝色代表最后一个数字,绿色代表中间的三个数字,红色代表前三个数字。现在,每个值都代表一种独特的颜色。
b,g,r = cv2.split(src)
shiftet_im = b + 1000 * (g + 1) + 1000 * 1000 * (r + 1)
生成的图像应具有一个通道,每个值代表唯一的颜色组合。
答案 1 :(得分:1)
如果您查看unique
,您肯定会发现它们是标量。
您需要使用axis
关键字:
>>> import numpy as np
>>> from scipy.misc import face
>>>
>>> img = face()
>>> np.unique(img.reshape(-1, img.shape[-1]), axis=0, return_counts=True)
(array([[ 0, 0, 5],
[ 0, 0, 7],
[ 0, 0, 9],
...,
[255, 248, 255],
[255, 249, 255],
[255, 252, 255]], dtype=uint8), array([1, 2, 2, ..., 1, 1, 1]))
答案 2 :(得分:0)
我认为您只计算了一个通道,例如整个RGB通道中的R值。这就是为什么只有252个离散值的原因。
理论上,每个R G B可以具有256个离散状态。
256 * 256 * 256 = 16777216
总共意味着您可以拥有16777216种颜色。
我的建议是将RGB uchar CV_8UC3 转换为单个32bit数据结构,例如 CV_32FC1
让 给定图像作为输入
import cv2
import numpy as np
image=cv2.imread('/home/usr/naneDownloads/vuQ9y.png' )# change here
b,g,r = cv2.split(image)
out_in_32U_2D = np.int32(b) << 16 + np.int32(g) << 8 + np.int32(r) #bit wise shift 8 for each channel.
out_in_32U_1D= out_in_32U_2D.reshape(-1) #convert to 1D
np.unique(out_in_32U_1D)
array([-2147483648, -2080374784, -1073741824, -1006632960, 0,
14336, 22528, 30720, 58368, 91136,
123904, 237568, 368640, 499712, 966656,
1490944, 2015232, 3932160, 6029312, 8126464,
15990784, 24379392, 32768000, 65011712, 67108864,
98566144, 132120576, 264241152, 398458880, 532676608,
536870912, 805306368, 1073741824, 1140850688, 1342177280,
1610612736, 1879048192], dtype=int32)
len(np.unique(out_in_32U_1D))
37 # correct for my test wirting paper when compare when my manual counting
此处的代码应该能够为您提供所需的信息