下面是我参考《opencv3编程入门》写的绘制一维直方图的代码

using namespace cv;
using namespace std;
#define byte uchar
#define TYEPE_GRAY 0
#define TYEPE_RGB 1
/*--------------------------绘制RGB三色一维直方图-------------------------------------*/
Mat My_Rraw_histogram(Mat* srcImage,int type)  //输入:要处理的灰度图   输出:该图像的直方图
{if (type == TYEPE_GRAY)  //一维灰度直方图绘制{//【1】将原图转化为灰度图Mat gray_srcImage;cvtColor(*srcImage,gray_srcImage, COLOR_BGR2GRAY);//【2】定义变量MatND dstHist;int dims = 1;  //需要计算的直方图的维数float grayranges[] = { 0,255 };const float* ranges[] = { grayranges }; //这里需要为const类型int size = 256;   //表示的是将统计的灰度值分成的等份int Height = 256;int channels = 0; //灰度图只有一个0通道//【3】计算图像直方图calcHist(srcImage, //输入数组1, //数组个数&channels, //通道索引Mat(),//不使用掩膜dstHist, //输出的目标直方图dims, //需要计算的直方图的维数&size, //存放每个维度的直方图尺寸的数组ranges); //每一维数值的取值范围 int scale = 1;  //scale 每一个像素占的格数Mat dstImage(size * scale, size, CV_8U, Scalar(0));  //长 :size*scale ,宽:size ,值为0//【4】获取最大值和最小值double minVal = 0;double maxVal = 0;minMaxLoc(dstHist, &minVal, &maxVal, 0, 0);  //获得直方图中最大值和最小值//【5】绘制出直方图int hpt = saturate_cast<int>(0.9 * Height);   //saturate_cast 是溢出保护    大概意思 :if(data<int的负范围)  data = 负最大; else if (data > int的正范围) data = int 正最大;for (int i = 0;i < 256;i++){float binVal = dstHist.at<float>(i);int realVal = saturate_cast<int>(binVal * hpt / maxVal);  //在图像上的高度 = 像素数目/像素值最大数目 * 0.9*256   这里0.9是为了削减图像像素高度,因为最大的时候会触及顶端不美观rectangle(dstImage, Point(i * scale, Height - 1), Point((i + 1) * scale - 1, Height - realVal), Scalar(255));//要进行绘制的目标图像 矩形的左下顶点 矩阵对角线上的右上顶点 线条的颜色(RGB)或亮度(灰度图)  一共要绘制256个矩形}return dstImage;}else if (type == TYEPE_RGB){//【1】定义变量MatND redHist,greenHist,blueHist;int dims = 1;        //需要计算的直方图的维数float grayranges[] = { 0,256 };const float* ranges[] = { grayranges };   //这里需要为const类型int size = 256;          //表示的是将统计的灰度值分成的等份int channels_r[] = { 2 };    int channels_g[] = { 1 };  int channels_b[] = { 0 };  //疑问 : RGB图像的R、G、B是对应channel[0]、channel[1]、channel[2]还是对应channel[2]、channel[1]、channel[0] ?//经过验证是channel[2]、channel[1]、channel[0]//【2】计算图像直方图//--------------------red--------------------------calcHist(srcImage,   //输入数组1,    //数组个数channels_r,   //通道索引Mat(),//不使用掩膜redHist, //输出的目标直方图dims, //需要计算的直方图的维数&size, //存放每个维度的直方图尺寸的数组ranges,//每一维数值的取值范围    true,//指示直方图是否均匀的标识符,true表示均匀的直方图false); //累计标识符,false表示直方图在配置阶段会被清零//--------------------green--------------------------calcHist(srcImage,   //输入数组1,    //数组个数channels_g,   //通道索引Mat(),//不使用掩膜greenHist,   //输出的目标直方图dims, //需要计算的直方图的维数&size, //存放每个维度的直方图尺寸的数组ranges,//每一维数值的取值范围    true,//指示直方图是否均匀的标识符,true表示均匀的直方图false); //累计标识符,false表示直方图在配置阶段会被清零//--------------------blue--------------------------calcHist(srcImage,    //输入数组1,    //数组个数channels_b,   //通道索引Mat(),//不使用掩膜blueHist,    //输出的目标直方图dims, //需要计算的直方图的维数&size, //存放每个维度的直方图尺寸的数组ranges,//每一维数值的取值范围    true,//指示直方图是否均匀的标识符,true表示均匀的直方图false); //累计标识符,false表示直方图在配置阶段会被清零//【3】获取最大值和最小值double minVal_r = 0, minVal_g = 0, minVal_b = 0;double maxVal_r = 0, maxVal_g = 0,maxVal_b = 0;minMaxLoc(redHist, &minVal_r, &maxVal_r, 0, 0);        //获得r直方图中最大值和最小值minMaxLoc(greenHist, &minVal_g, &maxVal_g, 0, 0);       //获得g直方图中最大值和最小值minMaxLoc(blueHist, &minVal_b, &maxVal_b, 0, 0);        //获得b直方图中最大值和最小值int scale = 1;     //scale 每一个像素占的格数int Height = 256; //直方图高度Mat dstImage(Height, size*3, CV_8UC3, Scalar(0,0,0));        //长 :size*scale ,宽:size*3 ,值为0  将三个直方图横放在一起//【4】绘制出直方图int hpt = saturate_cast<int>(0.9 * Height);           //saturate_cast 是溢出保护    大概意思 :if(data<int的负范围)  data = 负最大; else if (data > int的正范围) data = int 正最大;for (int i = 0;i < 256;i++){float binVal_r = redHist.at<float>(i);float binVal_g = greenHist.at<float>(i);float binVal_b = blueHist.at<float>(i);//疑问:是否存在一张图片中maxVal_r or maxVal_g or maxVal_b 有一个值为0?这样算出来的值将会是0/0, 而实际值应该是 0int intensityl_r = saturate_cast<int>(binVal_r * hpt / maxVal_r);     //在图像上的高度 = 像素数目/像素值最大数目 * 0.9*256   这里0.9是为了削减图像像素高度,因为最大的时候会触及顶端不美观int intensityl_g = saturate_cast<int>(binVal_g * hpt / maxVal_g);int intensityl_b = saturate_cast<int>(binVal_b * hpt / maxVal_b);rectangle(dstImage, Point(i * scale, Height - 1), Point((i + 1) * scale - 1, Height - intensityl_r), Scalar(0,0,255));rectangle(dstImage, Point((i+size)* scale, Height - 1), Point((i + size + 1)* scale - 1, Height - intensityl_g), Scalar(0,255,0));rectangle(dstImage, Point((i + 2*size)* scale, Height - 1), Point((i + 2*size + 1)* scale - 1, Height - intensityl_b), Scalar(255,0,0));//要进行绘制的目标图像 矩形的左下顶点 矩阵对角线上的右上顶点 线条的颜色(RGB)或亮度(灰度图)  一共要绘制256个矩形}return dstImage;}
else{}
}
//主函数
int main()
{//【1】载入原图Mat srcImage = imread("D:\\opencv_picture_test\\RGB纯色图\\red.jpg", 2|4);            //原图//Mat srcImage = imread("D:\\opencv_picture_test\\JQ\\JQ14.jpg", 2 | 4);         //原图namedWindow("原图", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩窗口imshow("原图", srcImage);if (srcImage.empty()){printf("Could not find the image!\n");return -1;}Mat dstImage = My_Rraw_histogram(&srcImage, TYEPE_RGB);namedWindow("一维直方图", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩窗口imshow("一维直方图", dstImage);waitKey(0);return 0;
}

下面是代码实现的效果


纯红时,cahnnel【2】值为255的像素个数最多,其他为0,channel【1】和channel【0】值为0的像素个数最多,其他为0。

Opencv一维直方图的绘制相关推荐

  1. python绘制灰度图片直方图-opencv+python 统计及绘制直方图

    灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图. 统计直方图数据 首先要稍微理解一些与函数相关的术 ...

  2. 【opencv】直方图-3:二维直方图(一维灰度强度,二维色相饱和度,)

    4_10_3_直方图3:二维直方图 - OpenCV中文官方文档 学习查找和绘制2D直方图. 前情提要 一维直方图仅考虑一个特征,即像素的灰度强度值. 二维直方图要考虑两个特征. 通常,它用于查找颜色 ...

  3. OpenCV中直方图的计算和绘制

    OpenCV中直方图的计算和绘制 主要记录一下几个关键的API: cvRound(输入一个浮点数 );//返回一个整型数,取整的方法为四舍五入 split(输入多通道图像,数组或者vector变量. ...

  4. 【ROOT from CERN】——TH1绘制一维直方图

    本篇文章具体介绍如何绘制出一张最简单的具备齐全要素的一维直方图,以及其各个要素最基本的绘制和修改方法. 一.创建直方图 1.直方图主体 (1)利用构造函数构造一维直方图 构建固定bin宽的直方图如下示 ...

  5. OpenCV之直方图绘制(calcHist函数详解)

    目录 1.直方图的定义 2.calcHist()函数说明 3.绘制直方图 3.1 读取原图像并检查图像是否读取成功 3.2 定义直方图参数并计算直方图 3.3 绘制直方图 4.关于BGR直方图的绘制 ...

  6. 【图像处理】——图像灰度直方图的绘制(直接调用函数和自定义函数)

    目录 一.灰度直方图概念 二.直接调用opencv的函数caclHist() 1.函数介绍 2.实例 (1)绘制全局直方图 (2)绘制局部的直方图 ​ 三.自定义函数进行灰度直方图的绘制 1.代码 2 ...

  7. opencv——图像直方图与反向投影

    引言 在图像处理中,对于直方图这个概念,肯定不会陌生.但是其原理真的可以信手拈来吗? 本文篇幅有点长,在此列个目录,大家可以跳着看: 分析图像直方图的概念,以及opencv函数calcHist()对于 ...

  8. OpenCV-Python教程:直方图及其绘制(calcHist)

    原文链接:http://www.juzicode.com/opencv-python-histogram-calchist-draw-hist 返回Opencv-Python教程 图像的直方图反映的是 ...

  9. OpenCV 灰度直方图

    什么是直方图? 直方图是对图像的另一种解释.通过直方图你可以对整幅图像的灰度分布有一个整体的了解.直方图的x轴是灰度值,y轴是图片中具有统一灰度值得点的数目. 直方图中的两个定义: BINS:一个小组 ...

最新文章

  1. android锁屏流程_Android开机锁屏流程分析
  2. numpy维度交换_15年!NumPy论文终出炉,还登上了Nature
  3. 大牛都会用的 IDEA 调试技巧!!!
  4. 分析单点登录cas的解决方式
  5. 走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧
  6. java intfilter_Java IntStream filter()用法及代码示例
  7. java null equals_Java null检查为什么使用==代替.equals()
  8. 添加到界面前获取尺寸
  9. mysql之主从复制
  10. matlab接触封装,MATLAB如何解除封装
  11. gogo/protobuf proto.GoGoProtoPackageIsVersion2、proto3 版本 不一致
  12. MyBatis详解(一):入门程序
  13. 小程序支持HTML标签
  14. 重磅:Vue 官网竟然有免费的中文视频教程了
  15. UDS诊断故障码及诊断服务介绍(14h, 19h, 85h)
  16. 球弹跳10次的计算c语言,C/C++编程学习 - 第6周 ⑤ 球弹跳高度的计算
  17. 605元买了Java教程自学半年后…… How2J怎么样?我的Java自学心得
  18. 【Java】jar解压后重新打成jar,不依靠开发工具
  19. 关于用友T3 Automation错误(-2147024770)
  20. 毕向东—Java基础知识总结(超级经典)

热门文章

  1. java实现儿时的超级玛丽游戏
  2. 面试用涉及到的jvm常见的面试题(一)
  3. 封装cookie设置和获取的简易方法
  4. Html和websocket初识
  5. HTML的display属性将行内元素、块状元素、行内块状元素互相转换以及三者的区别
  6. 为何要清除浮动?如何清除?
  7. ASP.NET Core Razor Pages
  8. c语言 static的用法
  9. leecode 题解 || Merge k Sorted Lists 问题
  10. note05-计算机网络