计算图像中唯一颜色的数量

时间:2019-06-15 00:00:10

标签: numpy opencv

我正在尝试计算图像中独特颜色的数量。我有一些我认为应该可以工作的代码,但是当我在图像上运行它时,它说我可能有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()

源图像: enter image description here

编辑:这正确吗?

def count_colours(src):
    unique, counts = np.unique(src.reshape(-1, src.shape[-1]), axis=0, return_counts=True)
    return counts.size

3 个答案:

答案 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

让 给定图像作为输入

enter image description here#我的测试小sie文本图像。我可以手动计算状态数

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

此处的代码应该能够为您提供所需的信息