一、环境

OpenCV3.4.1

VS2015

二、代码

#include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#define cvQueryHistValue_1D( hist, idx0 )  ((float)cvGetReal1D( (hist)->bins, (idx0)))
void FillWhite(IplImage *pImage)
{cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage->width, pImage->height), CV_RGB(255, 255, 255), CV_FILLED);
}
// 创建灰度图像的直方图
CvHistogram* CreateGrayImageHist(IplImage **ppImage)
{int nHistSize = 256;float fRange[] = { 0, 255 };  //灰度级的范围  float *pfRanges[] = { fRange };CvHistogram *pcvHistogram = cvCreateHist(1, &nHistSize, CV_HIST_ARRAY, pfRanges);cvCalcHist(ppImage, pcvHistogram);return pcvHistogram;
}
// 根据直方图创建直方图图像
IplImage* CreateHisogramImage(int nImageWidth, int nScale, int nImageHeight, CvHistogram *pcvHistogram)
{IplImage *pHistImage = cvCreateImage(cvSize(nImageWidth * nScale, nImageHeight), IPL_DEPTH_8U, 1);FillWhite(pHistImage);//统计直方图中的最大直方块float fMaxHistValue = 0;cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL);//分别将每个直方块的值绘制到图中int i;for (i = 0; i < nImageWidth; i++){float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //像素为i的直方块大小int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nImageHeight);  //要绘制的高度cvRectangle(pHistImage,cvPoint(i * nScale, nImageHeight - 1),cvPoint((i + 1) * nScale - 1, nImageHeight - nRealHeight),cvScalar(i, 0, 0, 0),CV_FILLED);}return pHistImage;
}
int main(int argc, char** argv)
{const char *pstrWindowsSrcTitle = "原图(https://blog.csdn.net/Aidam_Bo)";const char *pstrWindowsGrayTitle = "灰度图(https://blog.csdn.net/Aidam_Bo)";const char *pstrWindowsHistTitle = "直方图(https://blog.csdn.net/Aidam_Bo)";// 从文件中加载原图IplImage *pSrcImage = cvLoadImage("test.jpg", CV_LOAD_IMAGE_UNCHANGED);IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);// 灰度图cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);// 灰度直方图CvHistogram *pcvHistogram = CreateGrayImageHist(&pGrayImage);// 创建直方图图像int nHistImageWidth = 255;int nHistImageHeight = 150;  //直方图图像高度int nScale = 2;IplImage *pHistImage = CreateHisogramImage(nHistImageWidth, nScale, nHistImageHeight, pcvHistogram);// 显示cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsGrayTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsHistTitle, CV_WINDOW_AUTOSIZE);cvShowImage(pstrWindowsSrcTitle, pSrcImage);cvShowImage(pstrWindowsGrayTitle, pGrayImage);cvShowImage(pstrWindowsHistTitle, pHistImage);cvWaitKey(0);cvReleaseHist(&pcvHistogram);cvDestroyWindow(pstrWindowsSrcTitle);cvDestroyWindow(pstrWindowsGrayTitle);cvDestroyWindow(pstrWindowsHistTitle);cvReleaseImage(&pSrcImage);cvReleaseImage(&pGrayImage);cvReleaseImage(&pHistImage);return 0;
}

注意:这里用到函数 cvQueryHistValue_1D是OpenCV2的,在OpenCV3中没有这个函数,笔者使用的OpenCV是3.4.1版本,所以定义宏来使用cvQueryHistValue_1D:

#define cvQueryHistValue_1D( hist, idx0 )  ((float)cvGetReal1D( (hist)->bins, (idx0)))

三、结果展示

灰色直方图

OpenCV学习——绘制图像灰色直方图相关推荐

  1. opencv学习---计算图像的水平积分投影和垂直积分投影

    opencv学习---计算图像的水平积分投影和垂直积分投影 标签: opencv水平积分投影垂直积分投影 2016-12-07 18:48 1806人阅读 评论(1) 收藏 举报 分类: opencv ...

  2. opencv学习笔记21:直方图和掩膜 原理及其应用

    直方图概念 如图:下面黑色图为上面图的直方图 横坐标:图像中各个像素点的灰度级 纵坐标:具有该灰度级的像素个数. 归一化直方图 横坐标:图像中各个像素点的灰度级 纵坐标:出现该灰度级的概率. DIMS ...

  3. OpenCV学习(二十) :直方图匹配、对比:calcHist(),minMaxLoc(),compareHist()

    直方图匹配.对比:calcHist ,minMaxLoc,compareHist 1.calcHist()函数 2.归一化:normalize()函数 3.minMaxLoc()函数 4.compar ...

  4. OpenCV学习——绘制OpenCV徽标

    今天看到一个关于OpenCV的练习题,用绘图功能创建OpenCV的徽标. 关于OpenCV的绘图功能,在下面这篇笔记里写过了,这里不再多写,直接上代码!OpenCV学习--绘图功能_笨小古的博客-CS ...

  5. OpenCV学习笔记五:直方图

    图像由不同颜色值的像素组成,像素值在图像中的分布情况是图像的一个重要特征. 一.计算图像的直方图 直方图是一个简单的表,它给出了图像中各个像素值的数目(归一化后则为相应的比例),在OpenCV中可以使 ...

  6. OpenCV学习(2)——图像的数据格式BGR

    OpenCV学习(2)--图像的BGR格式解读 1. opencv读取的图片数据格式 2. BGR含义 1. opencv读取的图片数据格式 opencv读取的图片数据格式为numpy的nparray ...

  7. 【opencv学习】图像特征检测

    import cv2 import numpy as np import matplotlib.pyplot as plt# 什么是特征? # 当你看到芒果图像时,如何识别它是芒果? # 通过分析颜色 ...

  8. 生成并绘制图像的直方图

    工具箱中用于处理图像直方图的核心函数是imhist,基本语法如下: h=imhist(f,b) f-------输入图像 h-------直方图 b-------形成直方图的"统计堆栈&qu ...

  9. Opencv学习笔记——图像伪色彩增强

    以下均为github上opencv的个人学习笔记,原路径如下: https://github.com/JimmyHHua/opencv_tutorials 源码示例: import cv2 as cv ...

最新文章

  1. 自动驾驶的摩尔定律:无人驾驶的最终实现时间或在2035年丨厚势汽车
  2. 打造Ubuntu下的SLAMP
  3. jdk1.8新特性(四)——Optional
  4. dbeaver导出excel文件_vue将数据导出为excel文件就是如此简单
  5. 女生适合学python_Python适合女生学习吗?
  6. 【转】项目面试-如何介绍自己的项…
  7. 可视化理解卷积神经网络 - 反卷积网络 - 没看懂
  8. 数据结构期末复习第一章绪论
  9. 线性代数及其matlab应用课后题答案,线性代数课后习题答案全)习题详解.docx
  10. 指数函数用计算机怎么计算器,万能计算器怎么使用 使用科学计算器方法
  11. 戒指的戴法,终于收齐了!
  12. 根据传入当前页码及每页数量进行查询
  13. PS怎么把图片处理的更清晰
  14. 思维导图、流程图制作工具ProcessOn的使用
  15. Don’t Touch What Matters: Task-Aware Lipschitz Data Augmentationfor Visual Reinforcement Learning
  16. 批量修改图片的后缀名以及删除相同的符号
  17. 阿里巴巴年度技术总结 - 人工智能在搜索的应用和实践
  18. LCD LED TN IPS等常见的显示器技术名称
  19. 免费生成微信小程序的经验
  20. Bitstream Vera Sans Mono 编程字体安装

热门文章

  1. java长连接心跳包_socket中的短连接与长连接,心跳包示例详解
  2. java基本数据类型填空题_java基本数据类型练习题
  3. AngularJS.directive系列:嵌套directive的通讯及scope研究
  4. CentOS禁用root用户远程登录
  5. Maven Oracle JDBC
  6. 三维点云学习(3)1-聚类数学理论
  7. ORA-06413 连接未打开的处理办法【独家办法】
  8. 用RT Server Customizer定制Windows 2008 R2安装光盘
  9. Oracle数据库基础知识(一)
  10. try catch异常后会执行后面的代码吗_Java的异常体系