编程学习
🖼️C++OpenCV(12):图像直方图绘制
00 分钟
2023-8-14
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
💡
水寒江静,满目青山,载月明归。——黄庭坚《诉衷情》
🔆
文章首发于我的个人博客:欢迎大佬们来逛逛

图像直方图绘制

“ 在分析图像、物体和视频信息的时候,我们经常用直方图来表达我们关注的信息。直方图在计算机视觉中应用广泛。
例如,通过判断帧与帧之间边缘和颜色的统计量是否出现巨大变化,来检测视频中场景的变换。在数字图像处理中,通常使用的是灰度直方图灰度直方图是一种计算代价非常小但很有用的工具,它概括了一幅图像的灰度级信息。
灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。直方图分布较广较均匀的图像对比度高,视觉效果好。

API介绍

绘制步骤

  1. 首先将图片转换为灰度图
      • 使用 cvtColor 函数。
  1. 使用 calcHist 前的参数准备,其中包含几个重要的参数:
      • channels,通道数,如果是灰度图,则是 1 通道;
      • 此函数的关键:我们使用图像存储一个输出值(即上面的第二个函数原型),因此创建一个cv::Mat 来接收直方图的具体值(灰度图,只需一个即可,如果是rgb类型的,则需要分别传递给Mat类型的R,G,B来接受)。
      • histSize:直方图区间,直接填 256
      • ranges:统计像素区间,直接填 0,256
      • 注意const的修饰符与二重指针
  1. 创建直方图,指定行和列,背景等信息
  1. 标准化:需要将 calcHist 操作后接收的Mat类型的数据进行标准化为 ,因为我们的 为绘制的最大高度,不能越界。
      • normalize 函数可以标准化数据为指定的区间内。
  1. 比例的映射,我们用 256个像素,但是实际上我们的绘制宽度为 因此我们指定每一个像素所占的宽度,以便于绘制。
      • cvRound(float(width) / float(256)) 得到的结果为 2,因此一个像素在实际绘制中会占用两个宽度来绘制。
  1. 绘制直方图,并且填充颜色。

代码示例:绘制一个灰度直方图

注意:如果需要绘制 RGB 直方图,则需要使用 split 函数来分割 为 r,g,三种不同的Mat,然后分别存储在这三个中,然后分别绘制。
notion image
 

评论
  • Twikoo
  • Valine