【问题标题】:Getting the most occurrence value in a vector<cv::Vec3b> with C++使用 C++ 获取 vector<cv::Vec3b> 中出现次数最多的值
【发布时间】:2014-03-08 18:23:17
【问题描述】:

我现在正在使用vector &lt;cv::Vec3b&gt; 存储图像的 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 值。有没有人有任何建议,关于我怎么做的代码示例?谢谢。

【问题讨论】:

  • 你知道图像直方图吗?
  • @bibek subedi,是的,但现在我实际上是针对图像的特定行。虽然我知道如何为小 ROI 绘制直方图,但我从未尝试过单行。即使它有效,我也只知道如何获得出现次数最多的 R、出现次数最多的 G、出现次数最多的 B,而不是出现次数最多的 RGB 元素。希望你明白我的意思。
  • 另外,我觉得如果我对每一行都使用直方图的方法,程序会超级慢。因此我正在考虑使用向量并整理出出现次数最多的元素。
  • 不建直方图,怎么排序?
  • 我上次遇到这个问题,对于一个std::vector,我从这篇帖子中学到了我的排序方法:stackoverflow.com/questions/12049352/…,Phillip Ngan的回答。

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


【解决方案1】:

假设您的 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 数组中找到最大值,假设最大值是 1000,array[210][15][10]。这表示出现次数最多的R.G和B的组合是“R=210, G=15, B=10”

所以,简而言之,我们可以说 [ ][ ][ ] 处的值告诉您,组合 [R][G][B] 出现了多少次。

【讨论】:

  • 感谢你的方法,一个赞成和接受的答案(:
  • 希望再问一个小问题。我通常通过 std::sort 执行此方法,但是 sort() 函数无法接受 向量类型,您是否知道是否有另一种方法可以执行类似 sort() 的操作?
  • 对不起,我不明白你为什么需要对直方图进行排序?您只需要找到最大值的 bin 即可轻松完成 for 循环(在您的情况下为 3 个 for 循环)。
【解决方案2】:

我认为您可以定义一个三维数组,您可以按照此处所述进行操作: http://www.cplusplus.com/forum/articles/7459/

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

【讨论】:

  • 谢谢。但不是我真正想要的。基本上,我已经完成了你所说的所有存储,我已经在使用多维数组并且已经存储了所有值。我正在尝试找出最常出现的 RGB 值。
  • 我不确定我是否理解正确,但是一旦你得到这样一个数组,那么你只需要找到具有最大值的位置......那个位置的索引将是R,G&B的高发值。
  • 让我试试看我是否正确,所以如果在[1][1][1],我的RGB值为243,233,233,那会是RGB的高发生值吗?如果是这样,那不是我想要做的。例如,我试图找到“200,10,10”的值在大小为 10 的向量中出现次数最多(比如说 6 次),那么我想要这些值。它的值仍然低于 [1][1][1]。
  • 不..不是那样的。我添加了另一个答案来更好地解释它..看看它。
  • @rockinfresh:当您看到值 243,233,233 时,您在 [243][233][233] 位置添加 +1。所以最后你会在你的例子中看到零,除了[40,42,40] = 4[255,255,255] = 1[40,2,60] = 2[9,9,0] = 1[255,255,40] = 2
【解决方案3】:

我对 IP 不是很熟悉。如果它只是获取大多数出现的 RGB 对象的问题,那么可以使用 algorithm.h 头文件中的 sort() 和 equal_range() 算法来完成。在下面的 sn-p 中,我以向量而不是 RGB 类型为例。此代码 sn-p 可用于您的目的,只需进行一些更改即可找到出现次数最多的对象的计数:

    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);
        }

通过对这段代码进行一些更改,我认为可以解决您的目的。

【讨论】:

  • 是的。我曾尝试使用排序,但我认为因为我的向量是多维的,我仍然面临问题,或者我认为这就是原因。我现在尝试根据这条线进行更多思考。谢谢。
  • void main()?不不不
猜你喜欢
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2012-06-23
  • 2011-04-16
相关资源
最近更新 更多