您的位置:首页 > 运维架构

calcHist的使用中严重的错误和误区!!!!!!!为什么所有的文章都没有指出??

2017-04-25 13:51 267 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐