从histogram maxValue获取颜色矢量

时间:2014-04-23 09:24:39

标签: c++ opencv histogram

我正在尝试计算图像中最常见的颜色。使用 calcHist 函数,我知道我可以得到一个直方图,其单个通道中的区间是像素值,每个区间的值是该值的多少倍在图像中。

此外,使用 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 个答案:

答案 0 :(得分:1)

您可以做以下事情:

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

第2步)使用minMaxLoc查找联合直方图中的最大值,就像使用通道直方图一样。

现在,如果我们知道在联合直方图中为每个bin分配了什么颜色会很棒,但这并不简单。您可以查看OpenCV实现,也可以询问某人。或者尝试以下方法:

3rd)将所有联合直方图值设置为0,但与您刚找到的最大值对应的值除外。将此bin的值设置为最大值(如果这是标准化的直方图,则为1.0)。然后对原始图像执行直方图的反投影(使用calcBackProject)。应该在反投影图像中突出显示颜色最频繁的像素(您要查找的像素)。

希望它有所帮助!