前言

如果你想了解更多有关于计算机视觉、OpenCV、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!

1、calcHist函数是干什么滴?

这个问题嘛,看看标题,标题,对啊,你这么聪明,一定猜得到:

calcHist函数是用来计算图像直方图的

2、calcHist函数调用形式

C++: void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )

参数详解:

onst Mat* images:输入图像

int nimages:输入图像的个数

const int* channels:需要统计直方图的第几通道

InputArray mask:掩膜,,计算掩膜内的直方图  ...Mat()

OutputArray hist:输出的直方图数组

int dims:需要统计直方图通道的个数

const int* histSize:指的是直方图分成多少个区间,就是 bin的个数

const float** ranges: 统计像素值得区间

bool uniform=true::是否对得到的直方图数组进行归一化处理

bool accumulate=false:在多个图像时,是否累计计算像素值得个数

3、实战分析及代码展示

我们需要把下面这个图像的直方图计算并画在画布上。一共有如下几个步骤:

1.创建一些矩阵;

2.加载原图像;

3.使用OpenCV函数 split() 将图像分割成3个单通道图像;

4.设定像素取值范围,我们知道像素值的范围是 [0,255];

5.使用OpenCV函数calcHist() 分别计算三个通道的直方图;

6.创建显示直方图的画布并使用 normalize() 函数归一化直方图;

7.最后显示直方图并等待用户退出程序;

#define INPUT_TITLE "input image"
#define OUTPUT_TITLE "直方图计算"#include<iostream>
#include<opencv2\opencv.hpp>using namespace std;
using namespace cv;int main() {Mat src, dst;//加载图像src = imread("D:/equalizeHist.jpg");if (!src.data){cout << "ERROR : could not load image.";return -1;}namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);imshow(INPUT_TITLE, src);//分通道显示vector<Mat> bgr_planes;split(src, bgr_planes);//设定像素取值范围int histSize = 256;float range[] = { 0,256 };const float *histRanges = { range };//三个通道分别计算直方图Mat b_hist, g_hist, r_hist;calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRanges, true, false);calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRanges, true, false);calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRanges, true, false);//创建直方图画布并归一化处理int hist_h = 400;int hist_w = 512;int bin_w = hist_w / histSize;Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0));normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat());normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());//render histogram chart  在直方图画布上画出直方图for (int i = 0; i < histSize; i++){line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(b_hist.at<float>(i - 1))), Point((i)*bin_w, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, LINE_AA);line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(g_hist.at<float>(i - 1))),Point((i)*bin_w, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, LINE_AA);line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(r_hist.at<float>(i - 1))),Point((i)*bin_w, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, LINE_AA);}imshow(OUTPUT_TITLE, histImage);waitKey(0);return 0;
}

效果图

【opencv学习笔记】025之直方图计算 - calcHist函数详解相关推荐

  1. OpenCV-Python直方图计算calcHist函数详解

    ☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在<<数字图像处理>第三章学习总结感悟2:直方图处理: h ...

  2. OpenCV-Python图像直方图计算calcHist函数详解、示例及图形呈现

    ☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在前面几篇直方图相关的文章中介绍了直方图均衡.直方图匹配.局部直方图处理.基 ...

  3. 【小白】Open-CV 学习笔记 -5.5.2 离散傅里叶变换相关函数详解

    目录 1.dft()函数 2.返回DFT最优尺寸大小:getOptimalDFTSize()函数 3.扩充图像边界:copyMakeBorder()函数 4.计算二维矢量的幅值:magnitude() ...

  4. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  5. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  6. python列表和元组的应用_python学习笔记之列表(list)与元组(tuple)详解

    前言 最近重新再看python的基础知识,感觉自己还是对于这些知识很陌生,需要用的时候还是需要翻书查阅,还是先注重基础吧--我要重新把python的教程阅读一遍,把以前自己忽略的部分学习,加强练习和记 ...

  7. 【matcovnet学习笔记】objective,top1error,top5error详解

    [matcovnet学习笔记]objective,top1error,top5error详解 排名前1和前5的错误率是衡量某些解决方案成功与否的重要单位 ,要理解这三个概念,关键是要看懂下面这个多类误 ...

  8. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  9. 【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

    本文属于[Azure 架构师学习笔记]系列. 本文属于[Azure Data Factory]系列. 接上文[Azure 架构师学习笔记]-Azure Data Factory (3)-触发器详解-翻 ...

最新文章

  1. 5月26 留言板练习题
  2. 合并分支到master_我敢打赌!这是全网最全的 Git 分支开发规范手册
  3. 2021牛客多校2 - WeChat Walk(分块)
  4. Flex与javascript通信
  5. myeclipse搭建SSH框架
  6. 功放音量调节原理_汽车音响知识关于功放和低音喇叭的匹配
  7. 转载:word排版之长英文单词自动换行
  8. .net async/await 异步等待的数种情况
  9. mysql 保存 union_mysql中union 查询
  10. 计算机网络arp表作用,arp映射表是什么?有什么作用
  11. DWL文件能改成DWG文件打开吗?
  12. 了解 Web 服务规范: 第 7 部分:Web 服务业务流程执行语言
  13. python—最大公约数和最小公倍数
  14. idea如何设置jvm大小
  15. P330工作站装linux,联想ThinkStation P330工作站装win7系统及bios设置教程(支持usb)
  16. SAP采购中基于收货的发票校验应用逻辑及控制
  17. kotlin——观察者模式
  18. 读real time localization and 3D reconstruction笔记
  19. 扭转战局的棋子 安卓4.4 ART模式实测解析
  20. 伪元素(3)-解决IE6/IE7/IE8不支持before,after问题

热门文章

  1. 第十五天 12-tcpdump检测流量工具
  2. npy文件的打开,读取
  3. Python Resource
  4. java swing实现图文混排_跟我学Java Swing之游戏设计(4)
  5. C语言中 sqrt(); 函数的最全用法总结,最全!!!
  6. day75,爬虫02,webmagic入门程序,组件介绍:Downloader,PageProcess,pipeline,Scheduler,51jop招聘网站综合案例
  7. floor()函数的使用
  8. python地产成本_Python3抓取 深圳房地产均价数据,通过真实数据为购置不动产做决策分析(二)...
  9. Linux防火墙的关闭
  10. JNLP文件详细说明