楊祥 郝泳濤
摘要:圖像處理技術(shù)已經(jīng)在各個(gè)領(lǐng)域上都有了比較廣泛的應(yīng)用。本文基于C#設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)圖像處理系統(tǒng),論述了怎么利用C#語(yǔ)言實(shí)現(xiàn)對(duì)圖像的處理,實(shí)現(xiàn)了對(duì)圖像(bmp、gif等)進(jìn)行打開(kāi)、保存等功能和圖像處理功能(包括灰度化、膨脹等十項(xiàng)功能)。
關(guān)鍵字:灰度化;二值化;邊緣檢測(cè);鏈碼提??;細(xì)化;腐蝕
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)26-0158-03
Design and implementation of image processing system
YANG Xiang,HAO Yong-tao
(College of Electronics and Information Engineering, Tongji University, Shanghai 201804, China)
Abstract: The image processing technology has had a relatively wide range of applications in various fields. This paper designs and implements an image processing system based on C#, discusses how to use C# to achieve a variety of graphics image processing and realizes the use of a system designed for image files (bmp, png, gif, etc.) to open and save operations and other functions, image processing functions (including graying, expansion, etc. ten functions).
Key words: graying; binarization; detection of edge; extraction of chain code; refinement; corrosion
1 概述
21世紀(jì)是一個(gè)信息科技的時(shí)代,圖形圖像包圍著我們,它們作為我們認(rèn)知客觀世界的基礎(chǔ),對(duì)我們的生活有著重大影響,是我們獲取、表達(dá)、傳遞信息的手段。圖像處理,也就是用計(jì)算機(jī)對(duì)圖形圖像進(jìn)行一系列處理,它的發(fā)展時(shí)間并不是很長(zhǎng)。隨著信息技術(shù)的蓬勃發(fā)展,尤其是計(jì)算機(jī)技術(shù)的日新月異,為數(shù)字圖像處理的發(fā)展提供了更加廣闊的空間。我們知道,圖像處理技術(shù)可以幫助我們更客觀、精確地認(rèn)識(shí)客觀世界,而視覺(jué)信息的載體是各種各樣的圖形圖像,在很多情況下,人的眼睛看圖像是模糊不清的,我們想要看到看清這些圖像就需要通過(guò)圖像的增強(qiáng)技術(shù),使它們變成可見(jiàn)的而且甚至是高清的。
本文基于C#開(kāi)發(fā)了一個(gè)集數(shù)十種功能于一體,較為成熟的圖像處理系統(tǒng),使用起來(lái)方便簡(jiǎn)單。
2 系統(tǒng)設(shè)計(jì)基礎(chǔ)知識(shí)
2.1 C#簡(jiǎn)介
C#語(yǔ)言相對(duì)于其他高級(jí)語(yǔ)言,如C、C++等,C#學(xué)習(xí)和使用起來(lái)更加簡(jiǎn)單,有如下特點(diǎn):
1) 語(yǔ)法簡(jiǎn)單易學(xué)——相對(duì)高級(jí)程序設(shè)計(jì)語(yǔ)言C、C++來(lái)講,C#的語(yǔ)法相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,C#中沒(méi)有C中晦澀難懂的指針,也沒(méi)有C++中龐大繁雜的類的多重繼承及封裝、多態(tài)性等,而且統(tǒng)一使用標(biāo)準(zhǔn)的運(yùn)算符、操作符等,所以入門比較容易。
2) 面向?qū)ο蟪绦蛟O(shè)計(jì)——C#跟C++類似,也是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,支持面向?qū)ο蟪绦蛟O(shè)計(jì)的所有關(guān)鍵特性,這些又是面向過(guò)程的程序設(shè)計(jì)語(yǔ)言所不支持的,比如類的封裝、繼承等特性。
3) 安全性——C#的代碼的工作環(huán)境是托管的,這就比其他程序設(shè)計(jì)語(yǔ)言要安全一些。
2.2 C#與圖像處理簡(jiǎn)介
在C#語(yǔ)言中,對(duì)圖像的處理是利用GDI+來(lái)完成的,這要比GDI性能各方面優(yōu)秀一些,進(jìn)一步講GDI+其實(shí)是在GDI的基礎(chǔ)上做出了比較明顯的進(jìn)步,尤其是句柄和上下文等概念不會(huì)出現(xiàn)在GDI+中,這樣一來(lái),就可以使程序員沒(méi)必要再去關(guān)注具體的設(shè)備信息等等很多細(xì)節(jié)性的問(wèn)題,只需要簡(jiǎn)單地調(diào)用相應(yīng)的庫(kù)函數(shù)即可完成需要的操作,從而可以更加簡(jiǎn)單快捷地編寫程序,這是一個(gè)很大的優(yōu)勢(shì)。
2.3 C#語(yǔ)言中三種對(duì)像素操作的方法
2.3.1 直接操作法
所謂的直接法也就是說(shuō)直接調(diào)用GDI+中的函數(shù)來(lái)實(shí)現(xiàn)相應(yīng)操作,調(diào)用GetPixel()函數(shù)我們可以得到當(dāng)前像素點(diǎn)的信息,然后又調(diào)用函數(shù)SetPixel()可以重置當(dāng)前像素點(diǎn)的信息等。
2.3.2 內(nèi)存法
內(nèi)存法處理圖像的基本流程大致如下:
1)在圖像處理開(kāi)始之前,先將操作對(duì)象放到內(nèi)存中,這是利用函數(shù)LockBits來(lái)完成的。
2)再調(diào)用庫(kù)函數(shù)把系統(tǒng)內(nèi)存中的圖像數(shù)據(jù)等信息拷貝到一個(gè)數(shù)組中去。
3)對(duì)數(shù)組中的像素點(diǎn)進(jìn)行操作。
4)調(diào)用庫(kù)函數(shù)做與(2)相反的操作,即把數(shù)組中的像素信息拷貝到內(nèi)存去。
5)調(diào)用UnlockBits()函數(shù)釋放上述過(guò)程中被鎖存的圖像數(shù)據(jù)。
內(nèi)存發(fā)的程序的運(yùn)行速度可以提高很多,得益于內(nèi)存法的全部操作都在內(nèi)存中進(jìn)行。
2.3.3 指針?lè)?/p>
指針?lè)ㄅc上面的內(nèi)存法很相似,它的圖像處理的過(guò)程如下:
1)在處理開(kāi)始之前,先調(diào)用LockBits()函數(shù)將圖像放到內(nèi)存中去。
2)接下來(lái)圖像處理,在指針?lè)ㄖ袑?duì)圖像的像素點(diǎn)的處理是利用指針完成的。
3)上述處理之后,是調(diào)用函數(shù)UnlockBits()釋放被鎖存的處理過(guò)的圖像的數(shù)據(jù),圖像處理結(jié)束。
在C#中,利用指針對(duì)像素進(jìn)行操作的流程,如圖1所示:
3 系統(tǒng)功能的詳細(xì)設(shè)計(jì)
3.1 圖像的灰度化簡(jiǎn)介
度化處理很關(guān)鍵也很重要,在圖像處理,尤其是模式識(shí)別中尤其重要。對(duì)于常見(jiàn)的一般的24位的彩色圖像來(lái)說(shuō),它都是用3個(gè)字節(jié)來(lái)表示每個(gè)像素的顏色,也就是R、G、B。彩色圖像的三個(gè)分量紅、綠、藍(lán)的數(shù)值不同;否則就表現(xiàn)為灰度圖像。轉(zhuǎn)換公式如圖 2。
3.2 灰度直方圖簡(jiǎn)介
[H(rk)=nk (k=0,1,2,…,2b-1)]圖像的灰度直方圖的原理:反映一幅圖中的各個(gè)灰度級(jí)與它們出現(xiàn)的概率之間關(guān)系的圖形就是灰度直方圖。通常我們把灰度級(jí)當(dāng)作橫坐標(biāo),把頻率看作縱坐標(biāo),我們就得到了它的分布函數(shù):
3.3 圖像的二值化簡(jiǎn)介
圖像的二值化原理:類似于灰度化處理,都是讓原來(lái)圖像的色彩種類減少,但是二值化要比灰度化要求更高,顧名思義,二值化會(huì)讓圖像的色彩減少到只有黑色和白色。所以,只需1位二進(jìn)制數(shù)就可以表示這種圖像的像素的顏色,進(jìn)而需要存儲(chǔ)的數(shù)據(jù)量也大大減少,最終可以使得圖像處理的算法得到精簡(jiǎn),處理的速度也就自然而然地得到了提高。
3.4 圖像的濾波簡(jiǎn)介
圖像的濾波原理:顧名思義就是把空間域模板用于圖像處理的這種方法。具體可以分為兩種,分別是:線性平滑濾波和非線性平滑濾波,也叫鄰域平均法和中值濾波法。線性平滑濾波的原理很簡(jiǎn)單,找到當(dāng)前圖像的像素點(diǎn)鄰域內(nèi)的幾個(gè)像素點(diǎn),然后求取平均值,也就是數(shù)學(xué)中的算術(shù)平均數(shù),即顏色的算術(shù)平均值,然后用這個(gè)值去代替原來(lái)像素點(diǎn)的顏色值。
3.5 圖像的銳化簡(jiǎn)介
圖像的銳化原理:我們?cè)趫D像處理中,有時(shí)候需要對(duì)圖像進(jìn)行銳化處理,也就是讓圖像的邊緣更加突出鮮明。其實(shí),我們都知道銳化和濾波是兩種完全互逆的處理方法。常用的銳化算法有梯度算子、Prewitt算子和一階的Sobel算子等等。
3.6 圖像的邊緣檢測(cè)簡(jiǎn)介
圖像的邊緣檢測(cè)原理:我們都知道圖像的邊緣對(duì)于一個(gè)圖像的重要性,也是一個(gè)圖像的最基本的特征,因?yàn)檫吘壨ǔ0撕芏嘀匾畔?,有時(shí)候這些信息又不是連續(xù)的,而且還是不斷變化的,所以圖像的邊緣檢測(cè)對(duì)于圖像的分析來(lái)說(shuō)起著不可忽視的作用。在這里列舉幾個(gè)邊緣檢測(cè)算子:Sobel算子、梯度算子、Prewitt算子、一階的Roberts算子等等。
[R(x,y)=|f(x,y)-f(x+1,y+1)|+|f(x+1,y)-f(x,y+1)|]Roberts算子是采用對(duì)角線方向相鄰像素之差得到,它的近似計(jì)算方法如下:
具體是由2個(gè)2×2的卷積算子共同來(lái)完成:
[Δxf(x,y): 100-1 Δyf(x,y): 01-10]
3.7 圖像輪廓的鏈碼提取簡(jiǎn)介
圖像輪廓的鏈碼提取原理:在圖像處理中最常用的一種表示方法就是鏈碼,甚至在模式識(shí)別中也有很大用處,這是因?yàn)殒湸a可以大大減少了表示邊界所需的數(shù)據(jù)量,得益于鏈碼用一個(gè)方向數(shù)來(lái)代替兩個(gè)坐標(biāo)值。此外鏈碼還有旋轉(zhuǎn)不變性,更加增強(qiáng)了鏈碼應(yīng)用的靈活性。
3.8 圖像的細(xì)化簡(jiǎn)介
圖像的細(xì)化原理:細(xì)化也就是說(shuō)讓寬的線條變成細(xì)的線條,可以簡(jiǎn)單這樣理解一下,多用于對(duì)圖像進(jìn)行預(yù)處理,其實(shí)也就是提取出源圖像的大致框架,進(jìn)一步講就是將原圖像中寬度大于1個(gè)象素的線條都挑選出來(lái),然后一步一步細(xì)化操作,最終成為只有一個(gè)象素寬的線條,形成分析起來(lái)比較容易的圖像。
基于烈火模擬是細(xì)化的一種方法用的也比較多,此外還有基于最大圓盤方法也是不錯(cuò)的細(xì)化方法。它的基本思想就是從線條邊緣開(kāi)始向里層層去除像素,直到線條寬度只剩下一個(gè)象素才停止。
3.9 圖像的腐蝕簡(jiǎn)介
[XΘS={x|(S)x?X}]圖像的腐蝕原理:形態(tài)學(xué)處理的基礎(chǔ)是膨脹和腐蝕,大多說(shuō)的形態(tài)學(xué)算法都是以這兩種運(yùn)算為基礎(chǔ)的。
把X設(shè)為圖像集合,把S設(shè)為結(jié)構(gòu)元素,則S把X腐蝕記為:
3.10 圖像的膨脹簡(jiǎn)介
圖像的膨脹原理:形態(tài)學(xué)處理的基礎(chǔ)是膨脹和腐蝕,大多說(shuō)的形態(tài)學(xué)算法都是以這兩種運(yùn)算為基礎(chǔ)的。
把X設(shè)為圖像集合,把S設(shè)為結(jié)構(gòu)元素,則S把X膨脹記為:
[X⊕S= x|[(S)x?X]≠Φ ]
4 系統(tǒng)的實(shí)現(xiàn)
經(jīng)過(guò)上述系統(tǒng)功能設(shè)計(jì),然后詳細(xì)的編碼,最終開(kāi)發(fā)了本系統(tǒng),成功實(shí)現(xiàn)了本系統(tǒng)的所有功能,截取部分功能驗(yàn)證圖片:
5 結(jié)束語(yǔ)
本文基于C#語(yǔ)言,開(kāi)發(fā)了一個(gè)小型的相對(duì)簡(jiǎn)單的圖像處理系統(tǒng)。本系統(tǒng)實(shí)現(xiàn)了圖形圖像的打開(kāi)、保存等基本操作,還有簡(jiǎn)單的圖像處理功能(包括灰度化、銳化、鏈碼提取、濾波、邊緣檢測(cè)、腐蝕、二值化、膨脹等)。此次系統(tǒng)開(kāi)發(fā)過(guò)程中深有體會(huì),學(xué)習(xí)是無(wú)止境的,要活到老學(xué)到老,要不斷豐富自己的專業(yè)知識(shí),遇到不懂不會(huì)的一定要勤學(xué)好問(wèn),還要善于動(dòng)手查找資料,最后感謝所有在生活和學(xué)習(xí)中幫助過(guò)我的人。
參考文獻(xiàn):
[1] 潘云鶴.計(jì)算機(jī)圖形學(xué)[M].北京:高等教育出版社,2001.
[2] 何東健,耿楠,張義寬等.數(shù)字圖像處理[M].西安:西安電子科技大學(xué)出版社,2003.
[3] 范立南,韓曉微,張廣淵.圖像處理與模式識(shí)別[M].北京:科學(xué)出版社,2007.
[4] 秦婧.21天學(xué)通C#[M]. 2版.北京:電子工業(yè)出版社,2011.
[5] 許海柱.圖象中眼睛和嘴巴的檢測(cè)與定位[D].長(zhǎng)沙:中南大學(xué),2008.
[6] 劉光明.基于圖像識(shí)別的奶牛計(jì)量瓶自動(dòng)計(jì)量系統(tǒng)的研究與設(shè)計(jì)[D].銀川:北方民族大學(xué),2013.