calcHist的使用中严重的错误和误区!!!!!!!为什么所有的文章都没有指出??为什么所有的相关介绍都没有指出这个错误????你们到底有没有真正尝试过 ???真正验证过??????真正跑过代码?????????
OpenCV提供了calcHist函数来计算图像直方图。
其中C++的函数原型如下:void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, OutputArray
hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=
false );
void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, SparseMat&
hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=
false );
参数解释:
arrays。输入的图像的指针,可以是多幅图像,所有的图像必须有同样的深度(CV_8U or CV_32F)。同时一副图像可以有多个channes。
narrays。输入的图像的个数。
channels。灰度图像channels为0,彩色为0,1,2
mask。掩码。
hist。计算出来的直方图
dims。计算出来的直方图的维数。
histSize。在每一维上直方图的个数。简单把直方图看作一个一个的竖条的话,就是每一维上竖条的个数。
ranges。用来进行统计的范围。比如
float rang[] = {0, 255};
const float *rangs[] = {rang1};那么就是对0,255范围的值进行统计。
uniform。每一个竖条的宽度是否相等。
accumulate。是否累加。
------问题就出在上面红色的这个参数----这个参数的范围是左闭右开的区间,例如0,255的范围,那么统计>=0,<255的灰度范围, 如果刚刚灰度是255,那么最后一竖条255像素的个数为0!!!!
--------所有的示例都是这么写的
- //生成一幅单通道图像。
- cv::Mat image(imageHeight
- , imageWidth, CV_8U, imageAddress);
- cv::MatND histogram;
- //256个,范围是0,255.
- nbsp;const int histSize = 256;
- float range[] = {0, 255};
- const float *ranges[] = {range};
- const int channels = 0;
- cv::calcHist(image, 1, &channels, cv::Mat(), histogram, 1, &histSize, &ranges[0], true, false);
- 写成这个样子,灰度为255的像素点根本不会计入统计好嘛?????????自己写个矩阵验证下就知道了!!!!
-
cv::Mat srcImg(3,3,CV_8UC1,cv::Scalar(0));
srcImg.at<char>(1,0)=64;
srcImg.at<char>(1,1)=64;
srcImg.at<char>(1,2)=128;
srcImg.at<char>(2,0)=128;
srcImg.at<char>(2,1)=128;
srcImg.at<char>(2,2)=255;
std::cout<<srcImg<<std::endl;
cv::imshow("原图",srcImg);
cv::Mat hist;
const int channels[1]={0};
const int histsize[1]={3};
float range[4]={0,65,128,255};
const float* ranges[1]={range};
cv::calcHist(&srcImg,1,channels,cv::Mat(),hist,1,histsize,ranges,false);
std::cout<<hist<<std::endl;
cv::imshow("直方图",hist);
cv::waitKey(0);
return 0;