6

我有一个多色的图像。

在此处输入图像描述

我想计算图像的主色。主色是红色,我想过滤掉红色。我在 opencv 中执行以下代码,但它没有执行。

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

否则我怎样才能获得主色?我的最终项目应该自己确定对象的最大颜色。最好的方法是什么?

4

2 回答 2

9

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

为什么?想象一下具有 100 像素(0,0,255)(蓝色 int RGB)、100 像素(0,0,254)(几乎是蓝色 - 你甚至不会发现差异)和 150 像素(0,255,0)(绿色)的图像。这里最常见的颜色是什么?显然,它是绿色的。但是在量化之后,你会得到 200 个蓝色像素和 150 个绿色像素。

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

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

这就是我应用它后得到的:

在此处输入图像描述

您也可以使用 k-means 或 mean-shift 来做到这一点(这是非常有效的方法)。

于 2013-06-03T17:07:45.817 回答
7

最好的方法是分析直方图。

您的问题是经典的“找到峰顶和峰下面积”。通过拥有一个图像文件(假设为简单起见,我们只采用第三​​个通道):

直方图

您必须在该直方图中找到最高峰。最简单的方法是简单地查询 Y 最大化的 X。更高级的方法适用于窗口——它们平均 10 个连续数据点的 Y 值等。

此外,在 HSV 或 YCrCb 颜色空间中工作。HSV 很好,因为“色调”通道与您所说的“颜色”非常接近。RGB 真的不太适合图像分析。

于 2013-06-03T11:33:23.483 回答