(喀什大学 计算机科学与技术学院,新疆 喀什 844000)
C# 是微软公司推出的一种面向对象的编程语言[1-2],开发人员可以在Visual Studio 开发平台上使用C# 编程语言开发各种应用程序.C# 程序语言以其功能强大的优势被广泛应用.Visual Studio 开发平台凭借其强大的可视化用户界面设计,让C#编程易学易用.市面上通用的C#教材包含C# 基础、C# 开发环境、C# 基本语法、控制语句、数组、类、集合、Windows 窗体控件等模块.
在21 世纪,随着社会的飞速发展,对大学毕业生的素质要求越来越高.C# 程序设计语言课程是一门实践色彩十分突出的课程,需要学生将所学知识应用到实际中,需要进行大量的编程练习.然而在实际的C# 程序设计语言课程教学中,存在以下两方面的不足:(1)在实际的课堂教学中,教师往往占据主导地位,学生往往处于被动地位,导致学生学习积极性的丧失;(2)学生上机作业基本都是教材上给出的课后习题,很少有考察学生实际运用能力的综合性的练习.[3-5]
本文使用双边滤波美颜算法,经过C#Win form 程序处理后,能达到美颜效果.通过基于双边滤波美颜算法让学生了解和掌握C# 程序设计语言在具体实际中的应用.在该案例中首先让学生掌握双边滤波算法的执行流程,然后使用C# 程序语言设计的知识点,如变量的定义,使用系统类库定义变量Bitmap bS=(Bitmap)pictureSrc.Image;定义基本数据类型变量int width=bS.Width;定义数组byte [,]bR=new byte[width,height];定义方法private double[,]GetSpatial(int length,int sigmaS);循环的使用;并且通过图形界面的方式,使得学生通过实际案例激发学习兴趣,掌握C# 程序开发知识点,从而更好的达到教学要求,为进一步深造学习打下了基础.
双边滤波(Bilateral filter)是一种非线性的滤波方法[6-10],是C# 程序语言设计中的常用美颜算法,其同时考虑空域信息和灰度相似性,并结合对图像的空间邻近度和像素值相似度的综合处理,以达到去噪和保护边缘的目的.双边滤波法主要是在图像的空域(domain)和值域(range)上做工作,空域滤波(Domain Filtering)对空间上邻近的点进行加权平均,加权系数随着距离的增加而减少;值域滤波(Range filtering)则是对像素值相近的点进行加权平均,加权系数随着值差的增大而减少.
Domain Filtering 表示为:
公式中kd(x)=∫∫c(r,x)dr;
Range filtering 表示为:
公式中kr(x)=∫∫s(f(r),f(x))dr.
双边滤波结合上述两种滤波算法思想,可以表示为:
其 中,k(x)=∫∫c(r,x),s(f(r),f(x))dr,h(x)为像素点x 处滤波后像素亮度值,f(r)为在像素点r 处亮度值.在本文中Domian filtering 以高斯滤波为例,则c(r,x)和相似性函数s(f(r),f(x))分别定义为:
其中,d(r,x)=‖r-x‖(‖*‖表示像素点r 和x 的欧式距离),σd为平滑参数;
其中,d(f(r),f(x))=‖f(r)-f(x)‖(‖*‖表示像素点r 和x 处像素值的欧式距离),σr为平滑参数.
使用 C#Winform 窗体程序进行开发,Windows 窗体可用于设计窗体和可视控件,以创建丰富的基于Windows 的应用程序.在Form1主窗体中定义四个ToolStripMenuItem 控件,分别为文件ToolStripMenuItem、打开图像ToolStrip MenuItem、保存图像ToolStripMenuItem 和美颜ToolStripMenuItem.定义三个Button 控件,分别为ButtonStart、ButtonOpen 和ButtonSave;定义9 个Lable 控件,以做显示信息之用;定义三个trackBar,分别为双边滤波美颜算法的滤波窗口大小、值域(range)和空域(domain)的参数大小;定义三个ContextMenuStrip 菜单,作用分别是打开图像、保存图像和开始执行美颜.两个PictureBox,分别对应原图和美颜处理后图.主窗体设计如图1 所示.
图1 主窗体设计
对三个Button 按钮、四个StripMenuItem 控件、三个ContextMenuStrip 菜单添加事件和事件处理程序,事件分别是 buttonStart_Click、buttonOpen_Click、buttonSave_Click、打开图像ToolStripMenuItem_Click、保存图像ToolStripMenu Item_Click、美颜ToolStripMenuItem_Click、打开图像ToolStripMenuItem1_Click、保存图像ToolStrip MenuI tem1_Click、开始执行ToolStripMenuIte m_Click、trackBarS_Scroll、trackBarHalfLen_Scroll 和tra ckBarR_Scroll.对每一个事件添加相应事件处理程序,如对buttonStart_Click 事件添加void buttonStart_Click(object sender,EventArgs e)事件处理程序,其他事件也做相应处理.
(1)获取源图像数据信息
Bitmap bS=(Bitmap)pictureSrc.Image;
(2)定义双边滤波美颜算法中涉及到的各种变量信息
(3)定义二维数组保存图像RGB 各个通道信息,byte[,]bR、byte[,]bG 和byte[,]bB;
(4)对图像边缘进行处理,本文使用扩展数组方式,对RGB 通道做同样处理,如bR=ExtendArray(bR,halfLen);
(5)双边滤波美颜算法处理,对RGB 通道做同样的双边滤波美颜算法处理,如bR=BilateralFilter(bR,length,sigmaS,sigmaR);
//具体过程G
int width=bS.GetLength (0);int height=bS.GetLength(1);int halfLength=(int)length/2;
byte[,]bC=new byte[width-2*halfLength,height-2*halfLength];
double[,]spatial=GetSpatial(length,sigmaS);
int i,j,x,y;
double tmp,sum;
double[,]range=new double[length,length];
使用循环执行公式(1)(2)(3);
(6)将双边滤波美颜后的数据设置到目的图像.
本文采用从百度图片获得到的图片进行试验.图2、图3 分别是要进行美颜处理的图片.
针对图2 试验图像一初始设置如图4 所示.通过trackBar 控件分别设置双边滤波美颜算法中参数SigmaR、SigmaS 和halfLength 的值.在图4 中,原图和处理后显示的图像都是未经处理的原始屠屏,也就是图2 所显示图片.图4 通过双边滤波美颜算法处理后如图5 所示.在图5 中,原图表示的是未经处理的图片,也就是试验图像一;处理后图像是经过美颜算法处理的图片.从图5 中可以明显看出,经过美颜算法处理后的图像视觉效果更好.可以使用保存图像功能,将处理后的图像保存.再通过打开图像功能打开另一个试验图像二,也就是图3,效果如图6 所示.和对图2 图像处理一样,可以设置双边滤波美颜算法中参数SigmaR、SigmaS 和halfLength 的值.经过美颜算法处理后,可以看出美颜后的图像的视觉效果明显优于原图,如图7 所示.
图2 试验图像一
图3 试验图像二
图4 试验图像一美颜前
图5 试验图像一美颜处理后
图6 试验图像二美颜前
图7 试验图像二美颜处理后
结合双边滤波美颜算法的案例化C# 程序设计教学,涉及到了C# 程序设计语言的变量、程序控制语句、类、Winform 窗体等,将C# 程序语言各个知识点串联,将课堂理论知识点应用到实际工程中,使学生能学以致用,学生对于算法的理解和学习为后续进一步深造打下了良好基础.