C++OpenCV下绘制灰度直方图

这篇具有很好参考价值的文章主要介绍了C++OpenCV下绘制灰度直方图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++OpenCV下绘制直方图
直方图的定义:灰度直方图是对一幅灰度图像素分布的统计。对于一幅8Bit量化的图像来说。就是统计在0~255各个灰度级上,像素点的个数或者密度。
在OpenCV库提供了 calcHist()方法用于得到图像的直方图。
具体函数的调用方法如下:
void cv::calcHist(const Mat*images,int nimages,const int *channels,InputArrary mask,OutputArrary hist,int dims,const int* histSize,const float **ranges,bool uniform=true,bool accumulate=false)
//参数说明
//images:带统计直方图的图像数组
//nimages:输入图像的数目
//channels:需要统计的通道索引数组 一般灰度图就是0通道
//mask:掩码 一般填Mat()
//hist:输出的统计直方图结果,是一个dims维度的数组。不过用OpenCV中Mat类型的变量存储
//dims:hist的列数、需要计算直方图的维度
//histSize:存放每个维度直方图数组的尺寸
//ranges:每个通道灰度值的取值范围
根据以上参数,设计了一个获取直方图Mat数组Hist的函数
//@para gray:需要统计的图   Hist:用于存放统计数据
void GetHist(Mat gray,Mat &Hist)    //统计8Bit量化图像的灰度直方图
{
    const int channels[1] = { 0 }; //通道索引
    float inRanges[2] = { 0,255 };  //像素范围
    const float* ranges[1] = {inRanges};//像素灰度级范围
    const int bins[1] = { 256 };   //直方图的维度
    calcHist(&gray, 1, channels,Mat(), Hist,1, bins, ranges);
}
C++OpenCV下绘制灰度直方图这里得gray为测试灰度图。看下运行完calcHist函数后,Hist的维数。
可以看到Hist就是一个256行1列Mat类型的变量,可以看做一个数组索引。
这样我们就可以根据这个Hist画图。
这里设计一个ShowHist函数,主要的步骤就是申请一块背景为纯黑的图像,再根据Hist的值转化为点坐标从而画出一个个白色的矩形以完成直方图的绘制。
void ShowHist(Mat &Hist)
{
    //准备绘制直方图
    int hist_w = 512;
    int hist_h = 400;
    int width = 2;
    Mat histImage = Mat::zeros(hist_h,hist_w,CV_8UC3);   //准备histImage为全黑背景色,大小为512*400
    for (int i = 0; i < Hist.rows; i++)
    {
         rectangle(histImage,Point(width*(i),hist_h-1),Point(width*(i+1),hist_h-cvRound(Hist.at<float>(i)/20)),
            Scalar(255,255,255),-1);
    }
    namedWindow("histImage", WINDOW_AUTOSIZE);
    imshow("histImage", histImage);
    //waitKey(0);
}
首先准备一幅512*400的全黑背景图histImage,接下来通过Hist.rows遍历每个灰度级的像素个数。通过Rectangle函数画出白色的矩形。最后的-1代表绘制的矩形是填充矩形。对于Rectangle,重点分析下两个Point的含义。
@param pt1 Vertex of the rectangle.
@param pt2 Vertex of the rectangle opposite to pt1 .
上面是官方给出的注释,pt1为矩形的一个顶点,pt2为矩形对角线上的另一个顶点。
首先看横坐标,一个矩形的横坐标长度应该为一个像素级所占的长度,这里我们假定一个像素级占长度为width=2。pt1的横坐标值为width*(i),pt2的横坐标值为width*(i+1);
再看纵坐标,首先需要明白图像的坐标系,它是这样的:
C++OpenCV下绘制灰度直方图
pt1的纵坐标为:hist_h-1相当于图像最下面,也就是矩形的左下角。pt2的纵坐标应该是矩形的右上角才对,hist_h-cvRound(Hist.at<float>(i)/20),cvRound是4舍5入,Hist.at<float>(i)取出在该像素级上像素点的个数,这个数字可能远远大于hist_h(512),因为直方图我们只希望看到图像像素级分布的大致,所以我们除以一个20保证不会超出图像的边界。
最后给出我主函数的调用:
int main(int argc,char *argv)
{
    Mat src,gray,hist;   //hist用于统计gray的直方图
    src=imread("2.jpg");
    cvtColor(src,gray,CV_BGR2GRAY);
    GetHist(gray,hist);
    ShowHist(hist);
    namedWindow("gray");
    imshow("gray",gray);
    waitKey(0);
    return 0;
}
结果:
C++OpenCV下绘制灰度直方图
总结分析:其实图像的直方图只能告诉我们图像像素级别的分布如何,可以定性的帮助我们判断图像对比度,以及亮度的分布情况,如果想通过直方图进行操作,还是得借助calcHist得到的Hist数组对其进行定量的操作。

文章来源地址https://www.toymoban.com/news/detail-499145.html

到了这里,关于C++OpenCV下绘制灰度直方图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【c++|opencv】二、灰度变换和空间滤波---2.直方图和均衡化

    every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?type=blog 图像直方图、直方图均衡化

    2024年02月06日
    浏览(47)
  • Opencv C++ 六、灰度变换:线性变换、灰度反转、对数变换、伽马变换、(自适应)直方图均衡化

    通过变换函数T将原图像像素灰度值r映射为灰度值s: s=T(r). 线性变换(亮度和对比度调整) : 原理:线性变换是一种简单的亮度和对比度调整方法,通过对每个像素的灰度级别应用线性变换公式来实现。对每个像素应用公式 output_pixel = input_pixel * alpha + beta ,其中 alpha 控制对

    2024年02月04日
    浏览(56)
  • OpenCV官方教程中文版 —— 直方图的计算,绘制与分析

    • 使用 OpenCV 或 Numpy 函数计算直方图 • 使用 Opencv 或者 Matplotlib 函数绘制直方图 • 将要学习的函数有:cv2.calcHist(),np.histogram() 什么是直方图呢?通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值(0 到 255),y 轴是图片中具有同一个灰度

    2024年02月06日
    浏览(47)
  • 【halcon】灰度直方图直观理解与应用

    横坐标:是 0~255 表示灰度值的范围 纵坐标:是在不同灰度值下像素的个数! 那么灰度直方图的本质就是统计不同灰度下像素的个数! 它的直观目的,就是查看灰度的分布情况! 全局的阈值分割 threshold  threshold (ImageChannel3, Regions, 248, 255) 选择一个灰度范围,分割出在次范围

    2024年02月10日
    浏览(76)
  • Python绘制直方图

    对于大量样本来说,如果想快速获知其分布特征,最方便的可视化方案就是直方图,即统计落入不同区间中的样本个数。 以正态分布为例 其中 bins 参数用于调控区间个数,出图结果如下 直方图函数的定义如下 除了 x 和 bins 之外,其他参数含义为 range 绘图区间,默认将样本

    2024年02月05日
    浏览(44)
  • excel绘制直方图

    Excel 2016直方图使用指南 excel绘制各种曲线十分方便,可以通过代码将计算的数据输出到excel里面,然后通过excel的插入标签,绘制各种需要的曲线。 对于直方图,横坐标是分布区间,纵坐标是这个区间内数值的频数(也就是个数),通过直方图,可以直观的看出一组数据的分

    2024年02月10日
    浏览(50)
  • 【OpenCV学习笔记30】- OpenCV 中的直方图 - 直方图 - 4:直方图反投影

    这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔记的请麻烦帮我关注

    2024年03月26日
    浏览(55)
  • 如何绘制出图像的色素分布直方图

    如图,可以展示出我们的图像的颜色分布直方图,表明的图像的亮和暗 这里我们对我们的灰色图片和彩色图片进行了直方图显示 注意:记得下载 上面代码里面的color=\\\'b\\\'表示我们的直方图是蓝色的,这里可以用b代表blue 会出现这样一个程序 显示的直方图 加入了 效果:

    2024年01月18日
    浏览(42)
  • 【opencv】教程代码 —Histograms_Matching(2)计算直方图、直方图比较、直方图均衡、模板匹配...

    计算直方图 直方图比较 图像进行直方图均衡化处理 模板匹配 1. calcHist_Demo.cpp 计算直方图 这段代码的功能是加载图像,分离图像的三个颜色通道,然后分别计算这三个通道的直方图,绘制出来并显示结果。直方图是图像中像素值分布的图形表示,可以用于图像分析或图像处

    2024年04月11日
    浏览(51)
  • Python 实例|matplotlib|绘制直方图(各参数样例)

    matplotlib.pyplot.hist 的官方文档:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.html 这个方法使用 numpy.histogram 首先将 x 中的数据分桶并统计每个桶中的元素数量,接着使用条形图绘制这个分布。 函数参数、含义及样例如下: 参数列表及样例 x : 数据集对象(必填) (n,) arr

    2024年02月07日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包