基于FPGA的图像裁剪电路的设计与实现
扫描二维码
随时随地手机看文章
摘要:本文提出了一种基于FPGA的图像裁剪电路的设计方法,利用像素的抽取改变图像的分辨率,从而达到图像裁剪的效果。与传统的方法相比,这种方法简单易行,开发成本低,图像的清晰度能满足一定的要求。此方法数据处理速度快,尤其适用于动态图像的处理。
关键词:现场可编程门阵列:图像裁剪;分辨率
0 概述
图像处理电路是信息控制系统中必不可少的环节,广泛应用于生产生活中,如住宅小区的安全监控系统、生产线的质量监控系统、电视机的机顶盒等,因此图像的处理电路的开发受到了人们的重视。裁剪压缩是图像处理技术中一个重要的内容,传统的方法往往采用DSP芯片或插值算法来实现图像的裁剪压缩功能,这种方法存在电路设计复杂、开发成本高的问题。本文提出了一种基于FPGA的设计方法,利用像素的抽取改变图像的分辨率,从而达到图像裁剪的效果。这种设计方法简单易行,图像的清晰度能满足一定的要求。特别是由于不需要数学运算,所以此方法数据处理速度快,尤其适用于一般要求的动态图像的处理。
1 电路设计方案
本设计是一个基于FPGA的数字图像的裁剪电路,电路框图如图1所示。其中FPGA中包含了三个功能模块电路的设计:
(1)SDRAM的控制模块:预处理的图像存在SDRAM存储器中,通过SDRAM的控制模块,将图像信息读出并进行相应的处理,提供给下一个电路模块使用。
(2)图像裁剪电路:包括像素的抽取和缓存电路,采用改变图像分辨率的方法,将有效的像素提取出来提供给显示电路,使图像进行4:3或2:3等多比例变化,以达到不同的视觉效果。
(3)显示控制电路:根据VGA显示屏的特点,产生时序驱动信号控制图像数据显示。[!--empirenews.page--]
2 设计实现
2.1 SDRAM控制模块的设计
预处理的图像需要放在存储器中,对于大部分的FPGA来说器件内部都含有4k的内存,但考虑到图像的容量及今后对动态图像处理功能的扩展,本设计选用了存储容量为8M外存的SDRAM。8M的SDRAM在存储空间上划分了4个BANK区块,每个BANK有16位数据宽。SDRAM虽然存储的容量大,但是其内部结构复杂,对该器件的读写使用必须设计专门的控制器进行控制操作。由于本设计采用的图像色彩为30位,RGB各10位,显然用一个16位宽度BANK不能存储一个像素,因此采用了2个BANK合并存储像素,如图2。这样一来,在SDRAM控制电路上需要仿真成四个虚拟的数据端口(两个写端口+两个读端口),在同一时刻将一个像素RGB从两个BANK中同时写入或读出,合并之后形成一个完整的数据。
根据这样的存取原则,一个具有640×480个像素、色彩为30位的图像,就需要同时BANKl和BANK2中存入640×480个16位的信息,SDRAM控制模块读入数据的端口程序如下所示,读出数据同理。
SDRAM_Control_4PortSDRAM0(
.WRl_DATA({R[9:0],G[9:5]}),
.WRl(E N),
.WRl_ADDR(0),----BANKl的地址
.WRl_MAX_ADDR(640*480),
.WRl_LENGTH(9'h100),
.WRl_LOAD(RST_0),
.WR1_CLK(P1X_CLK),
.WR2_DATA({G[4:0],B[9:0]}),
.WR2(E N),
.WR2_MAX_ADDR(22'h100000+640*480),
.WR2_LENGTH(9'hl00),
.WR2_LOAD(RST_0),
.WR2_CLK(PIX_CLK);
2.2 图像裁剪模块
在图像的裁剪处理上,有两种方案可选,第一种为线性插值算法。这是一种广泛使用的图像插值算法,通常使用8邻域采样加权产生新像素:
第二种为抽取算法,即通过变换分辨率的方法实现,例如将原来的640×480的分辨率变换为320×240或120×60的分辨率,这样图像的宽高比近似为4:3或16:8。比较两种算法,第二种算法通过直接丢弃部分原始数据达到分辨率的压缩,虽然有图像信息损失,但在图像显示满足要求的前提下,这种电路的实现更加便捷、方便,因此本设计采用了第二种算法。
2.2.1 像素的抽取
根据VGA的显示原理,储存在SDRAM中的640×480个像素,受显示控制电路中行同步信号的控制,每个行周期读出640个像素,并同步显示。采用抽取法实现分辨率的压缩,必须丢弃行和列的部分像素。以变换320×240分辨率为例,具体的设计方法是,将分辨率为640×480的原图像每隔一行进行行标记,在标记的行里,每隔1个像素进行列标记,最后将行列都被标记过的像素取出,提供给显示控制电路。
由于SDRAM存储器本身具有逐行读取、读取显示同步的特点,为了达到对行像素的隔行提取,本设计采用快读慢显的方式。例如原640× 480的分辨率采用25MHz的频率作为SDRAM数据读取频率和VGA的像素显示频率,现在采用50MHz作为SDRAM数据读取频率,VGA的像素显示频率仍然采用25MHz,即读取两行,保存一行并显示。在提取的行像素里每隔1个像素对列像素进行提取,则得到所需要的行列像素。[!--empirenews.page--]
2.2.2 双端口RAM控制模块
VGA显示器要求行像素读取和显示同步,由于抽取出来的行列像素在时序上是不连续的,电路必须加存储器对提取的像素进行缓存。数据缓存模块可以选用任何存储单元,根据像素存取的特点,本设计选用了双端口的RAM对有效像素进行乒乓操作。双端口RAM乒乓操作的原理如图3所示。
在第N个周期,将输入的数据流缓存到“数据缓存模块1”,与此同时,“数据缓存模块2”中缓存的数据通过“输出数据流选择单元”的选择,送到显示电路。在第N+1个周期,将输入的数据流缓存到“数据缓存模块2”,与此同时,“数据缓存模块l”中缓存的数据通过“输出数据流选择单元”的切换,送到显示电路。乒乓操作的最大特点是:通过“输入数据流选择单元”和“输出数据流选择单元”按节拍相互配合切换,将经过缓存的数据流没有时间停顿地传送到输出端,因此非常适合对时序不连续的像素进行流水线式处理。
根据双口RAM乒乓操作的原理,被抽取出来的像素,一行被缓存的同时,另一行则被顺序地读取出来,保证了像素显示的连续与同步。双端口RAM的输入输出信号的端口程序如下:
WIRE [29:0] DATA a,DATA b;
WIRE I_a=I;
WIRE I_b=~I;
WIRE[9:0]COIANTER a=(I)?ADDRESSl:COUNlER;
WIRE[9:0]COUNTER b=(!I)?ADDRESSl:COUNTER;
RAM U2(
.DATA a (INDATA),
.WREN a (I a),
.ADDRESS a(COUNTER a),
.CLOCK A(CLK),
.Q a(DATA a),
.DATA b (INDATA),
.WREN b(I_b),
.ADDRESS b(COUNTER b,
.CLOCK B (CLK),
.Q_b(DATA_b));
2.3 VGA显示控制模块
显示控制器主要用于输出VGA显示器所需要的RGB数据信号和控制信号,根据输入时钟,显示控制器可以产生VGA所需要的控制信号,包括场同步、行同步和复合消隐信号等。输出像素则与输入像素相同。图4为VGA的控制模块的仿真波形。
3 电路调试结果与分析
图5是分辨率为640×480的原图像,图6是分辨率为320×240,比例为4:3的图像。从处理后的图像效果可以看出,图像清晰,信息量丰富,能够满足图像的一般要求。
4 结论
本论文提出了一种基于FPGA的图像裁剪电路的设计方法,通过改变图像的分辨率达到压缩图像的效果。这种设计方法不仅具备了FPGA开发电路所具有的开发周期短、设计效率高、扩展性和升级性良好、设计灵活等特点,而且与通常所用的插值算法相比,电路结构简单、设计简便,从测试的效果来看,图像清晰,能够满足一般图像的要求。