基于FPGA的图像处理之直方图均衡

时间:2025-09-17  作者:Diven  阅读:0

最近一直在用FPGA调图像处理相关的算法,主要是集中在图像增强和增晰方面。

基于FPGA的图像处理之直方图均衡

现在来介绍一个复杂度不高,但确实也还比较好用的图像增强算法-直方图均衡。

直方图均衡的作用,上面也说了,是图像增强,那是增强什么呢?是增强图像的对比度。

先来看下在Matlab中实现直方图均衡的效果吧。

图片比较随意,直接对电脑桌面截了一张图,大家应该能有一个直观的感受,知道直方图均衡的作用和效果了吧!    

直方图均衡在对一些低照度图像增晰、去雾处理等应用场景,效果还是挺不错的。

对于直方图均衡的实现步骤,在网上一搜一大把,大部分讲的都是用Matlab或者C语言的代码实现。  
那我们也先来结合Matlab代码来介绍一下直方图均衡的实现步骤,之后再说说用FPGA是怎么做的。

 

% [ 第一步 ] 统计每个像素值出现次数count = zeros(1, 256);for i = 1 : Rfor j = 1 : Ccount(1, fx(i, j) + 1) = count(1, fx(i, j) + 1) + 1; endend
第一步,是对于一整幅图像进行像素值统计,当然咱们这是对灰度图像进行直方图均衡,所以统计的像素值大小范围是 0-255。  
这一步是统计 0-255 这 256 个像素点的值,在整幅图像中出现的次数。
% [ 第二步 ] 统计每个像素值出现的概率, 得到概率直方图T = zeros(1, 256);T = double(T); count = double(count);for i = 1 : 256    T(1, i) = count(1, i) / (R * C); % R 和 C为图像长和宽end
  第二步,将像素点统计出来的出现次数除以图像的总像素点,计算出各个灰度值出现的概率。

 

 

% [ 第三步 ] 求累计概率,得到累计直方图for i = 2 : 256 T(1, i) = T(1, i - 1) + T(1, i);end
第三步,单看代码,似乎不太好理解,这一步算的累计概率是怎么算的呢?

 

第 1 个结果,像素值为 0 的概率 + 像素值为 1 的概率; 第 2 个结果,像素值为 0 的概率 +像素值为 1 的概率 + 像素值为 2 的概率; 。。。 第 255 个结果,像素值为 0 的概率 +像素值为 1 的概率 + 像素值为 2 的概率 + ... + 像素值为 255 的概率。其实就是等于 1 。

其实这一步,总共会得出 256 个结果,还要算上像素值为 0 的概率,因为在第二步中已经算出来了单个像素点的概率,所以就没有再次算了, for 循环里面写的就是 2 - 256 了。

 

% [ 第四步 ] 完善映射函数for i = 1 : 256 T(1, i) = T(1, i) * 255;end

 

第四步,是完善映射函数。
从原图到直方图均衡化之后的图像,之间肯定存在一个函数 f(x),类似的 img_out = f(img_in) 。  
也就是从原图进行直方图均衡需要有一个函数表示之间的关系。
而这一步就是完善这个函数,其实就是对第三步得出的累计概率分布结果 * 255 。    
注意,这个映射函数其实是一个离散值,总共有 256 个值。

 

% [ 第五步 ] 完成每个像素点的映射fy = double(fx);for i = 1 : Rfor j = 1 : Cfy(i, j) = T(1, fy(i, j) + 1); endend

 

这是最后一步了,把原图经过第四步的映射函数,得到直方图均衡化之后的图像结果。

这一步,给大家再解释一下,其实就是把输入图像的像素值,作为映射函数这个一维数组相应元素的下标,去找到对应下标元素的值。并把这个值作为直方图均衡化的结果输出。

对于直方图均衡的处理,从流程上来看,其实是很简单的。  
当然对于有些书,会给你列出一堆的公式。作为一个毕业多年的老油条,对那些公式早就不敏感了。  
所以在文章里面,就直接开门见山的给大家说步骤了,这也算是对那些也像我这种对数学公式早已不感冒的朋友的一份爱惜吧!

对于原理部分,贴着 Matlab 代码说完了,那就是再说说在FPGA里面的实现步骤吧。

用FPGA来实现直方图均衡,我把上面的步骤稍微做了一点改变。  
第一步,依然统计0-255这256个像素点出现的次数。
第二步,没有计算各个像素点出现的概率,而是统计各个像素点出现的累计次数。

也是得到 256 个结果: 第 1 个结果,像素点为0出现的次数; 第 2 个结果,像素点为 0 出现的次数 + 像素点为1出现的次数; 第 3 个结果,像素点为 0 出现的次数 + 像素点为1出现的次数 + 素点为2出现的次数;

依次类推。

第三步,将第二步的结果 *255*2,就是比刚刚在 Matlab 中,多乘上了 2 ,这样做的目的,是因为在FPGA里面没有进行小数运算,所以先乘上 2 , 为后面的运算稍稍提高一下精度。

第四步,将第三步的结果除以整幅图片的像素点个数。

第五步,完成直方图均衡对输入像素点值的映射。  
这里要注意,因为摄像头那边的数据是连续过来的,如果像 Matlab 那样,先计算好当前图像的映射函数,再把当前图像作为输入,给到映射函数再得出直方图均衡的结果,这个时间是等不起的。  
所以这里我进行了一定的简化,我是以前一帧图像完善的映射函数作为当前帧图像的映射函数。  
这种做法,其实是完全可行的,咱们摄像头图像的帧速率一般是 30fps ,也就是在 1 秒钟里面可以有 30 幅图像,只要摄像头采集的画面变化速度在一定范围里面,咱们这样做是完全 OK 的,而且我用的摄像头是MT9V034,是全局曝光的。

是的,这就是我这几天刚刚组装好的 MT9V034 摄像头,打样了几片PCB,装上了 CS 大镜头,OV5640 瞬间 变身小弟,哈哈!!!感觉绿色的板子看着有点low,之后再换成黑色阻焊看看!  

对于图像的增强效果还是很明显的。

在调试直方图均衡这个算法的时候,刚开始调的很郁闷。

完全搞不明白为啥,极其郁闷。

反复检查了代码,也跑了仿真,没发现问题啊。 

难不成直方图均衡后的效果就是这个鬼样子。然后也在网上搜,看看有没有用FPGA做直方图均衡后的效果图,来比较一下。

搜了半天,找到的全都是用Matlab 或者其什么软件语言做的效果图,我要这些效果图干啥,劳资这边多的是!

之后又在知网下了好几篇FPGA的直方图均衡的论文,想看看论文里面有没有效果图,大多又是Matlab的效果图,无语。。。

郁闷了一晚上,到第二天上午,把脑袋放空,重新归零。回忆这种现象,想起来在之前调的一个图像增强算法也出现了类似的效果。  
一时记不起来当时是怎么解决的,非常后悔,要是当时写了一份调试记录该多好。划重点,写调试记录,是非常重要的!

想了很久,当时出现这种情况,似乎是VGA显示的数据,对要显示的数据源截位有问题。  
举个例子,VGA要显示灰度图像的8个bit,但是你要给VGA显示的图像数据有16个bit,理应是把16bit的高8bit给VGA显示,但是却把[12:5] 这8个bit 给了VGA显示。

但是这个问题,是在哪个地方出现了截位的问题呢?又想了很久,怀疑是除法器的IP Core。

除法器的dout_tdata,这个端口,包含了商的结果和小数部分,那商的结果也就是整数部分占多少bit,小数部分占多少bit?

在代码里面,在对div_dout这个信号去把商的结果拿出来,在这个环节出现了截位的问题。果真,改了之后,结果马上正常了。


审核编辑:刘清

猜您喜欢

高精密贴片电阻在电子电路中扮演着至关重要的角色,其阻值精度直接影响电路的性能和稳定性。一般来说,高精密贴片电阻的精度等级可以达到±0.01%、±0.05%、±0...
2024-11-26 11:29:20

随着电动汽车、电动自行车等新能源交通工具的普及,电池作为其核心部件,其安全性和使用寿命备受关注。而BMS电池管理系统,正是保障电池安全稳定运行,延长其使用寿命的...
2024-06-27 00:00:00

现代科技飞速发展的背景下,各类配件在设备性能提升中扮演着越来越重要的角色。本文将重点介绍“Accessories_20.32X6.62MM_TM”这一特定配件,...
2025-02-27 05:06:09

现代电子技术中,二极管作为重要的半导体器件,应用于整流、开关和信号调制等领域。随着科技的进步,碳化硅(SiC)二极管逐渐崭露头角,与传统的肖特基二极管相比,展现...
2025-04-05 04:31:40

液位传感器是工业自动化中不可少的设备,其性能参数直接影响测量的精确性和可靠性。测量范围是液位传感器的重要参数,通常以米或厘米表示,决定了其能够监测的液位高度。精...
2012-01-26 00:00:00

薄膜电阻因其高精度、稳定性好和可靠性强等特点,被应用于各类电子设备中。TOKEN(德键)作为一家知名的薄膜电阻制造商,凭借其先进的技术和高品质的产品,赢得了市场...
2014-11-22 17:53:36


焊缝量规是焊接行业中不可少的工具,其主要作用是检测焊缝的尺寸和质量。不同类型的焊缝量规在设计和功能上存在一些显著区别。常见的焊缝量规有标准型和特殊型。标准型量规...
2015-09-10 00:00:00

许多人想用PoE供电交换机简化网络布线,特别是连接网络摄像机时。但如果你使用的是普通的网络摄像机,而不是PoE摄像机,事情就没那么简单了。本文将为你解答PoE供...
2024-10-09 00:00:00

现代产品设计中,配件的选择对于提升产品的整体价值和用户体验非常重要。本文将探讨“Accessories_13.9X9.5MM_TM”这一特定配件的重要性,以及在...
2025-04-23 13:31:09