【问题标题】:Histogram of an array of values in OpenCvOpenCv中值数组的直方图
【发布时间】:2013-07-09 11:34:05
【问题描述】:

我有一个包含 630 个值的矩阵(值范围为 0-35)...

我想在这个矩阵中找到最常出现的值。那么我该如何为此写一个直方图呢?还有其他方法可以找到最常出现的值(我不想使用计数器,因为我需要 36 个计数器,而且我的代码会变得非常低效)

..谢谢!

【问题讨论】:

    标签: opencv image-processing histogram


    【解决方案1】:

    您可以将calcHist 与大小为 1xN 的 Mat 一起使用,在您的情况下,N 为 630。

    我不明白你反对计数器的论点。要构建直方图,无论如何都必须使用计数器。有一些方法可以让计数变得非常高效。

    假设您的图像是一个 cv::Mat 变量 im,大小为 1x630 并键入 CV_8UC1,请尝试:

    std::vector<int> counts(36, 0);
    for (int c = 0; c < 630; c++)
        counts.at(im.at<unsigned char>(1, c)) += 1;
    std::cout << "Most frequently occuring value: " << std::max_element(counts);
    

    这使用计数,但在普通 PC 上不会超过 0.1 毫秒。

    【讨论】:

    • 但是我必须使用counter1++,counter2++等等......counter35++......这将非常低效??
    • 直方图就是这样。当您想引用 counter1、counter2 等值的集合时,我们称其为数组,因此我们得到 counter[1]、counter[2] 等。但现在由于它们存储在数组中,我们不不需要用if 语句引用它们,我们可以直接使用我们的像素值作为数组索引。计数器[像素值]++。瞧,直方图。
    【解决方案2】:

    为什么不手动呢?

    Mat myimage(cvSize(1,638), CV_8U);
    randn(myimage, Scalar::all(128), Scalar::all(20)); //Random fill
    vector<int> histogram(256);
    for (int i=0;i<638;i++)
        histogram[(int)myimage.at<uchar>(i,0)]++;
    

    【讨论】:

    • @William...让我试试这个
    • 我不太清楚你的代码...是投票最初生成的直方图..还是在我已经生成直方图之后在这里使用它?
    • 好的...命名很清楚..我假设将向量初始化为 :vectorhistogram(36) 因为我使用 0-35 范围内的值
    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多