(喀什大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,新疆 喀什 844000)
C# 是微軟公司推出的一種面向?qū)ο蟮木幊陶Z言[1-2],開發(fā)人員可以在Visual Studio 開發(fā)平臺上使用C# 編程語言開發(fā)各種應(yīng)用程序.C# 程序語言以其功能強(qiáng)大的優(yōu)勢被廣泛應(yīng)用.Visual Studio 開發(fā)平臺憑借其強(qiáng)大的可視化用戶界面設(shè)計(jì),讓C#編程易學(xué)易用.市面上通用的C#教材包含C# 基礎(chǔ)、C# 開發(fā)環(huán)境、C# 基本語法、控制語句、數(shù)組、類、集合、Windows 窗體控件等模塊.
在21 世紀(jì),隨著社會的飛速發(fā)展,對大學(xué)畢業(yè)生的素質(zhì)要求越來越高.C# 程序設(shè)計(jì)語言課程是一門實(shí)踐色彩十分突出的課程,需要學(xué)生將所學(xué)知識應(yīng)用到實(shí)際中,需要進(jìn)行大量的編程練習(xí).然而在實(shí)際的C# 程序設(shè)計(jì)語言課程教學(xué)中,存在以下兩方面的不足:(1)在實(shí)際的課堂教學(xué)中,教師往往占據(jù)主導(dǎo)地位,學(xué)生往往處于被動地位,導(dǎo)致學(xué)生學(xué)習(xí)積極性的喪失;(2)學(xué)生上機(jī)作業(yè)基本都是教材上給出的課后習(xí)題,很少有考察學(xué)生實(shí)際運(yùn)用能力的綜合性的練習(xí).[3-5]
本文使用雙邊濾波美顏算法,經(jīng)過C#Win form 程序處理后,能達(dá)到美顏效果.通過基于雙邊濾波美顏算法讓學(xué)生了解和掌握C# 程序設(shè)計(jì)語言在具體實(shí)際中的應(yīng)用.在該案例中首先讓學(xué)生掌握雙邊濾波算法的執(zhí)行流程,然后使用C# 程序語言設(shè)計(jì)的知識點(diǎn),如變量的定義,使用系統(tǒng)類庫定義變量Bitmap bS=(Bitmap)pictureSrc.Image;定義基本數(shù)據(jù)類型變量int width=bS.Width;定義數(shù)組byte [,]bR=new byte[width,height];定義方法private double[,]GetSpatial(int length,int sigmaS);循環(huán)的使用;并且通過圖形界面的方式,使得學(xué)生通過實(shí)際案例激發(fā)學(xué)習(xí)興趣,掌握C# 程序開發(fā)知識點(diǎn),從而更好的達(dá)到教學(xué)要求,為進(jìn)一步深造學(xué)習(xí)打下了基礎(chǔ).
雙邊濾波(Bilateral filter)是一種非線性的濾波方法[6-10],是C# 程序語言設(shè)計(jì)中的常用美顏算法,其同時考慮空域信息和灰度相似性,并結(jié)合對圖像的空間鄰近度和像素值相似度的綜合處理,以達(dá)到去噪和保護(hù)邊緣的目的.雙邊濾波法主要是在圖像的空域(domain)和值域(range)上做工作,空域?yàn)V波(Domain Filtering)對空間上鄰近的點(diǎn)進(jìn)行加權(quán)平均,加權(quán)系數(shù)隨著距離的增加而減少;值域?yàn)V波(Range filtering)則是對像素值相近的點(diǎn)進(jìn)行加權(quán)平均,加權(quán)系數(shù)隨著值差的增大而減少.
Domain Filtering 表示為:
公式中kd(x)=∫∫c(r,x)dr;
Range filtering 表示為:
公式中kr(x)=∫∫s(f(r),f(x))dr.
雙邊濾波結(jié)合上述兩種濾波算法思想,可以表示為:
其 中,k(x)=∫∫c(r,x),s(f(r),f(x))dr,h(x)為像素點(diǎn)x 處濾波后像素亮度值,f(r)為在像素點(diǎn)r 處亮度值.在本文中Domian filtering 以高斯濾波為例,則c(r,x)和相似性函數(shù)s(f(r),f(x))分別定義為:
其中,d(r,x)=‖r-x‖(‖*‖表示像素點(diǎn)r 和x 的歐式距離),σd為平滑參數(shù);
其中,d(f(r),f(x))=‖f(r)-f(x)‖(‖*‖表示像素點(diǎn)r 和x 處像素值的歐式距離),σr為平滑參數(shù).
使用 C#Winform 窗體程序進(jìn)行開發(fā),Windows 窗體可用于設(shè)計(jì)窗體和可視控件,以創(chuàng)建豐富的基于Windows 的應(yīng)用程序.在Form1主窗體中定義四個ToolStripMenuItem 控件,分別為文件ToolStripMenuItem、打開圖像ToolStrip MenuItem、保存圖像ToolStripMenuItem 和美顏ToolStripMenuItem.定義三個Button 控件,分別為ButtonStart、ButtonOpen 和ButtonSave;定義9 個Lable 控件,以做顯示信息之用;定義三個trackBar,分別為雙邊濾波美顏算法的濾波窗口大小、值域(range)和空域(domain)的參數(shù)大?。欢x三個ContextMenuStrip 菜單,作用分別是打開圖像、保存圖像和開始執(zhí)行美顏.兩個PictureBox,分別對應(yīng)原圖和美顏處理后圖.主窗體設(shè)計(jì)如圖1 所示.
圖1 主窗體設(shè)計(jì)
對三個Button 按鈕、四個StripMenuItem 控件、三個ContextMenuStrip 菜單添加事件和事件處理程序,事件分別是 buttonStart_Click、buttonOpen_Click、buttonSave_Click、打開圖像ToolStripMenuItem_Click、保存圖像ToolStripMenu Item_Click、美顏ToolStripMenuItem_Click、打開圖像ToolStripMenuItem1_Click、保存圖像ToolStrip MenuI tem1_Click、開始執(zhí)行ToolStripMenuIte m_Click、trackBarS_Scroll、trackBarHalfLen_Scroll 和tra ckBarR_Scroll.對每一個事件添加相應(yīng)事件處理程序,如對buttonStart_Click 事件添加void buttonStart_Click(object sender,EventArgs e)事件處理程序,其他事件也做相應(yīng)處理.
(1)獲取源圖像數(shù)據(jù)信息
Bitmap bS=(Bitmap)pictureSrc.Image;
(2)定義雙邊濾波美顏算法中涉及到的各種變量信息
(3)定義二維數(shù)組保存圖像RGB 各個通道信息,byte[,]bR、byte[,]bG 和byte[,]bB;
(4)對圖像邊緣進(jìn)行處理,本文使用擴(kuò)展數(shù)組方式,對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];
使用循環(huán)執(zhí)行公式(1)(2)(3);
(6)將雙邊濾波美顏后的數(shù)據(jù)設(shè)置到目的圖像.
本文采用從百度圖片獲得到的圖片進(jìn)行試驗(yàn).圖2、圖3 分別是要進(jìn)行美顏處理的圖片.
針對圖2 試驗(yàn)圖像一初始設(shè)置如圖4 所示.通過trackBar 控件分別設(shè)置雙邊濾波美顏算法中參數(shù)SigmaR、SigmaS 和halfLength 的值.在圖4 中,原圖和處理后顯示的圖像都是未經(jīng)處理的原始屠屏,也就是圖2 所顯示圖片.圖4 通過雙邊濾波美顏算法處理后如圖5 所示.在圖5 中,原圖表示的是未經(jīng)處理的圖片,也就是試驗(yàn)圖像一;處理后圖像是經(jīng)過美顏算法處理的圖片.從圖5 中可以明顯看出,經(jīng)過美顏算法處理后的圖像視覺效果更好.可以使用保存圖像功能,將處理后的圖像保存.再通過打開圖像功能打開另一個試驗(yàn)圖像二,也就是圖3,效果如圖6 所示.和對圖2 圖像處理一樣,可以設(shè)置雙邊濾波美顏算法中參數(shù)SigmaR、SigmaS 和halfLength 的值.經(jīng)過美顏算法處理后,可以看出美顏后的圖像的視覺效果明顯優(yōu)于原圖,如圖7 所示.
圖2 試驗(yàn)圖像一
圖3 試驗(yàn)圖像二
圖4 試驗(yàn)圖像一美顏前
圖5 試驗(yàn)圖像一美顏處理后
圖6 試驗(yàn)圖像二美顏前
圖7 試驗(yàn)圖像二美顏處理后
結(jié)合雙邊濾波美顏算法的案例化C# 程序設(shè)計(jì)教學(xué),涉及到了C# 程序設(shè)計(jì)語言的變量、程序控制語句、類、Winform 窗體等,將C# 程序語言各個知識點(diǎn)串聯(lián),將課堂理論知識點(diǎn)應(yīng)用到實(shí)際工程中,使學(xué)生能學(xué)以致用,學(xué)生對于算法的理解和學(xué)習(xí)為后續(xù)進(jìn)一步深造打下了良好基礎(chǔ).