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。用来计算直方图的channes的数组。比如输入是2副图像,第一副图像有0,1,2共三个channel,第二幅图像只有0一个channel,

那么输入就一共有4个channes,如果int channels[3] = {3, 2, 0},那么就表示是使用第二副图像的第一个通道和第一副图像的第2和第0个通道来计

算直方图。

mask。掩码。如果mask不为空,那么它必须是一个8位(CV_8U)的数组,并且它的大小的和arrays[i]的大小相同,值为1的点将用来计算

直方图。

hist。计算出来的直方图

dims。计算出来的直方图的维数。

histSize。在每一维上直方图的个数。简单把直方图看作一个一个的竖条的话,就是每一维上竖条的个数。

ranges。用来进行统计的范围。比如

float rang1[] = {0, 20};

float rang2[] = {30, 40};

const float *rangs[] = {rang1, rang2};那么就是对0,20和30,40范围的值进行统计。

uniform。每一个竖条的宽度是否相等。

accumulate。Accumulation flag. If it is set, the histogram is not cleared in the beginning
when it is allocated. This feature enables you to compute a single histogram from several
sets of arrays, or to update the histogram in time.  是否累加。如果为true,在下次计算的时候不会首先清空hist。这个地方我是这样理解的,不知道有没有错,

请高手指点。

  1. Histogram1D::Histogram1D(){
  2. histSize[] = ;
  3. hranges[] = 0.0;
  4. hranges[] = 255.0;
  5. ranges[] = hranges;
  6. channels[] = ;
  7. }
  8.  
  9. cv::MatND Histogram1D::getHistogram(const cv::Mat &image){
  10. cv::MatND hist;
  11. cv::calcHist(&image, //source image
  12. , //histogram from 1 image only
  13. channels, //the channel used
  14. cv::Mat(),//no mask is uesd
  15. hist, //the resulting histogram
  16. , //it is a 1D histogram
  17. histSize, //number of bins
  18. ranges //pixel value range
  19. );//直方图函数
  20. return hist;
  21. }

下面是计算1维图像的直方图:

  1. cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image){
  2. //compute histogram first
  3. cv::MatND hist = getHistogram(image);
  4. //get min and max bin values
  5. double maxVal = ;
  6. double minVal = ;
  7. cv::minMaxLoc(hist,&minVal,&maxVal,,);
  8. //Image on which to display histogram
  9. cv::Mat histImg(histSize[],histSize[],CV_8U,cv::Scalar());
  10. //set highest point at 90% of nbins
  11. int hpt = static_cast<int>(0.9*histSize[]);
  12. //Draw a vertical line for each bin
  13. for (int h =;h<histSize[];h++)
  14. {
  15. float binVal = hist.at<float>(h);
  16. int intensity = static_cast<int>(binVal*hpt/maxVal);
  17. cv::line(histImg,cv::Point(h,histSize[]),cv::Point(h,histSize[]-intensity),cv::Scalar::all());
  18. }
  19. return histImg;
  20. }

计算H-S直方图分布:

  1. /*********************************************
  2. 内容:计算H-S 直方图分布
  3. 时间:2013 5.27
  4. 作者:恋上蛋炒面
  5. *********************************************/
  6. #include <opencv2/core/core.hpp>
  7. #include <opencv2/highgui/highgui.hpp>
  8. #include <opencv2/imgproc/imgproc.hpp>
  9. using namespace cv;
  10.  
  11. void main()
  12. {
  13. Mat source = imread("baboon.jpg");
  14. namedWindow("Source");
  15. imshow("Source",source);
  16. Mat hsv;
  17. cvtColor(source,hsv,CV_BGR2HSV);
  18. //Quantize the hue to 60 levels
  19. //and the saturation to 64 levels
  20. int hbins = ,sbins = ;
  21. int histSize[] = {hbins,sbins};
  22. int histSize[] = {hbins,sbins};
  23. //hue varies from 0 to 179
  24. float hranges[] = {,};
  25. //saturation varies from 0 to 255
  26. float sranges[] = {,};
  27. const float *ranges[] = {hranges,sranges};
  28. //two channels 0th,1th
  29. int channels[] = {,};
  30. MatND hist;
  31. //compute h-s histogram
  32. calcHist(&hsv,,channels,Mat(),hist,,histSize,ranges);
  33. //get the max value
  34. double maxVal = .;
  35. minMaxLoc(hist,,&maxVal,,);
  36. int scale = ;
  37. //show the histogram on the image
  38. Mat histImg = Mat::zeros(sbins*scale,hbins*scale,CV_8UC3);
  39. for (int h = ;h < hbins;h++)
  40. {
  41. for (int s = ;s<sbins;s++)
  42. {
  43. float binVal = hist.at<float>(h,s);
  44. int intensity = cvRound(binVal*0.9*/maxVal);
  45. rectangle(histImg,Point(h*scale,s*scale),Point((h+)*scale-,(s+)*scale-),Scalar::all(intensity),CV_FILLED);
  46. }
  47. }
  48.  
  49. namedWindow("H-S Histogram");
  50. imshow("H-S Histogram",histImg);
  51. imwrite("hshistogram.jpg",histImg);
  52. waitKey();
  53. }

RGB直方图:

  1. #include <opencv2/core/core.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. #include <opencv2/imgproc/imgproc.hpp>
  4.  
  5. #include <fstream>
  6.  
  7. using namespace cv;
  8. using namespace std;
  9.  
  10. void main()
  11. {
  12. //Mat source = imread("red.jpg");
  13. Mat source = imread("baboon.jpg"); //读取图片
  14. //Mat source(300,300,CV_8UC3,Scalar(1,1,244));
  15. //imwrite("red.jpg",source);
  16. namedWindow("Source");//窗口显示图片
  17. imshow("Source",source);
  18. //初始化calcHist函数的参数
  19. int channels_r[],channels_g[],channels_b[],histSize[],range;
  20. float hranges[];
  21. const float *ranges[];
  22. histSize[] = ;
  23. hranges[] = 0.0;
  24. hranges[] = 255.0;
  25. ranges[] = hranges;
  26. channels_b[] = ;
  27. channels_g[] = ;
  28. channels_r[] = ;
  29. MatND hist_r,hist_g,hist_b;
  30.  
  31. double max_val_r,max_val_g,max_val_b;
  32. Mat histImage(histSize[],*histSize[],CV_8UC3); //定义一个显示直方图的图片,长256*3 高256
  33. //R
  34. calcHist(&source,,channels_r,Mat(),hist_r,,histSize,ranges);//分别计算R,G,B的直方图分布
  35. minMaxLoc(hist_r,,&max_val_r,,);//计算直方图中统计最大值
  36. //G
  37. calcHist(&source,,channels_g,Mat(),hist_g,,histSize,ranges);
  38. minMaxLoc(hist_g,,&max_val_g,,);
  39. //B
  40. calcHist(&source,,channels_b,Mat(),hist_b,,histSize,ranges);
  41. minMaxLoc(hist_b,,&max_val_b,,);
  42.  
  43. //将r,g,b的最大统计值,以及像素点从0-255的统计值写入txt中
  44. ofstream outfile1("d:\\r.txt");
  45. ofstream outfile2("d:\\g.txt");
  46. ofstream outfile3("d:\\b.txt");
  47.  
  48. //在txt中写入最大统计值
  49. outfile1<<"max_val_r = "<<max_val_r<<endl;
  50. outfile2<<"max_val_g = "<<max_val_g<<endl;
  51. outfile3<<"max_val_b = "<<max_val_b<<endl;
  52.  
  53. for (int i =;i<histSize[];i++)
  54. {
  55. //R,G,B= i的统计值
  56. float binVal_r = hist_r.at<float>(i);
  57. float binVal_g = hist_g.at<float>(i);
  58. float binVal_b = hist_b.at<float>(i);
  59. //统一R,G,B统计值的大小,以高度的90%封顶
  60. int intensity_r = static_cast<int>(0.9*histSize[]*binVal_r/max_val_r);
  61. outfile1<<i<<" "<<binVal_r<<" "<<intensity_r<<endl;
  62. int intensity_g = static_cast<int>(0.9*histSize[]*binVal_g/max_val_g);
  63. outfile2<<i<<" "<<binVal_g<<" "<<intensity_g<<endl;
  64. int intensity_b = static_cast<int>(0.9*histSize[]*binVal_b/max_val_b);
  65. outfile3<<i<<" "<<binVal_b<<" "<<intensity_b<<endl;
  66. //画出R,G,B的直方图直线
  67. line(histImage,Point(i,histImage.rows),Point(i,histImage.rows-intensity_r),Scalar(,,));
  68. line(histImage,Point(i+histSize[],histImage.rows),Point(i+histSize[],histImage.rows-intensity_g),Scalar(,,));
  69. line(histImage,Point(i+histSize[]*,histImage.rows),Point(i+histSize[]*,histImage.rows-intensity_b),Scalar(,,));
  70. }
  71. namedWindow("RGB Histogram");
  72. imshow("RGB Histogram",histImage);
  73. imwrite("RGB_Histogram.jpg",histImage);
  74. waitKey();
  75. }

opencv2 直方图之calchist函数使用(转)的更多相关文章

  1. opencv2——直方图5

    (一)图像直方图 图像的构成是有像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图).所谓直方图就是对图像的中的这些像素点的值进行统计,得到一个统一的整体的灰度概念.直方图的好处就在于可以 ...

  2. OpenCV2:直方图

    一.简介 在一个单通道的灰度图像中,每个像素的值介于0(黑色)~255(白色)之间,灰色图像的直方图有256个条目(或称为容器)

  3. opencv —— calcHist、minMaxLoc 计算并绘制图像直方图、寻找图像全局最大最小值

    直方图概述 简单来说,直方图就是对数据进行统计的一种方法,这些数据可以是梯度.方向.色彩或任何其他特征.它的表现形式是一种二维统计表,横纵坐标分别是统计样本和该样本对应的某个属性的度量. 计算直方图: ...

  4. opencv直方图该怎么画

    图像直方图是反映图像中像素分布特性的统计表,一般显示如下: 其中横坐标代表的是图像像素的种类,或者说是灰度级,纵坐标代表的是每一级灰度下像素数或者该灰度级下像素数在所有图像总像素数总所占的百分比. 直 ...

  5. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp;勘误&amp;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  6. OpenCV编程入门目录

    第一部分 快速上手OpenCV 第1 章 邂逅OpenCV 图像处理.计算机视觉与OpenCV OpenCV 概述 起源及发展 应用概述 .2OpenCV 基本架构分析 .3OpenCV3 带来了什么 ...

  7. 【Opencv】直方图函数 calchist()

    calchist函数需要包含头文件 #include <opencv2/imgproc/imgproc.hpp> 函数声明(三个重载 calchist函数): //! computes t ...

  8. Opencv中直方图函数calcHist

    calcHist函数在Opencv中是极难理解的一个函数,一方面是参数说明晦涩难懂,另一方面,说明书给出的实例也不足以令人完全搞清楚该函数的使用方式.最难理解的是第6,7,8个参数dims.histS ...

  9. OpenCV2+入门系列(四):计算图像的直方图,平均灰度,灰度方差

    本篇懒得排版,直接在网页html编辑器编辑 在图像处理时,我们常常需要求出图像的直方图.灰度平均值.灰度的方差,这里给出一个opencv2+自带程序,实现这些功能. 直方图 对于直方图,使用cv::c ...

随机推荐

  1. 『ACM C++』PTA浙大 | 基础题 - Have Fun with Numbers

    连着这两道都是开学前数构老师的“爱心作业”,还没上课开学就给我们布置作业了,这道题有点小坑,也经常遇到类似的问题,特地拿出来记录一下. -------------------------------- ...

  2. Erlang/Elixir: 使用 OpenCV, Python 搭建图片缩略图服务器

    这篇文章是在OSX上测试和运行的的, Ubuntu下的安装和配置请移步到这里 应用程序进程树, 默认 Poolboy 中初始化10个用于处理图片的 Python 工作进程(Worker) 首先安装Op ...

  3. Python 函数内省

    函数内省(function introspection) 除了__doc__属性, 函数对象还有很多属性,对于下面的函数,可以使用dir()查看函数具有的属性: def factorial(n): r ...

  4. nginx原声方法按照每天日志切割保存

    首先配置日志变量,然后配置日志 在/etc/nginx/conf.d/default.conf 配置变量 server{ if ($time_iso8601 ~ "^(\d{4})-(\d{ ...

  5. $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 区别

    PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别 PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 通常情况下,PHP ...

  6. Tempter of the Bone HDU 1010(DFS+剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  7. 20172330 2017-2018-1 《Java程序设计》第十一周学习总结

    20172330 2017-2018-1 <程序设计与数据结构>第十一周学习总结 教材学习内容总结 本周的学习内容为集合 Android简介 Android操作系统是一种多用户的Linux ...

  8. Python:三元运算

    result=值1 if 条件 else 值2 如果条件为真,result=值1 如果条件为假,result=值2 例子: a,b,c=1,3,5 d=a if a>b else c print ...

  9. HTML5资源站

    前端里:http://www.yyyweb.com/ http://www.cnblogs.com/html5tricks/p/3925844.html

  10. javascript之彻底理解闭包

    闭包是函数和声明该函数的词法环境的组合. function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 fun ...