作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

需求说明

在对图像进行处理时,经常会有这类需求:想要观察图像的直方图分布,例如灰度图中0-255区间数值的分布情况,从而可以进行后续的操作,如阈值分割二值化、直方图均衡化等等。本文设计了一个能绘制简易直方图的简单函数DrawHistImg,可以帮助大家快速掌握绘制的原理,可以根据自己的创意对其进行改善和补充。

下面介绍具体实现流程。

具体流程

1)取图像的灰度图,并遍历统计0-255各个灰度值所出现的次数。

cv::Mat src = imread("test.jpg", 0);
cv::Mat hist = cv::Mat::zeros(1, 256, CV_32FC1);
for (int i = 0; i < src.rows; ++i)
{for (int j = 0; j < src.cols; ++j){hist.at<float>(0, src.at <uchar>(i, j))++;}
}

2)定义直方图图像histImage,并初始化一些参数。其中bins是数值最大值,即255;scale为每个灰度值所对应的直方图宽度;histHeight为直方图高度最大值,也是直方图图像的宽。

cv::Mat histImage = cv::Mat::zeros(540, 1020, CV_8UC1);
const int bins = 255;
int scale = 4;
int histHeight = 540;

3)利用minMaxLoc函数得出哪个灰度值的出现次数最高,为归一化做准备。

double maxValue;
cv::Point2i maxLoc;
cv::minMaxLoc(hist, 0, &maxValue, 0, &maxLoc);

4)遍历hist中每个灰度值,并根据其出现次数绘制直方图,height是归一化后的高度。

for (int i = 0; i < bins; i++)
{float binValue = (hist.at<float>(i));int height = cvRound(binValue * histHeight / maxValue);cv::rectangle(histImage, cv::Point(i * scale, histHeight),cv::Point((i + 1) * scale - 1, histHeight - height), cv::Scalar(255), -1);}

5)函数执行完毕。

功能函数

// 绘制简易直方图
cv::Mat DrawHistImg(cv::Mat &src)
{cv::Mat hist = cv::Mat::zeros(1, 256, CV_32FC1);for (int i = 0; i < src.rows; ++i){for (int j = 0; j < src.cols; ++j){hist.at<float>(0, src.at <uchar>(i, j))++;}}cv::Mat histImage = cv::Mat::zeros(540, 1020, CV_8UC1);const int bins = 255;double maxValue;cv::Point2i maxLoc;cv::minMaxLoc(hist, 0, &maxValue, 0, &maxLoc);int scale = 4; int histHeight = 540;for (int i = 0; i < bins; i++){float binValue = (hist.at<float>(i));int height = cvRound(binValue * histHeight / maxValue);cv::rectangle(histImage, cv::Point(i * scale, histHeight),cv::Point((i + 1) * scale - 1, histHeight - height), cv::Scalar(255), -1);}return histImage;
}

C++测试代码

#include <iostream>
#include <time.h>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;cv::Mat DrawHistImg(cv::Mat &hist);int main()
{cv::Mat src = imread("test.jpg", 0);// 绘制均衡化后直方图cv::Mat hrI = DrawHistImg(src);imshow("original", src);imshow("hist", hrI);waitKey(0);return 0;
}// 绘制简易直方图
cv::Mat DrawHistImg(cv::Mat &src)
{cv::Mat hist = cv::Mat::zeros(1, 256, CV_32FC1);for (int i = 0; i < src.rows; ++i){for (int j = 0; j < src.cols; ++j){hist.at<float>(0, src.at <uchar>(i, j))++;}}cv::Mat histImage = cv::Mat::zeros(540, 1020, CV_8UC1);const int bins = 255;double maxValue;cv::Point2i maxLoc;cv::minMaxLoc(hist, 0, &maxValue, 0, &maxLoc);int scale = 4; int histHeight = 540;for (int i = 0; i < bins; i++){float binValue = (hist.at<float>(i));int height = cvRound(binValue * histHeight / maxValue);cv::rectangle(histImage, cv::Point(i * scale, histHeight),cv::Point((i + 1) * scale - 1, histHeight - height), cv::Scalar(255), -1);}return histImage;
}

测试效果

图1 原图

图2 灰度图

图3 直方图

如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

OpenCV-绘制简易直方图DrawHistImg相关推荐

  1. opencv 绘制图像直方图,实现直方图均衡化

    直方图 直方图简单来说就是图像中每个像素值的个数统计,比如说一副灰度图中像素值为0的有多少个,1的有多少个--直方图是一种分析图像的手段: 直方图计算 opencv库计算直方图 使用 cv.calcH ...

  2. 使用Opencv绘制灰度直方图/对比

    一.所需结构体 CvHistogram 结构体原型: typedef struct CvHistogram {int type; /* 直方图类型 */CvArr* bins; /* 直方图数据 */ ...

  3. Opencv绘制HSV颜色直方图

    一. 使用Opencv绘制HSV颜色直方图 所用的函数 cvCvtColor 可在: 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图 文章中查找相关介绍 所使用的结构体: CvHisto ...

  4. opencv python matplotlib.pyplot.hist() 如何绘制灰度直方图,如何根据灰度直方图确定最优二值化值

    什么是灰度直方图? 图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析.不过图像的直方图不具有空间特征. 图像的灰度直方图(histogram),就是将图像转化成灰度 ...

  5. [Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  6. 数字图像处理(15): 灰度直方图(matplotlib 和OpenCV 绘制直方图)

    目录 1 灰度直方图简介 1.1 灰度直方图概念 1.2 灰度直方图作用 1.3 绘制的直方图 1.4 归一化直方图 2 matplotlib库 绘制直方图-hist() 3 OpenCV库 绘制直方 ...

  7. OpenCV系列之直方图-1:查找、绘制和分析 | 二十六

    目标 学会 使用OpenCV和Numpy函数查找直方图 使用OpenCV和Matplotlib函数绘制直方图 你将看到以下函数:cv.calcHist(),np.histogram()等. 理论 那么 ...

  8. python绘制灰度直方图_python+opencv 灰度直方图及其二值化

    图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析.不过图像的直方图不具有空间特征. 图像的灰度直方图(histogram),就是将图像转化成灰度图像之后,统计各个像 ...

  9. opencv学习之直方图绘制

    图像直方图就是用表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数,可以借助观察该直方图了解如何调整亮度分布. 直方图意义如下: .直方图是图像中像素强度分布的图形表达式 .它统计了每一个 ...

最新文章

  1. 理解 CSS 布局和块级格式上下文
  2. 'numpy.float64' object cannot be interpreted as an integer
  3. HTML网页制作:[12]使用框架结构之frameset
  4. MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  5. 我用AI回怼美女汽车销售系列[yolo车牌识别](五) 完结
  6. OkHttp+Stetho+Chrome调试android网络部分(原创)
  7. js对文字的修饰 big() small() fixed() toUpperCase() toLowerCase()
  8. JavaWeb快速入门(一)——新建JavaWeb项目
  9. linux查询数据库归档日志,关于 Oracle 归档日志
  10. 在有n个学生的成绩表里,每条信息由姓名与分数组成,要求:1按分数高低次序,输出每个学生的名字,分数相同的为同一名次,2按名次输出每个学生的姓名与分数。
  11. 手机罗盘(指南针)校准方法
  12. 我是如何做技术分享的 ?
  13. 在家享受专业跑道,安全跑步高效健身,华为智选赤兔跑步机H1体验
  14. python计算乘积_python中矩阵运算(乘法和数量积)
  15. 华为WLAN技术:AC/AP 实验
  16. 微型计算机的主要性能指标(),微型计算机的主要性能指标
  17. android MPChart图标使用详解
  18. 谷歌计算机围棋程序,阿尔法狗教你下棋 谷歌上线AlphaGo围棋教学工具
  19. 超低功耗电源模块DCDC降压模块高效率3.3V/5V低静态效率超LM2596超MP1584EN低静态
  20. ForeSpider数据采集系统

热门文章

  1. 如何在网络视听行业建一扇内容安全大门?
  2. 【vue】vue +element 搭建项目,要求既支持pc端又支持移动端
  3. 中国红色菜刀去后门(过狗)
  4. 线程退出时执行函数,处理资源
  5. Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引
  6. 大型网站架构系列:负载均衡详解(4)
  7. 双机热备篇 VRRP与VGMP的故事(2)
  8. 删除可视图中的类不能彻底避免它重新被编译
  9. ssm校园帮代服务系统的设计与实现答辩PPT模板
  10. Python基础篇:用Python简简单单写个星空大战,可不能用来摸鱼啊~