特权同学玩转Zynq连载42——[ex61] OV5640摄像头的图像拉普拉斯锐化处理
1 系统概述
如图所示,这是整个视频采集系统的原理框图。上电初始,FPGA需要通过IIC接口对CMOS Sensor进行寄存器初始化配置。这些初始化的基本参数,即初始化地址对应的初始化数据都存储在一个预先配置好的FPGA片内ROM中。在初始化配置完成后,CMOS Sensor就能够持续输出标准RGB的视频数据流,FPGA通过对其同步信号,如时钟、行频和场频进行检测,从而从数据总线上实时的采集图像数据。
在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.2拉普拉斯(laplace)算子
最常用的无方向性的二阶差分算子,其模板有33、55和77等多种形式。。
例如,以33算子为例,1~8像素是(x,y)点周围邻近的8个像素点。可以使用右侧的2种模板对(x,y)以及周边4或8个像素点进行运算,替代原来的(x,y)点。
当然了,根据中心点的权重程度,也可以使用如下2中模板来实现图像锐化。
2.3 Matlab实现
基于第一种拉普拉斯锐化处理,我们的Matlab代码如下:
clear
clc
I1=imread(’.\lena.jpg’);
I=im2double(I1);
[m,n,c]=size(I);
A=zeros(m,n,c);
%for R
for i=2:m-1
for j=2:n-1
A(i,j,1)=I(i+1,j,1)+I(i-1,j,1)+I(i,j+1,1)+I(i,j-1,1)-4*I(i,j,1);
end
end
%for G
for i=2:m-1
for j=2:n-1
A(i,j,2)=I(i+1,j,2)+I(i-1,j,2)+I(i,j+1,2)+I(i,j-1,2)-4*I(i,j,2);
end
end
%for B
for i=2:m-1
for j=2:n-1
A(i,j,3)=I(i+1,j,3)+I(i-1,j,3)+I(i,j+1,3)+I(i,j-1,3)-4*I(i,j,3);
end
end
B=I-A;
%output
imwrite(B,‘lena.tif’,‘tif’);
imshow(’.\lena.jpg’);title(‘origin image’);figure
imshow(‘lena.tif’);title(‘image after laplace transform’)
滤波效果如下。
Matlab源码、Lena.jpg原图和比对图存放在project\zstar_ex61\matlab文件夹下。
3 基于FPGA的图像平滑处理
工程文件夹project\zstar_ex61\zstar.srcs\sources_1\new下的laplace_transform.v模块实现了拉普拉斯锐化处理。该模块功能框图如下,使用2个FIFO,分别缓存前后行,即进入图像处理的3组数据流分别是第n-1行、第n行和第n+1行的图像,控制输入数据流和2个FIFO缓存的图像在同一个位置、寄存器对前后2个像素的图像值进行缓存,这样便可实现中心像素点以及前后列、上下行之间数据的同步处理了。
4 装配说明
OV5640摄像头模块通过Zstar ISB底板(P3)与Zstar Zynq开发板连接,VGA也是通过Zstar ISB底板与Zstar Zynq开发板连接,VGA板同时需要连接到VGA显示器。连接示意如图所示。
5 板级调试
本实例对应ex61实例工程,已经制作好的BOOT.bin放置在工程路径“zstar_ex61\zstar.sdk\BOOT”下。也可以参考文档《玩转Zynq-实例篇:[ex51] 制作裸跑程序的启动文件BOOT.bin.pdf》制作包含.bit文件的BOOT.bin文件,将其拷贝到TF卡中,插入Zstar开发板的卡槽中,做好装配连接,上电,可以看到VGA显示器同时显示左右两个图像,左侧图像为原始图像,右侧图像为锐化处理后图像。