黄继业, 陆燕怡
(杭州电子科技大学 电子信息学院, 杭州 310018)
图像滤波是一种在保留图像大部分特征细节的基础上对图像噪声进行抑制的操作。图像滤波在人工智能、交通运输和人脸识别等领域具有广泛应用,其中双边滤波是如今应用最广泛的图像滤波算法之一。双边滤波算法是一种基于高斯滤波的改进算法,考虑到周围一定范围内像素的权重问题,对于各种像素值赋予不同的权重,并且在加权平均后得到当前的结果。双边滤波在去噪的同时很好地保留图像边缘的解控信息,于是,它一直是研究的热点[1-10]。
传统的双边滤波主要通过计算机或类计算机的处理器实现,耗时较长,且无法做到多副图像并行处理。本文采用基于FPGA实现技术,参考了文献[2]中对于双边滤波算法的改进方案,根据像素的相似性加入筛选函数,使得双边滤波的速度得到优化[10-14]。由于其计算速度较快,计算效果很好,可以节约大量开发成本。
图1 系统的总体框图
2.1.1 输入缓冲方案论证
(1) 直接传输法。不进行缓冲,将图像数据按行顺序输入缓存器,通过地址查找缓存器中的图像数据。优点:查找数据方便,数据观察比较直观。缺点:数据无法持续输入,去缓冲区查找数据较为耗时且数据传输比较耗时。
(2) 数据缓冲法。搭建行缓冲器,将图片数据分解为方便处理的数据格式。优点:便于数据下一步计算,数据流传送且代码编写方便。缺点:需要多加入一个模块,占用资源。
综上比较,选择方案(2)。
2.1.2 输入缓冲流程
数据从摄像头端传入,按照时钟信号按行扫描,其数据个数与扫描分辨率相同。数据传入缓冲区,将图像数据切割成适合计算模板的数据格式。数据并行传送至计算模块,即若算子模板为n×n,则为n行数据并行传输n个数据给计算的数据缓冲区,即存储了对应于一个算子模板的数据量。
向晚去宫里赴宴,皇帝满心欢喜迎出来,看到名满天下的美人已经衰老如斯,周身也不是少妇淡雅的兰香,而是隐约透出秋冬林木中的腐败气味,一时兴味索然,举箸难食,又命雨鸾弹琴唱曲。雨鸾叮咚奏琴,吟唱当日流行坊中的《洛阳女儿行》,嗓音固然是如黄莺在谷,乳燕啼林,婉转好听,但由一名“老妇”唱出来,更见荒唐无聊。好在李隆基自命风流,涵养不错,硬着头皮听完,也叫了几声好,才带着他一身的鸡皮疙瘩走掉了。
2.2.1 双边滤波模型和理论基础
(1) 双边滤波特性。双边滤波是在高斯滤波上加入了对于相邻像素灰度值权重考虑的滤波模型,是一种非线性的滤波器。它不仅考虑了像素的欧式距离,也考虑到了像素范围域中的辐射差异,可以达到保持边界、降噪平滑的效果。其双边滤波的公式如下:
(1)
式中:g为原图像数据;w为权值,由空间权值和亮度权值组成,
(2)
ws为空间邻近因子的权重,即与空间距离相关的权值,一般由高斯滤波直接计算得到:
(3)
wr为亮度相似因子的权重,与周围像素灰度值相关的权值,
w(i,j)=ws(i,j)·wr(i,j)
(4)
(2) 双边滤波实现。在高斯滤波中可以发现,离目标点越近的像素点对结果的影响越大,即权重越大。考虑到滤波模型在像素空间距离上的权重问题,双边滤波的第1个模板为高斯滤波模板,用于考虑像素的空间距离影响问题,其公式如下:
i∈[-r,r],j∈[-r,r]
(5)
式中,r为模板半径。
高斯滤波最终可以简化为n×n的整数滤波模板,可直接作为双边滤波的第1个模板。该模板可以用Matlab软件直接仿真得到,且该模板为固定的全局模板,不根据图片数据的变化而变化,只与滤波模板半径有关[3]。在双边滤波中可发现图像中心像素内像素亮度是另一需要考虑的权重信息量。得到灰度值权重模板后,需要点乘高斯模板,最终得到双边滤波模板。由于有权重模板的加入,数据引入了浮点数,所以需要重新计算模板的总和值。最终将图片数据点乘双边滤波模板即得到最终的滤波后图像数据。
2.2.2 灰度值权重模板
双边滤波模板是由2个模板点乘后得到的,1个模板为全局的高斯模板,不需要根据图片数据而变化;第2个是与灰度级差值相关的模板。根据权重公式:
D=exp(-[f(x+i,y+j)-f(x,y)]2·50),
i∈[-r,r],j∈[-r,r]
(6)
得到双边滤波的权重矩阵,其中D为第2个模板,即灰度权重矩阵。
(1)使用乘法模块。 在双边滤波计算模块处调用浮点乘法模块直接根据计算公式计算其权重矩阵。优点:计算更加精准,滤波效果较好。缺点:计算量较大,消耗的资源较多。
(2) 采用状态机进行层次划分。根据模板中心点的灰度值,对于其四周的灰度值进行划分,根据权重值倒推至该权重所处的灰度值范围,将其范围内的灰度值所对应的权重值都用该权重值替代。优点:计算量较小,消耗的资源少,不需要调用任何乘法资源模块,除法资源模块等;缺点:精度值相比较于方案(1)小了很多,而且对于灰度值相差较大的数据处理效果没有方案(1)好。
(3) 采用ROM模块进行权重查询。每个模块像素值对中间像素值相减,将输出结果作为地址查询ROM内部的值,其中ROM中存储的是每个像素差值对应的权重值。优点:可预先做好计算,直接进行地址查询即可,速度较快;缺点:占用了一定的FPGA资源。
分析方案(1)在速度慢,公式繁多复杂,需要多次调用乘法模块,虽然代码较为简单,但是消耗过大;方案(2)的特点在于将繁琐的公式倒推为限定的灰度值区间的对应关系,大大减少了资源的消耗,同时提高了计算速度,根据其得到的模板较为快速;相比较上述方案,方案(3)的速度更加快,而且消耗的资源更少。最终选择方案(3)。
2.2.3 双边滤波计算框图
整个图片的双边滤波计算过程是,只需要根据单个模板的滤波计算过程,扩展成为整个图片的滤波计算就可以得到整个图片的双边滤波效果。其单个模板的计算过程:① 将模板中间像素值和周围像素值送入减法器输入的两端。② 从减法器输出端得到像素差值作为ROM的地址输入,其中ROM中存储的是灰度权重值,该权重值数据可以通过Matlab计算预先得到。③ 将从ROM输出端得到的数据,一路点乘高斯模板,由于高斯模板是全局固定模板,所以可以根据位移计算乘法,从而计算整个模板的点乘数据;另外一路点乘全一模板,得到模板总和。④ 高斯模板这路的输出存储进FIFO中;全一模板的一路输出点乘高斯模板的总和,由于高斯模板是固定的,所以全一模板的这一路乘的是一个固定的常数,可以根据位移来实现乘法。⑤ 从FIFO一路的输出相乘总和的倒数,输出即是滤波完成后的中间像素值。具体计算框图如图2所示。
图2 单个模板像素计算框架
由于采用的基于FPGA的双边滤波算法,所以考虑减少复杂运算。整体计算过程分为数据采集、数据切割、数据计算、数据整合,数据输出包括:① 图像数据从摄像机处采集。② 图片数据输入缓冲区的数据按照模块并行输出。③ 比较中间像素与周围像素值灰度大小。④ 根据灰度值差距的大小找到ROM中对应的权值,填入模板数组中。⑤ 上述的权值数组点乘高斯模板,得到最终计算模板;另外一个输出点乘全一模板,用于得到灰度值权重模板总和。⑥ 灰度值模板总和乘以固定的高斯模板总和,计算得到最终权值模板的总和值,存储。⑦ 将图片数据点乘最终权值模板,得到计算后的中间像素值。⑧ 计算后的中间像素值除以权值模板总和值,得到滤波后的中间像素值。⑨ 所有中间像素值传输至输出缓冲区,整合得到滤波图片。
双边滤波计算系统流程图如图3所示。双边滤波的算法模块使用了3×3模板,所以总共使用了1个移位寄存器、9个存储权重值的ROM、9个乘法器、1个除法器。由于系统使用了IP核导致图像处理结果的数据输出具有20个时钟的延迟,所以额外加了一个Flag信号作为输出信号读取的使能信号,该信号用于后续数据读取的保证,从而消除时钟延迟对于图像输出造成的影响。
对图片进行双边滤波,截取其滤波结果存入输出缓存区中,使用VGA将图像数据显示出来,如此可以得到图像数据。为了截取图像,将输出信号保存至TXT文本中,然后使用Matlab软件对图像进行截取。如图4所示。
由图4可知,两种滤波算法对于图片噪声具有抑制效果,但高斯滤波在滤波的同时模糊了图片的细节和边缘从而造成了重影的情况,而双边滤波可以在抑制噪声的同时保留了一定的图片细节和边缘,但同样加强了噪声的影响,但是比高斯滤波具有更好的性能。
图3 双边滤波计算系统流程图
(a) 图像原图
(b) 高斯滤波后图片
(c) 双边滤波后的图片
本文设计并实现了一个基于FPGA的对于图像进行双边滤波的系统。一般的图像双边滤波计算系统的计算量复杂,计算时间较长,需要计算型主机进行实现。本系统采用了FPGA进行实现,可以较快速并消耗小资源地对图片进行图像双边滤波计算,充分保留了图片的细节。其计算过程也可以利用Matlab软件进行编程仿真[15],让同学对双边滤波的实现过程更加明确。通过对双边滤波算子模板的改进,使得双边滤波算法计算速度加快,占用资源消耗减少,但相对于高斯滤波保留了其一定的细节。