type
status
date
slug
summary
tags
category
icon
password
Email
水寒江静,满目青山,载月明归。——黄庭坚《诉衷情》
文章首发于我的个人博客:欢迎大佬们来逛逛
图像直方图绘制
“ 在分析图像、物体和视频信息的时候,我们经常用直方图来表达我们关注的信息。直方图在计算机视觉中应用广泛。
例如,通过判断帧与帧之间边缘和颜色的统计量是否出现巨大变化,来检测视频中场景的变换。在数字图像处理中,通常使用的是灰度直方图,灰度直方图是一种计算代价非常小但很有用的工具,它概括了一幅图像的灰度级信息。
灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。直方图分布较广较均匀的图像对比度高,视觉效果好。
API介绍
绘制步骤
- 首先将图片转换为灰度图
- 使用
cvtColor
函数。
- 使用 calcHist 前的参数准备,其中包含几个重要的参数:
- channels,通道数,如果是灰度图,则是 1 通道;
- 此函数的关键:我们使用图像存储一个输出值(即上面的第二个函数原型),因此创建一个cv::Mat 来接收直方图的具体值(灰度图,只需一个即可,如果是rgb类型的,则需要分别传递给Mat类型的R,G,B来接受)。
- histSize:直方图区间,直接填 256
- ranges:统计像素区间,直接填 0,256
- 注意const的修饰符与二重指针
- 创建直方图,指定行和列,背景等信息
- 标准化:需要将 calcHist 操作后接收的Mat类型的数据进行标准化为 ,因为我们的 为绘制的最大高度,不能越界。
normalize
函数可以标准化数据为指定的区间内。
- 比例的映射,我们用 256个像素,但是实际上我们的绘制宽度为 ,因此我们指定每一个像素所占的宽度,以便于绘制。
cvRound(float(width) / float(256))
得到的结果为 2,因此一个像素在实际绘制中会占用两个宽度来绘制。
- 绘制直方图,并且填充颜色。
代码示例:绘制一个灰度直方图
注意:如果需要绘制 RGB 直方图,则需要使用
split
函数来分割 为 r,g,三种不同的Mat,然后分别存储在这三个中,然后分别绘制。- 作者:Yuleo
- 链接:https://www.helloylh.com/article/opencv12
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。