【发布时间】:2014-04-23 09:24:39
【问题描述】:
我正在尝试计算图像中最常见的颜色。使用 calcHist 函数,我知道我可以得到一个直方图,其单个通道中的 bin 是像素值,每个 bin 的值是该值存在的次数在图像中。
此外,使用 minMaxLoc 函数很容易获得直方图的最大值(即双精度)及其位置。
但我想要的是整个颜色(带有每个通道值的 Vec3b 对象)。
这是我目前所拥有的:
split(image, lab_channels);
histSize = 256;
range[0] = 0;
range[1] = 256;
const float *lRange = {range};
calcHist( &lab_channels[0], 1, 0, Mat(),
l_hist, 1, &histSize, &lRange,
true, false );
histSize = 256;
range[0] = 0;
range[1] = 256;
const float *aRange = {range};
calcHist( &lab_channels[1], 1, 0, Mat(),
a_hist, 1, &histSize, &aRange,
true,
false );
histSize = 256;
range[0] = 0;
range[1] = 256;
const float *bRange = {range};
calcHist( &lab_channels[2], 1, 0, Mat(),
b_hist, 1, &histSize, &bRange, t
rue, false );
minMaxLoc(l_hist, 0, 0, 0, &maxPos);
result[0] = maxPos.y;
minMaxLoc(a_hist, 0, 0, 0, &maxPos);
result[1] = maxPos.y;
minMaxLoc(b_hist, 0, 0, 0, &maxPos);
result[2] = maxPos.y;
其中 result 是我的 Vec3b 矢量,具有最常见的颜色。
这段代码工作正常(它确实检索了一种颜色),但问题是它从每个通道中分别获得最常见的颜色,最后它不一定是组合通道中最常见的颜色。
所以,如果我执行此过程,但对于 3 个通道(如 opencv 文档中所示),我如何从生成的直方图中获取此 Vec3b 向量?或者至少是我可以转换或转换为它的另一种数据类型。
【问题讨论】: