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