February 14, 2024

直方图统计和直方图均衡算法

一、图像的直方图

  直方图其实就是柱状图。对于一个图像而言,每一个像素都有一个对应的灰度值。一个图像的灰度直方图横坐标为灰度,纵坐标为某灰度像素的数量。对于常用的RGB-888格式的图像,每一个颜色的数值范围均为 ,即 ,对于灰度图,横坐标的取值范围(能够显示的灰度等级,也反映了摄像头获取图像颜色的精确程度)也是 Histogram of Digital Image

  图像的灰度直方图可以反映出图像的以下信息: 1. 亮度信息:比较亮的图像柱状图的纵坐标主要分布在右侧,比较暗的图像柱状图主要分布在左侧。 2. 对比度信息:低对比度的图像柱状图分布较为集中,高对比度的图像柱状图分布较为分散。如下图所示,对比度越低,各个像素点的灰度差异较小,柱状图分布更集中,分辨图像信息更困难。image2

二、直方图均衡

  直方图均衡即将图片的灰度直方图“拉伸和平均”的操作,来增强图像的对比度。在拉伸的过程中需要尽量保持每个灰度级的像素数量不变。直方图均衡算法可以由以下的公式给出:

​ 上式中,为图像的宽和高,表示输入图像的灰度等级的数目,在RGB-888格式中,表示某像素点的灰度级,表示变换后输出的灰度级大小(位置不变)。表示灰度等级为​的像素点的数量。注意:求和时不单单求特定灰度级的像素数,而是将该灰度级及其之前所有灰度级的像素数做一个累加(累积)。这个累积之后得到的直方图称为累积直方图。累积的结果乘以一个固定的系数,即可得到输出的灰度等级。均衡后的直方图是由处理后的图像得到的,而不是由某个公式直接得到的。

三、Verilog代码编写思路

​ 首先要得到每一帧图像中对应灰度级像素出现的次数。以RGB-888格式为例,可以定义256个计数器,遍历图像中的每一个像素,遍历到对应灰度等级的计数器依次+1,最后即可得到直方图均衡之前的灰度直方图。但是直接定义256个计数器很浪费FPGA资源,对于访问也不是很方便,于是我们可以通过定义一个RAM来实现。每一个灰度等级对应RAM的一个特定的地址。

3.1 如何使用RAM统计像素的灰度级

About this Post

This post is written by Yun Zhang, licensed under CC BY-NC 4.0.

#FPGA#Verilog