使用C ++ </cv :: vec3b>获取向量<cv :: vec3b>中出现次数最多的值>

时间:2014-02-11 05:25:38

标签: c++ algorithm opencv image-processing computer-vision

我现在正在使用vector <cv::Vec3b>存储图像的RGB值。

为避免混淆,请让我更多地澄清我的问题。例如,我有一个大小为10的向量。存储的值如下所示:

 Vector address        RGB Values(R,G,B)
    [0][0][0]=         255,255,255
    [1][1][1]=         40,42,40
    [2][2][2]=         40,42,40
    [3][3][3]=         40,42,40
    [4][4][4]=         40,2,60
    [5][5][5]=         9,9,0
    [6][6][6]=         40,2,60
    [7][7][7]=         40,42,40
    [8][8][8]=         255,255,40
    [9][9][9]=         255,255,40

如所观察到的,最常出现的值是(40,42,40)。我如何获得这些值? 我希望找到矢量最常出现的RGB值。有没有人有任何建议,代码样本我怎么做?感谢。

3 个答案:

答案 0 :(得分:2)

假设您的3D数组是array[][][],并且在某个位置(x,y)您得到R = 200,G = 100,B = 10,那么您将array[200][100][10]的值增加1让我们在另一个地方再次获得R = 200,G = 100,B = 10然后再次将array[200][100][10]增加1,所以现在array[200][100][10]的总值为2.你将对所有像素位置执行相同操作。

然后,最后您将在3D数组中找到最大值,并假设array[210][15][10]处的最大值为1000。这表示出现最大次数的R.G和B的组合是“R = 210,G = 15,B = 10”

所以,简而言之,我们可以说[] [] []的值告诉你,组合[R] [G] [B]发生了多少次。

答案 1 :(得分:1)

我对知识产权并不十分熟悉。如果它只是获取大多数RGB对象的问题,那么可以使用algorithm.h头文件中存在的sort()和equal_range()算法来完成。在下面的代码片段中,我采用了vector而不是RGB类型的示例。此代码段可用于您的目的,通过一些更改来查找最高对象的计数:

    void main() 
{
    vector<int> vecInt;
    vecInt.push_back(0);
    vecInt.push_back(1);
    vecInt.push_back(2);
    vecInt.push_back(3);
    vecInt.push_back(1);
    vecInt.push_back(1);
    vecInt.push_back(1);
    vecInt.push_back(9);
    vecInt.push_back(1);
    vecInt.push_back(0);
    vecInt.push_back(0);

    sort(vecInt.begin(), vecInt.end());
    vector<int>::iterator it;
    it = vecInt.begin();    

    pair<vector<int>::iterator, vector<int>::iterator> pairIter;

    int count = 0;
    for(; it != vecInt.end(); ++it)
    {
            if(it != vecInt.end() )
            {
                pairIter = equal_range(it, vecInt.end(), *it);
            }

        while(pairIter.first != pairIter.second)
        {
        ++count;
        ++(pairIter.first);
        }


    }

}

equal_count(),对已排序的容器起作用并返回一对迭代器(已排序容器中的一个范围),其中包含要搜索的值。

pairIter = equal_range(it, vecInt.end(), *it);

现在,我们可以使用如下循环来获取该对迭代器中的项目数:

            while(pairIter.first != pairIter.second)
        {
        ++count;
        ++(pairIter.first);
        }

如果对此代码进行一些更改,我认为这将解决您的目的。

答案 2 :(得分:1)

我认为你可以定义一个三维数组,你可以按照这里提到的那样做: http://www.cplusplus.com/forum/articles/7459/

然后在图像的每个位置提取像素(Veb3b pixelValue;)的值,然后根据R,G和B值(rValue = pixelValue[0];gValue = pixelValue[1];,{{1}提取})递增3D数组的相应bin