我有一个包含630个值的矩阵(值范围从0-35
)...
我想在此矩阵中找到最常出现的值。那我该怎么写直方图呢?还有其他方法,我可以找到最常出现的值(我不想使用计数器,因为我将需要36个计数器,我的代码将变得非常低效)
...谢谢!
答案 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)]++;