Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 计算图像中唯一颜色的数量_Numpy_Opencv - Fatal编程技术网

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

Numpy 计算图像中唯一颜色的数量,numpy,opencv,Numpy,Opencv,我试图计算图像中独特颜色的数量。我有一些代码,我认为应该工作,但当我在一个图像上运行它时,它说我有252种不同的颜色,可能是16777216‬. 这似乎是错误的,因为图像是BGR,所以它们的颜色不应该有更多的不同(数千而不是数百?) 这个值正确吗?如果没有,我如何修复我的函数count\u colors() 源图像: 编辑:这正确吗? def count_colours(src): unique, counts = np.unique(src.reshape(-1, src.shape

我试图计算图像中独特颜色的数量。我有一些代码,我认为应该工作,但当我在一个图像上运行它时,它说我有252种不同的颜色,可能是16777216‬. 这似乎是错误的,因为图像是BGR,所以它们的颜色不应该有更多的不同(数千而不是数百?)

这个值正确吗?如果没有,我如何修复我的函数
count\u colors()

源图像:

编辑:这正确吗?

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

@Edeki-Okoh的评论是正确的。您需要找到一种方法来考虑颜色通道。可能有一个更干净的解决方案,但一个黑客的方法是这样做的。每个颜色通道都有从0到255的值,因此我们添加1以确保它相乘。蓝色代表数字的最后一位,绿色代表中间的三位,红色代表前三位。现在,每个值都代表一种独特的颜色

b,g,r = cv2.split(src)
shiftet_im = b + 1000 * (g + 1)  + 1000 * 1000 * (r + 1)

生成的图像应该有一个通道,每个通道的值代表一个唯一的颜色组合。

如果您查看返回的
unique
s,我敢肯定您会发现它们是标量。 您需要使用
关键字:

>>> 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]))

我认为您只计算了一个通道,例如,整个RGB通道中的R值。这就是为什么只有252个离散值

理论上,RGB可以有256个离散状态

256*256*256=16777216

意味着您总共可以拥有16777216种颜色

我的建议是将RGB ucharCV_8UC3转换为单个32位数据结构,如CV_32FC1

让 给定图像作为输入

#我的测试小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
导入cv2
将numpy作为np导入
image=cv2.imread('/home/usr/naneDownloads/vuQ9y.png')#在此处更改
b、 g,r=cv2.分割(图像)

out_in_32U_2D=np.int32(b)您可能只计算RGB光谱的1层。您应该将图像转换为numpy数组中的三个层中的每一层,然后在索引[i][j][k]处找到每个唯一的组合。谢谢你的回答。我已经用一个解决方案编辑了我的问题。你认为数学现在算起来了吗?@sazr看不出有什么问题。顺便说一句。如果您只需要不同颜色的数量,那么您不需要
返回\u计数
。只需使用
uniques=np.unique(src.reforme(-1,src.shape[-1]),axis=0)
然后使用
len(uniques)
uniques.shape[0]
这绝对是一个更干净的解决方案!我测试了它,它返回与我的方法相同的值。
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