gpt4 book ai didi

c++ - 从直方图中获取颜色 vector maxValue

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:57 25 4
gpt4 key购买 nike

我正在尝试计算图像中最常见的颜色。使用 calcHist 函数,我知道我可以获得一个直方图,其单个 channel 中的 bin 是像素值,每个 bin 的值是该值出现的次数在图像中。

此外,使用 minMaxLoc 函数很容易获得直方图的最大值(即 double 值)及其位置。

但我想要的是整个颜色(具有每个 channel 值的 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 vector ,颜色最常见。

这段代码工作正常(它确实检索了一种颜色),但问题是它从每个 channel 中分别获取了最常见的颜色,最后它不一定是组合 channel 中最常见的颜色。

因此,如果我执行此过程,但对于 3 个 channel (如 opencv 文档中所示),我如何从生成的直方图中获取此 Vec3b vector ?或者至少我可以转换或转换为它的另一种数据类型。

最佳答案

您可以执行以下操作:

1st) 计算 union 直方图。对 3 channel 图像使用 calcHist,而不是为每个 channel 计算一个独立的直方图。

第二)寻找 union 直方图中的最大值,就像您对 channel 直方图所做的那样,使用minMaxLoc

现在,如果我们知道为 union 直方图中的每个 bin 分配了什么颜色,那就太好了,但这并不简单。您可以查看 OpenCV 实现,或向某人询问有关它的信息..或尝试以下操作:

3rd) 将所有 union 直方图值设置为 0,除了与您刚刚找到的最大值对应的值。将此 bin 的值设置为最大值(即,如果这是归一化直方图,则为 1.0)。然后对原始图像进行直方图的反向投影(为此使用calcBackProject)。具有最常见颜色(您正在寻找的颜色)的像素应在反投影图像中突出显示。

希望对您有所帮助!

关于c++ - 从直方图中获取颜色 vector maxValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23240107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com