我仍在尝试理解直方图计算。正如我在其他帖子中所述,我无法理解官方教程和我书中的教程。
我真的很难阅读,尤其是绘制直方图的部分。它涉及拆分,标准化,给出的任何解释,例如hist_w和hist_h的值,以及所有复杂的行函数。
所以我决定以简单的方式写下我学到的东西,看看直方图的工作情况,看看它是怎么回事。这就是我写的:
int _tmain(int argc, _TCHAR* argv[])
{
Mat src, dst, final;
src = imread("c:\\car.jpg", 0);
int histsize = 256;
float range[] = {0, 256};
const float* histrange = { range };
bool uniform = true; bool accumulate = false;
calcHist(&src, 1, 0, Mat(), dst, 1, &histsize, &histrange, uniform, accumulate);
for(int h= 0; h<histsize; h++)
{
float value = dst.at<float>(h);
line(final, Point(h,(histsize-1)), Point(h, value), Scalar(0,0,0));
}
namedWindow("meh",CV_WINDOW_AUTOSIZE);
imshow("meh", final);
waitKey(0);
return 0;
}
图像以灰度加载,因此无需拆分。只需应用calcHist并使用线函数绘制它。
但是在调用时它会给出一个未处理的异常错误。我相信它必须是因为我的简化线功能。正如在线教程中一样,坐标的计算过于复杂。
但我认为这应该有用,让我解释一下。在第一个循环中,h将为0,因此坐标为(0,255) and (0,[value of histogram at 0])
,类似于第二个循环,坐标将为(1,255) and (1,[value of histogram at 0])
,依此类推..
这是理论上直方图是正确的。它应该工作..为什么不呢?
编辑::它在imshow("meh", final);