FPGA图像处理系列——直方图均衡

本文深入解析直方图均衡化的中心思想,包括如何通过非线性拉伸调整图像灰度分布,使其在全灰度范围内均匀分布。同时,详细介绍了在FPGA上实现直方图操作的步骤,包括构建计数数组和累加数组,以及如何通过简单的变换映射像素值。最后,提供了一个实现代码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。

我们来看一个灰度图像,让n_i表示灰度i出现的次数,这样图像中灰度为i 的像素的出现概率是

p_x(i) = \frac{n_i}{n}, i\in {0,..., L - 1}

L 是图像中所有的灰度数,n 是图像中所有的像素数, p 实际上是图像的直方图,归一化到 0..1

把 c 作为对应于 p 的累计概率函数, 定义为:

 c(i) = \sum_{j=0}^i p_x(j)

c 是图像的累计归一化直方图。

我们创建一个形式为 y = T(x) 的变化,对于原始图像中的每个值它就产生一个 y,这样 y 的累计概率函数就可以在所有值范围内进行线性化,转换公式定义为:

y_i = T(x_i) = c(i)

注意 T 将不同的等级映射到 {0..1} 域,为了将这些值映射回它们最初的域,需要在结果上应用下面的简单变换:

y_i' = y_i \cdot(max - min) + min

上面描述了灰度图像上使用直方图均衡化的方法。

(以上内容摘自维基百科)

用FPGA实现直方图操作的思路如下:

1)构建大小为256、深度为19的数组cnt。cnt[ i ]的作用和px(i)类似,所不同的是,在每一帧图像中,cnt[ i ]并不是一个概率值,而是用来表示灰度值为 i 的像素个数。之所以深度为19,是因为cnt可能的最大值为640*480。

2)构建大小为256、深度为27数组sum。sum[ i ]的作用和c(i)类似,用来表示cnt[ i ]的累加和。例如,sum[5] = cnt[ 0 ] +  cnt[ 1 ] + cnt[ 2 ] +  cnt[ 3 ] + cnt[ 4 ];

3)当扫描至图像(0,0)点时,所有256个cnt清零;

4)在扫描图像过程中(除了第一个点以及最后一个点),构建case语句,根据输入的灰度值i,对cnt进行如下操作:cnt[ i ] <= cnt[ i ]+1;

输出像素值 <= sum[i]*255/(640*480);

5)当扫描至图像最后一个像素点时,对sum进行如下操作:

sum[ i ] = cnt[ 0 ] + cnt[ 1 ] + cnt[ 2 ] +……+cnt[ i-1 ] ;

整理思路后,发现写verilog并不是难事,只是重复的代码量比较大而已。

最后,附上源码链接:http://u.download.youkuaiyun.com/upload/success



评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值