我的图像是多色的。
我想计算图像的主色。主导颜色是红色,我想过滤掉红色。我在opencv中执行以下代码但它没有执行。
inRange(input_image, Scalar(0, 0, 0), Scalar(0, 0, 255), output);
我怎样才能获得主导色彩呢?我的最终项目应该自己确定对象的最大颜色。对此最好的方法是什么?
答案 0 :(得分:9)
在搜索最常用的颜色之前,您应该quantize(减少颜色数量)。
为什么呢?想象一下,图像有100个像素的(0,0,255)
(蓝色RGB),100个像素的(0,0,254)
(几乎是蓝色 - 你甚至找不到差异)和150个像素的(0,255,0)
(绿色)。这里最常见的颜色是什么?显然,它是绿色的。但量化后你会得到200像素的蓝色和150像素的绿色。
阅读此讨论:How to reduce the number of colors in an image with OpenCV?。这是一个简单的例子:
int coef = 200;
Mat quantized = img/coef;
quantized = quantized*coef;
这就是我申请后所得到的:
你也可以使用k-means或mean-shift来做到这一点(这是非常有效的方法)。
答案 1 :(得分:7)
最好的方法是分析直方图。
你的问题是经典的“找到峰值和峰值区域”。通过拥有一个图像文件(假设为了简单起见,我们只采用第三个通道):
您必须在该直方图中找到最高峰。最简单的方法是简单地查询Y最大化的X.更高级的方法适用于窗口 - 它们平均10个连续数据点的Y值等等。
此外,在HSV或YCrCb色彩空间中工作。 HSV很好,因为“Hue”频道非常接近“Color”的含义。 RGB实际上不太适合图像分析。