1

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

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

..谢谢!

4

2 回答 2

3

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

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

或者

假设您的图像是im具有 size1x630和 type的 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 毫秒。

于 2013-07-09T11:39:43.093 回答
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)]++;
于 2013-07-09T11:52:48.780 回答