第三章 双边滤波
3.1工具介绍
3.1.1Matlab简介
论文围绕中心Matlab软件,通过其实现目的。MATLAB是一种专业的计算机程序, 常被用于工程科学的矩阵数学运算。但在之后的几年,它逐渐发展为一种极其方便灵巧的计算体系,用于解决各种重要的技术问题。
在 70 年代中期,Cleve Moler 博士和他同事在美国国家科学基金的资助下开发了调用 EISPACK 和 LINPACK 的 FORTRAN 子程序库。EISPACK 是特征值求解 FOETRAN 的程序库,LINPACK 是解线性方程的程序库。当时这两个程序库代表矩阵运算的最高水平。直到70年代后期,美国 New Mexico 大学计算机系系主任的Cleve Moler,,在给学生讲授线性代数课程时,想教学生使用 EISPACK 和 LINPACK 程序库,但他发现学生用 FORTRAN 编写接口程序很费时间,于是他开始自己动手,为学生编写 EISPACK 和 LINPACK 的接口程序。最终Cleve Moler 给这个接口程序取名为MATLAB,次名字为矩阵(matrix)和实验室(labotatory)两个英文单词的前三个字母的组合。在以后的数年发展里,MATLAB 在众多大学里作为教学辅助软件使用,MATLAB 到今天已经历了近 30 年的发展过程。
MATLAB分为总包和其他的工具箱,伴随着版本的不断升级,它具有越来越全面的数值计算能力,越卓越的数据可视化能力和良好的符号计算功能,逐渐发展成为了各种学科、多种工作平台下支持的功能强大的大型软件,获得广大科技工作者的普遍认可。一方面,MATLAB可以方便实现数值分析、优化分析、数据处 理、自动控制、信号处理等领域的数学计算,另一方面,也可以快捷实现计算可 视化、图形绘制、场景创建和渲染、图像处理、虚拟现实和地图制作等分析处理工作。
3.1.2Matlab优点
MATLAB 语言相对于传统的科技编程语言有诸多的优点。主要包括:
1. 易用性 MATLAB 是种解释型语言,就像各种版本的 BASIC。和 BASIC 一样,它简单易用程序可用作便笺簿求打在命令行处表达式的值 执行预先写好的大型程序。在 MATLAB 集成开发环境下,程序可以方便的编写,修改和调试。这是因为这种语言极易使用,对于教育应用和快速建立新程序的原型,它是一个理想的工具。许多的编程工具使得 MATLAB 十分简单易用。这些工具包括:一个集成的编译/调试器,在线文件手册,工作台和扩展范例。
9
2. 平台独立性MATLAB支持许多的操作系统,提供了大量的平台独立的措施。在本书编 写的时侯, windows 98/2000/NT 和许多版本的 UNIX 系统都支持它。在一个平 台上编写的程序,在其它平台上一样可以正常运行,在一个平台上编写的数据文件在其它平台上一样可以编译。 因此用户可以根据需要把 MATLAB 编写的程序 移植到新平台。
3. 预定义函数 MATLAB 带有一个极大的预定义函数库,它提供了许多已测试和打包过的 基本工程问题的函数。例如,假设你正在编写一个程序,这个程序要求你必须计 算与输入有关的统计量。在许多的语言中,你需要写出你所编数组的下标和执行 计算所需要的函数,这些函数包括其数学意义,中值,标准误差等。像这样成百 上千的函数已经在 MATLAB 中编写好,所以让编程变得更加简单。 除了植入 MATLAB 基本语言中的大量函数,还有许多专用工具箱,以帮助用户解决在具体领域的复杂问题。例如,用户可以购买标准的工具箱以解决在信号处理,控制系统,通信,图象处理,神经网络和其他许多领域的问题。
4. 机制独立的画图 与其他语言不同, MATLAB 有许多的画图和图象处理命令。 MATLAB 运 当 行时,这些绘图和图片将会出现在这台电脑的图象输出设备中。此功能使得 MATLAB 成为一个形象化技术数据的卓越工具。
5. 用户图形界面 MATLAB 允许程序员为他们的程序建立一个交互式的用户图形界面。利用 MATLAB 的这种功能,程序员可以设计出相对于无经验的用户可以操作的复杂 的数据分析程序。
6. MATLAB 编译器 MATLAB 的灵活性和平台独立性是通过将 MATLAB 代码编译成设备独立 的 P 代码, 然后在运行时解释 P 代码来实现的。
Matlab 程序执行 matlab 语言,并提供了一个极其庞大的预定义函数库,高效的数值计算及符号计算功能,能使我们从繁重复杂的数学运算分析中解脱出来;完备的图形处理功能,实现了计算编程和结果的可视化;功能丰富的应用工具箱,提供了大量方便实用的处理工具;简单的界面及接近数学表达式的自然化语言,便于我们学习和掌握。Matlab的这些特点使得它十分适用于我们实现这次目的。
3.2滤波器简介及选择
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。下面简介几个常见滤波器。
高斯滤波是一种线性平滑滤波,适用于滤除高斯白噪声,已广泛应用于图像处理的预处理阶段。对图像进行高斯滤波就是对图像中的每个点的像素值计算,计算的准则是,由该点本身灰度值以及其邻域内的其他像素灰度值加权平均所得,而加权平均的权系数由二维离散高斯函数采样并归一化后所得[14]。
10
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度值g(x,y),即g(x,y)=1/m ∑f(x,y), m为该模板中包含当前像素在内的像素总个数。这样的方法可以平滑图像,速度快,算法简单。但是无法去掉噪声,这能微弱的减弱它[14]。
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。在图像处理中,中值滤波常用来保护边缘信息,是经典的平滑噪声的方法,该方法法对消除椒盐噪音非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大[14]。
双边滤波器(英语:Bilateral Filter)是使图像平滑化的非线性滤波器,与传统的图像平滑化算法不同,双边滤波器除了使用像素之间几何上的靠近程度之外,还多考虑了像素之间的光度、色彩的差异, 使双边滤波器能够有效的将图像上的噪声去除,同时保存图像上的边缘讯息。
a.原图 b. 高斯滤波
c. 均值滤波 d. 中值滤波结果 e. 双边滤波结果
图3.1各滤波器对比
根据以上几幅图,可以看出高斯滤波和均值滤波模糊了边界,而中值滤波和双边滤波则能够较好的保存图像的边界信息。为此,选择双边滤波器进行实验。
3.3双边滤波原理
在文献Bilateral Filtering for Gray and Color Images[15]中,详尽的解释了双边滤波。双
11
边滤波方法(Bilateral filtering)是基于Gsuss滤波方法提出的,主要是针对Gauss滤波中将Gauss权系数直接与图像信息作卷积运算进行图像滤波的原理,将滤波权系数优化成Gauss函数和图像亮度信息的乘积,优化后的权系数再与图像信息作卷积运算,这样就能在滤波的同时考虑到图像信息中的图像边缘信息,使图像在正常Gauss滤波后很模糊的边缘信息得以保持清晰,并且图像边缘更加平滑。此方法对于彩色和灰度图像的滤波均适用,具有很强的适用性。双边滤波与高斯滤波器相比,对于图像的边缘信息能过更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。
零均值加性高斯噪声图像模型:
(1)
式中,f表示无噪声图像,n是服从零均值高斯分布的噪声,g是噪声图像;g ( x, y )表示图像g在位置(x,y)上的像素值。滤除噪声图像g中的噪声n,重建无噪声图像f。双边滤波器采用局部加权平均的方法获取复原图像的像素值:
(2)
公式中,Ss,y 表示中心点(x,y)的(2N+1)*(2N+1)大小的领域。实 际上,公式(2)右边就是中心像素点邻域内像素亮度值的加权平均。对该邻域内的每一个像素点g(i,j)由两部分因子的成绩组成,分别是下面的空间距离和灰度距离。
空间距离:是当前目标点与中心点的欧式距离。空间域的高斯函数其数学形式为:
(3)
其中(xi,yi)为当前点的位置,(xc,yc)为中心点的位置,sigma是空间域标准差。 灰度距离:是当前目标点灰度与中心点灰度想差的绝对值。值域高斯函数其数学形式为:
(4)
其中gray(xi,yi)为当前点灰度值,gray(xc,yc)为中心点灰度值,sigma为值域标准差。 双边滤波中加入了对点灰度信息的权重:在邻域内,灰度值越是接近中心点灰度值的点的权重更大,而灰度值相差大的点权重越小。此权重大小,则由值域高斯函数来确定。两者权重系数相乘,可以得到最终的卷积模板。因为双边滤波需要每个中心点邻域的灰度信息以确定其系数,所以它的速度与比一般的滤波慢很多,并且计算量增长速度为核大小的平方。空间域sigma选取可以参考OpenCV参考文档所写:“对应高斯参数的 Gaussian sigma (标准差),如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3
12
+ 0.8,其中 n=param1 对应水平核,n=param2对应垂直核”。
而对值域sigma来说,Sigma越大,边缘越模糊,极限情况为simga无穷大,值域系数近似相等(忽略常数时,将近为exp(0)= 1),与高斯模板(空间域模板)相乘后可认为等效于高斯滤波。sigma越小,边缘越清晰,极限情况为simga无限接近0,值域系数近似相等(接近exp(-∞) = 0),与高斯模板(空间域模板)相乘后,可近似为系数皆相等,等效于源图像。
3.4实现双边滤波
选择使用的双边滤波器[16],由于要确保图像细节的完整,sigma的值不可以过大导致模糊失真,所以选择sigma小值,通过一次滤波后观察是否需要继续进行下一次。
%读入图像,设定名字为test I=imread('test.bmp'); %改变图像精度才能进行后续操作 I=im2double(I);
%设定w和sigma,为双边滤波做准备 w = z; sigma = [x y];
%进行多次双边滤波,双边滤波函数见[4] I1=bfilter2(I,w,sigma); I2=bfilter2(I1,w,sigma); I3=bfilter2(I2,w,sigma); I4=bfilter2(I3,w,sigma); I4=bfilter2(I4,w,sigma); I4=bfilter2(I4,w,sigma); I4=bfilter2(I4,w,sigma); I4=bfilter2(I4,w,sigma);
3.5小结
本章实现了双边滤波,下图中显示为原图与双边滤波1、2、3次后眼睛部位的对比。在sigma为[3 0.1]可以清晰看见原图中眼睫毛在一次滤波后便被滤出了大部分,之后2、3次中几乎不见眼睫毛了,对于要进行漫画化必须强化边缘的实验是不允许的。
13