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;
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;
相关文章推荐
- 安装了dns且可以正常工作为什么还有"没有可以使用的"DNS服务器"的错误
- 安装了dns且可以正常工作为什么还有"没有可以使用的"DNS服务器"的错误
- MAC上使用“系统偏好设置” 桌面后,出现没有响应的严重错误:没有响应
- 为什么oracle的内置函数中没有leftstr,rightstr之类的字符串函数(substr使用说明大全)
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。
- 病毒防范误区之二:杀毒软件为什么没有告诉我们
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 关于CSDN_blog的使用错误记录(不知道为什么CSDN不去改这些错误,难道你们用起来舒服???)
- 使用JS提交表单提示没有可用方法的错误
- 网络中无法访问XP系统下共享文件,错误:计算机无法访问,您可能没有权限使用网络资源
- 为什么总没有写文章的习惯
- map中使用CArray提示错误: 没有可用的复制构造函数或复制构造函数声明为“explicit”
- 使用了博客园的备份后得到一个xml文件,不知道有没有css或者xslt文件可以在本地阅读文章,在网上找了半天也没有找到解决办法,难道要自己写?
- windows 2008初体验常见问题: 无线网络"没有正确配置为使用IP协议" 错误解决办法
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序
- 使用AjaxPro出现错误(没有找到适合的方法来重写)
- 分析器错误信息: 在应用程序级别以外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。导致该错误的原因可能是在 IIS 中没有将虚拟目录作为应用程序进行配置。
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 今天删除了所有的文章,因为是转贴的,自己也没有心思写这方面的文章,但痛定思痛,从今后,贴出来的文章要是一定要是自己写的
- CSDN这个博客错误为什么这么多天都没有修复,太失望了!!!