从直方图maxValue中获取颜色矢量

Get color vector from histogram maxValue

本文关键字:颜色 获取 直方图 maxValue      更新时间:2023-10-16

我正在尝试计算图像中最常见的颜色。使用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; 

其中结果是我的具有最常见颜色的Vec3b向量。

这个代码工作得很好(它确实检索了一种颜色),但问题是它从每个通道中分别获得了最常见的颜色,最后它不一定是组合通道中最常用的颜色。

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

以下是您可以做的事情:

1)计算联合直方图。对3通道图像使用calcHist,而不是为每个通道计算一个独立的直方图。

第二)在联合直方图中查找最大值,就像使用minMaxLoc处理通道直方图一样。

现在,如果我们知道联合直方图中每个bin的颜色是什么,那就太好了,但这并不简单。您可以查看OpenCV实现,也可以询问某人有关它的情况。。或者尝试以下操作:

3)将所有关节直方图值设置为0,除了与您刚刚找到的最大值相对应的值。将此bin的值设置为最大值(即,如果这是一个归一化直方图,则为1.0)。然后对原始图像进行直方图反向投影(使用calcBackProject)。具有最频繁颜色的像素(您正在查找的像素)应在反向投影图像中高亮显示。

希望它能有所帮助!