OpenCv中值数组的直方图

时间:2013-07-09 11:34:05

标签: opencv image-processing histogram

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

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

...谢谢!

2 个答案:

答案 0 :(得分:3)

您可以将calcHist与尺寸为1xN的垫子一起使用,其中N为630。

我不明白你反对反击的论点。要构建直方图,您必须使用计数器。有很多方法可以使计数非常有效。

假设您的图片是大小为im且类型为1x630的cv :: Mat变量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毫秒。

答案 1 :(得分:1)

为什么不手动完成?

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)]++;