使用OpenCV获取主导颜色

7

我有一张彩色的图片。

enter image description here

我想计算这张图片的主要颜色,主要颜色是红色,我想过滤掉红色。我使用opencv编写了以下代码,但它没有起作用。

inRange(input_image, Scalar(0, 0, 0), Scalar(0, 0, 255), output);

否则我该如何获取主导颜色?我的最终项目应该自行确定对象的最大颜色。对此,什么是最好的方法?

2个回答

9

在搜索最常见的颜色之前,您应该量化(减少颜色数量)图像。

为什么?想象一下有100个像素的图像(0,0,255)(蓝色RGB),100个像素的(0,0,254)(几乎是蓝色 - 您甚至找不到区别)和150个像素的(0,255,0)(绿色)。这里最常见的颜色是什么?显然是绿色。但是经过量化处理后,您将得到200个蓝色像素和150个绿色像素。

阅读此讨论:如何使用OpenCV减少图像中的颜色数量?。这里是一个简单的例子:

int coef = 200;
Mat quantized = img/coef;
quantized = quantized*coef;

应用后我得到了这个:

enter image description here

此外,您可以使用k-means或mean-shift来实现这一点(这是更高效的方法)。


7
最佳方法是通过分析直方图实现。
你的问题是一个经典的“寻找峰值和峰值下面的区域”。 通过有一张图片文件(为了简单起见,我们只取第三通道),你需要找到直方图中最高的峰值。 最简单的方法是查询使Y最大化的X。 更先进的方法使用窗口 - 它们平均10个连续数据点的Y值等。
另外,使用HSV或YCrCb颜色空间进行工作。 HSV很好,因为“色相”通道非常接近于你所指的“颜色”。 RGB真的不适合图像分析。

为了找到主导颜色,单独为R、G和B通道创建直方图是不够的。您需要一个单一的直方图,其中一个单一的bin是RGB三元组。当然,随着通道数的增加,大小将呈指数级增长,但3个通道仍然可以处理,此外,您可以使用像std::unordered_multiset这样的容器作为合理的解决方案。 - a.lasram
1
当然,这将成为一个三维问题,其设置复杂度要高得多。 - Boyko Perfanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接