玩转Zynq连载47——[ex66] MT9V034摄像头的图像直方图均衡处理
0赞
1系统概述
如图所示,这是整个视频采集系统的原理框图。
上电初始,FPGA需要通过IIC接口对CMOS Sensor进行寄存器初始化配置。这些初始化的基本参数,即初始化地址对应的初始化数据都存储在一个预先配置好的FPGA片内ROM中。在初始化配置完成后,CMOS Sensor就能够持续输出标准RGB的视频数据流,FPGA通过对其同步信号,如时钟、行频和场频进行检测,从而从数据总线上实时的采集图像数据。MT9V034摄像头默认初始化数据就能输出正常的视频流,因此FPGA中实际上未作任何IIC初始化配置。
在FPGA内部,采集到的视频数据先通过一个FIFO,将原本25MHz频率下同步的数据流转换到50MHz的频率下。接着将这个数据再送入写DDR3缓存的异步FIFO中,这个FIFO中的数据一旦达到一定数量,就会通过AXI HP0总线写入DDR3中。与此同时,AXI HP0总线也会读取DDR3中缓存的图像数据,缓存到FIFO中,并最终送往LCD驱动模块进行显示。LCD驱动模块不断的发出读图像数据的请求,并驱动液晶显示器显示视频图像。
本实例除了前面提到对原始图像做DDR3缓存和显示,还会在原始图像缓存到DDR3之前,会对当前图像做直方图统计(以帧为单位做统计),统计后的直方图结果进行均衡运算,获得新的图像映射数据,然后用于紧随着的下一帧图像,这样,后续的每一帧图像都会基于前一帧图像的直方图均衡运算结果计算出新的图像流,这个图像流通过AXI HP1总线写入到DDR3中。AXI HP1总线也会根据LCD显示模块的请求,读取处理后的图像进行显示。最终在VGA液晶显示器上,可以看到左侧图像是原始的图像,右侧图像是经过直方图均衡运算处理后的图像。
2图像直方图均衡处理
2.1 基本概念、原理与方法
直方图增强是调整图像直方图到一个预定的形状。例如,一些图像由于其灰度分布集中在较窄的取件,对比度很弱,图像细节看不清楚。此时,可采用图像灰度直方图均衡化处理,使得图像的对比度增大。加大图像动态范围,扩展图像对比度,使图像清晰,特征明显。
2.1.1 直方图的基本概念
图像直方图是用来表达一幅图像灰度级分布情况的统计表。它反映图像整体灰度值的分布情况,即图像的明暗情况和图像灰度级动态范围。
(1)直方图
直方图的全称为灰度统计直方图,是对图像每一灰度间隔内像素个数的统计,一般的间隔取为1。通常可用一个一维的离散函数来表示:
h(k)= nk , k = 0 , 1 , ... , L-1
其中,k表示图像中第k级灰度值;nk表示图像中第k级灰度值的像素个数。
如图所示为原始Lena灰度图像及其直方图。
(2)归一化直方图
用图像中像素的总个数N去除nk的每一个值,得到归一化直方图:
p(k)= nk/N k = 0 , 1 , ... , L-1
其中,p(k)表示一幅图像中灰度级k出现的频率。注意∑p(k)= 1。
图像的灰度直方图p(k)是一个一维离散函数,它给出了灰度取值k发生概率的一个估计,反应图像的灰度分布情况,是从总体上描述图像的一种方法。
2.1.2 直方图均衡的原理
直方图均衡可以将任意分布规律直方图的原始图像变换为具有均匀分布直方图的图像。
显然,直方图均衡化可以增加像素灰度值的动态范围,使每一灰度层次所占的像素个数尽量均等,可以改善图像的整体对比度。
下面在灰度值为模拟量的情况下讨论直方图均衡的算法原理。
1)基本思想
把原始图的直方图变换为均匀分布的形式,增加像素灰度值的动态范围以增强图像整体对比度。
2)均衡定义
将图像转换为具有均匀分布直方图的图像,这一过程叫做直方图均衡。一般认为直方图p(k)为常数的图像具有高对比度和多变的灰度层次。
对于每一个像素点(x,y),若原始图像灰度值为f(x,y)= k,经过增强处理后成为
g(x,y)= k',则增强变换函数为,其中k' = T(k)k = 0 , 1 , ... , L-1。
这样直方图均衡的问题就转化为:寻找一个变换函数T(r),使变换后图像灰度的概率密度函数ps(s)= 1,即期望输出图像中每一灰度级有相同的概率。
3)算法原理
设s可由T(r)得到,即
s = T(r) 0 ≤ r ≤ 1
变换T(r)需要满足两个条件:
(1)T(r)在区间0 ≤ r ≤ 1上为单值且单调递增;
(2)当0 ≤ r ≤ 1时,0 ≤ s ≤ 1。
相应的反变换为:
r = T -1(s) 0 ≤ s ≤ 1
反变换T -1(s)也满足上述两个条件。
以连续图像为例,分析T(r)变换推到的过程:
要求dr和ds区间内像素点个数是不变的,有:
当dr→0,ds→0,略去下标j,由于s = T(r),p(s)= 1,则最终得到直方图均衡化的灰度变换函数为:
S称作原始图像灰度级r的累积分布函数,可以验证S满足前述两个条件。如图显示了连续图像的直方图均衡原理。
2.1.3 直方图均衡的方法
1)均衡过程
对于数字图像,其直方图均衡化处理的计算步骤如下:
(1)统计原始图像的归一化直方图。
其中,rk是归一化的输入图像灰度级。
(2)用累积分布函数作变换函数进行图像灰度变换。
(3)建立输入图像与输出图像灰度级之间的对应关系,将变换后灰度级回复成原先的灰度级分为。
与连续形式不同,一般不能证明离散变换能够产生均匀概率密度函数的离散值(均匀直方图)。但是可以很容易看出,此算式的应用有展开输入图像直方图的一般趋势,因此均衡后的图像灰度级能够跨越更大的动态范围。
2)均衡示例
下面给出一个例子说明数字图像直方图均衡的处理过程。
设一幅图像的尺寸为64*64,像素的灰度层次L = 8(8个灰度等级)。则该图像共有
N = 64 * 64 = 4096个像素,如图为图像的直方图。
该图像共有4096个像素点,每个像素用3个比特表示,有0~7共8个灰度。原始图像的灰度分布情况从下表中可以看出,灰度的频率最小为0.02,最大为0.25。显然,直方图呈非均匀分布。
直方图均衡化处理的计算过程和结果如下表所示。
直方图均衡化处理的计算过程和结果
结果如下图所示。
3)图像直方图均衡后分析
(1)变换后直方图趋于平坦,灰度级减少,灰度进行了合并。
(2)变换后含有像素数多的几个灰级间隔被拉大了,压缩的只是像素数少的几个灰度级,实际视觉能够接收的信息量大大地增强了。
可见,直方图均衡处理可以使像素灰度的动态范围增加,有时能够明显改善图像的视觉效果。
下图给出四幅实际图像的直方图均衡效果。
可以看出,应用直方图均衡,明显改善了原始灰度级别动态范围较窄的图像的视觉效果。
2.2Matlab实现
对一幅给定图像做直方图均衡处理,我们的Matlab代码如下:
%load origin image
I = imread('Lena_gray.bmp');
%show origin image and its histogram diagram
figure(1)
subplot(2,2,1)
imshow(I)
title('Origin Image')
subplot(2,2,2)
imhist(I)
title('Histogram of Origin Image')
%histogram calculation
[height,width] = size(I);
nk = zeros(1,256);
for i = 1:height
for j = 1: width
nk(I(i,j)+1)=nk(I(i,j)+1)+1;
end
end
pk = zeros(1,256);
pk=nk./(height*width);
%histogram equalization
sk = zeros(1,256);
sk(1) = pk(1);
for i = 2:256
sk(i) = sk(i - 1) + pk(i);
end
kt=zeros(1,256);
kt = uint8(255 .* sk);
F=zeros(size(I));
for i = 1:height
for j = 1: width
F(i,j) = kt(I(i,j)+1);
end
end
%% output kt
M = F';
fidkt = fopen('image_out_hex.txt', 'wt');
fprintf(fidkt, '%x\n', M);
fidkt = fclose(fidkt);
%show image after hitogram equalization
F=uint8(F);
subplot(2,2,3)
imshow(F)
title('Histogram Equalization Image')
subplot(2,2,4)
imhist(F)
title('Image of Histogram Equalization Image')
滤波效果如下。可以看到原图比较灰暗,对比度不强,它的直方图统计结果显示,它的大部分像素值集中在0~100的区域内。而做过直方图均衡的图像,对比度明显增强,图像也相对更清晰,随着而来的可能是图像的噪点也被凸显出来,从它的直方图看,从原图比较集中在局部,变化为在真个0~255区间相对均匀的分布,这就是直方图均衡希望达到的效果。
Matlab源码、Lena_gray.jpg原图和比对图存放在project\zstar_ex66\matlab文件夹下。
3基于FPGA的直方图均衡处理
工程文件夹project\zstar_ex66\zstar.srcs\sources_1\new下的laplace_transform.v模块实现了图像的拉普拉斯边缘提取处理。该模块功能框图如下,使用2个FIFO,分别缓存前后行,即进入图像处理的3组数据流分别是第n-1行、第n行和第n+1行的图像,控制输入数据流和2个FIFO缓存的图像在同一个位置、寄存器对前后2个像素的图像值进行缓存,这样便可实现中心像素点以及前后列、上下行之间数据的同步处理了。
4装配说明
MT9V034摄像头模块通过Zstar ISB底板(P3)与Zstar Zynq开发板连接,VGA也是通过Zstar ISB底板与Zstar Zynq开发板连接,VGA板同时需要连接到VGA显示器。连接示意如图所示。
5板级调试
本实例对应ex66实例工程,已经制作好的BOOT.bin放置在工程路径“zstar_ex66\zstar.sdk\BOOT”下。也可以参考文档《玩转Zynq-实例篇:[ex51] 制作裸跑程序的启动文件BOOT.bin.pdf》制作包含.bit文件的BOOT.bin文件,将其拷贝到TF卡中,插入Zstar开发板的卡槽中,做好装配连接,上电,可以看到VGA显示器同时显示左右两个图像,左侧图像为原始图像,右侧图像为直方图均衡处理后图像。
更多资料共享
腾讯微云链接:https://share.weiyun.com/5s6bA0s
百度网盘链接:https://pan.baidu.com/s/1XTQtP5LZAedkCwQtllAEyw
提取码:ld9c