數字圖像處理中的形態學
轉自:http://blog.csdn.net/sunny3106/archive/2007/08/15/1745485.aspx
(摘自某文獻,因為貼圖的數目有限制,后面的公式圖片沒有能夠上,電腦重裝后文檔已經找不到了,囧)
一 引言
數學形態學是一門建立在集論基礎上的學科,是幾何形態學分析和描述的有力工具。數學形態學的歷史可回溯到19世紀。1964年法國的Matheron和Serra在積分幾何的研究成果上,將數學形態學引入圖像處理領域,並研制了基於數學形態學的圖像處理系統。1982年出版的專著《Image Analysis and Mathematical Morphology》是數學形態學發展的重要里程碑,表明數學形態學在理論上趨於完備及應用上不斷深入。數學形態學蓬勃發展,由於其並行快速,易於硬件實現,已引起了人們的廣泛關注。目前,數學形態學已在計算機視覺、信號處理與圖像分析、模式識別、計算方法與數據處理等方面得到了極為廣泛的應用。
數學形態學可以用來解決抑制噪聲、特征提取、邊緣檢測、圖像分割、形狀識別、紋理分析、圖像恢復與重建、圖像壓縮等圖像處理問題。該文將主要對數學形態學的基本理論及其在圖像處理中的應用進行綜述。
二 數學形態學的定義和分類
數學形態學是以形態結構元素為基礎對圖像進行分析的數學工具。它的基本思想是用具有一定形態的結構元素去度量和提取圖像中的對應形狀以達到對圖像分析和識別的目的。數學形態學的應用可以簡化圖像數據,保持它們基本的形狀特征,並除去不相干的結構。數學形態學的基本運算有4個:膨脹、腐蝕、開啟和閉合。它們在二值圖像中和灰度圖像中各有特點。基於這些基本運算還可以推導和組合成各種數學形態學實用算法。
(1)二值形態學
數學形態學中二值圖像的形態變換是一種針對集合的處理過程。其形態算子的實質是表達物體或形狀的集合與結構元素間的相互作用,結構元素的形狀就決定了這種運算所提取的信號的形狀信息。形態學圖像處理是在圖像中移動一個結構元素,然后將結構元素與下面的二值圖像進行交、並等集合運算。
基本的形態運算是腐蝕和膨脹。
在形態學中,結構元素是最重要最基本的概念。結構元素在形態變換中的作用相當於信號處理中的“濾波窗口”。用B(x)代表結構元素,對工作空間E中的每一點x,腐蝕和膨脹的定義為:

用B(x)對E進行腐蝕的結果就是把結構元素B平移后使B包含於E的所有點構成的集合。用B(x)對E進行膨脹的結果就是把結構元素B平移后使B與E的交集非空的點構成的集合。先腐蝕后膨脹的過程稱為開運算。它具有消除細小物體,在纖細處分離物體和平滑較大物體邊界的作用。先膨脹后腐蝕的過程稱為閉運算。它具有填充物體內細小空洞,連接鄰近物體和平滑邊界的作用。
可見,二值形態膨脹與腐蝕可轉化為集合的邏輯運算,算法簡單,適於並行處理,且易於硬件實現,適於對二值圖像進行圖像分割、細化、抽取骨架、邊緣提取、形狀分析。但是,在不同的應用場合,結構元素的選擇及其相應的處理算法是不一樣的,對不同的目標圖像需設計不同的結構元素和不同的處理算法。結構元素的大小、形狀選擇合適與否,將直接影響圖像的形態運算結果。因此,很多學者結合自己的應用實際,提出了一系列的改進算法。如梁勇提出的用多方位形態學結構元素進行邊緣檢測算法既具有較好的邊緣定位能力,又具有很好的噪聲平滑能力。許超提出的以最短線段結構元素構造准圓結構元素或序列結構元素生成准圓結構元素相結合的設計方法,用於骨架的提取,可大大減少形態運算的計算量,並可同時滿足尺度、平移及旋轉相容性,適於對形狀進行分析和描述。
(2)灰度數學形態學
二值數學形態學可方便地推廣到灰度圖像空間。只是灰度數學形態學的運算對象不是集合,而是圖像函數。以下設f(x,y)是輸入圖像,b(x,y)是結構元素。用結構元素b對輸入圖像y進行膨脹和腐蝕運算分別定義為:
對灰度圖像的膨脹(或腐蝕)操作有兩類效果:
(1)如果結構元素的值都為正的,則輸出圖像會比輸入圖像亮(或暗);
(2)根據輸入圖像中暗(或亮)細節的灰度值以及它們的形狀相對於結構元素的關系,它們在運算中或被消減或被除掉。灰度數學形態學中開啟和閉合運算的定義與在二值數學形態學中的定義一致。用b對f進行開啟和閉合運算的定義為:
(3)模糊數學形態學
將模糊集合理論用於數學形態學就形成了模糊形態學。模糊算子的定義不同,相應的模糊形態運算的定義也不相同。在此,選用Shinba的定義方法。模糊性由結構元素對原圖像的適應程度來確定。用有界支撐的模糊結構元素對模糊圖像的腐蝕和膨脹運算按它們的隸屬函數定義為:

其中,x,y∈Z2代表空間坐標,ua,ub分別代表圖像和結構元素的隸屬函數。從(7),(8)式的結果可知,經模糊形態腐蝕膨脹運算后的隸屬函數均落在[0,1]的區間內。模糊形態學是傳統數學形態學從二值邏輯向模糊邏輯的推廣,與傳統數學形態學有相似的計算結果和相似的代數特性。模糊形態學重點研究n維空間目標物體的形狀特征和形態變換,主要應用於圖像處理領域,如模糊增強、模糊邊緣檢測、模糊分割等。
三 數學形態學在圖像處理中的主要應用
近年來,數學形態學在圖像處理方面得到了日益廣泛的應用。下面主要就數學形態學在邊緣檢測、圖像分割、圖像細化以及噪聲濾除等方面的應用做簡要介紹。
(1) 邊緣檢測
邊緣檢測是大多數圖像處理必不可少的一步,提供了物體形狀的重要信息。對於二值圖像,邊緣檢測是求一個集合A的邊界,記為B(A):

對於灰度圖像,邊緣檢測是求一幅圖像的形態學梯度,記為g:
數學形態學運算用於邊緣檢測,存在着結構元素單一的問題。它對與結構元素同方向的邊緣敏感,而與其不同方向的邊緣(或噪聲)會被平滑掉,即邊緣的方向可以由結構元素的形狀確定。但如果采用對稱的結構元素,又會減弱對圖像邊緣的方向敏感性。所以在邊緣檢測中,可以考慮用多方位的形態結構元素,運用不同的結構元素的邏輯組合檢測出不同方向的邊緣。
梁勇等人構造了8個方向的多方位形態學結構元素,應用基本形態運算,得到8個方向的邊緣檢測結果,再把這些結果進行歸一化運算、加權求和,得到最終的圖像邊緣。該算法在保持圖像細節特征和平滑邊緣等方面,取得了較好的效果。
(2) 圖像分割
基於數學形態學的圖像分割算法是利用數學形態學變換,把復雜目標X分割成一系列互不相交的簡單子集X1,X2,…,XN,即:
對目標X的分割過程可按下面的方法完成:首先求出X的最大內接“圓”X1,然后將X1從X中減去,再求X-X1的最大內接“圓”X2,…,依此類推,直到最后得到的集合為空集為止。下面以二值圖像為例,介紹用數學形態學方法求解子集X1,X2,…,XN的過程。
設B為結構元素,B可以是圓、三角形、正方形等簡單的幾何基元,那么“簡單”形狀集合Xi可以用下面的公式來定義:
式中ni為一整數,用上式定義Xi分割目標,有時會產生分割過程不唯一的現象。為此可采用下面公式來定義簡單集合Xi:
其中Li為一個點或一條線,當Li為點時,則與(12)式定義等價。(13)式定義的簡單形狀Xi可由niB沿線Li移動而產生。即將“產生器”niB的中心沿“脊骨”Li移動產生。如果niB為圓,則得到的Xi稱Blum帶。它具有一些特殊的性質,如Xi的邊界是光滑的,Xi的最大圓與其邊界相切,Xi的脊骨與產生器都是唯一的等等。
有了簡單形狀集合Xi的定義,則目標X可按下面方法分割。首先按式(14)求出X的最大內切結構元素Xi:
數學形態學用於圖像分割的缺點是對邊界噪聲敏感。為了改善這一問題,劉志敏等人提出了基於圖像最大內切圓的數學形態學形狀描述圖像分割算法和基於目標最小閉包結構元素的數學形態學形狀描述圖像分割算法,並使用該算法對二值圖像進行了分割,取得了較好的效果。鄧世偉等人提出一種基於數學形態學的深度圖像分割算法。作者首先利用形態學算子獲得分別含有階躍邊緣與屋脊邊緣的凸脊和凹谷圖像,然后利用控制區域生長過程得到最終的分割結果。與傳統方法相比,該方法速度快,抗噪性能好。
(3) 形態骨架提取
形態骨架描述了物體的形狀和方向信息。它具有平移不變性、逆擴張性和等冪性等性質,是一種有效的形狀描述方法。二值圖像A的形態骨架可以通過選定合適的結構元素B,對A進行連續腐蝕和開啟運算來求取,設S(A)代表A的骨架,定義為:
蔣剛毅等人運用數學形態學方法,對交通標志的內核形狀提取形態骨架函數,將其作為用於模式匹配的形狀特征。A的形態骨架函數SKF(A)表示為:
SKF(X)中值較大的點對應大的n,並代表了形態骨架的主要成分,即表達了形狀的主體結構;而SKF(X)中值較小的點對應小的n,是形態骨架的細節成分,與形狀的邊緣信息相聯系。
形態骨架函數完整簡潔地表達了形態骨架的所有信息,因此,根據形態骨架函數的模式匹配能夠實現對不同形狀物體的識別。算法具有位移不變性,因而使識別更具穩健性。
(4) 噪聲濾除
對圖像中的噪聲進行濾除是圖像預處理中不可缺少的操作。將開啟和閉合運算結合起來可構成形態學噪聲濾除器。
對於二值圖像,噪聲表現為目標周圍的噪聲塊和目標內部的噪聲孔。用結構元素B對集合A進行開啟操作,就可以將目標周圍的噪聲塊消除掉;用B對A進行閉合操作,則可以將目標內部的噪聲孔消除掉。該方法中,對結構元素的選取相當重要,它應當比所有的噪聲孔和噪聲塊都要大。
對於灰度圖像,濾除噪聲就是進行形態學平滑。實際中常用開啟運算消除與結構元素相比尺寸較小的亮細節,而保持圖像整體灰度值和大的亮區域基本不變;用閉合運算消除與結構元素相比尺寸較小的暗細節,而保持圖像整體灰度值和大的暗區域基本不變。將這兩種操作綜合起來可達到濾除亮區和暗區中各類噪聲的效果。同樣的,結構元素的選取也是個重要問題。
四 選取結構元素的方法
分析表明,各種數學形態學算法的應用可分解為形態學運算和結構元素選擇兩個基本問題,形態學運算的規則已由定義確定,於是形態學算法的性能就取決於結構元素的選擇,亦即結構元素決定着形態學算法的目的和性能。因此如何自適應地優化確定結構元素,就成為形態學領域中人們長期關注的研究熱點和技術難點。目前較多采用多個結構元素對圖像進行處理的方法。
(1) 多結構元素運算
在許多形態學應用中,往往只采用一個結構元素,這通常不能產生滿意的結果。在模式識別中,如果要提取某個特定的模式,只采用一個結構元素,那么,只有與結構元素形狀、大小完全相同的模式才能被提取,而與此結構元素表示的模式即使有微小差別的其他模式的信息都不能獲取。
解決此問題的一個有效方法之一就是將形態學運算與集合運算結合起來,同時采用多個結構元素,分別對圖像進行運算,然后將運算后的圖像合並起來,即多結構元素形態學運算。
(2) 用遺傳算法選取結構元素
遺傳算法的思想來源於自然界物競天擇、優勝劣汰、適者生存的演化規律和生物進化原理,並引用隨機統計理論而形成,具有高效並行全局優化搜索能力,能有效地解決機器學習中參數的復雜優化和組合優化等難題。
近年來不少國外學者已進行了這方面的探索與研究,Ehrgardt設計了形態濾波的遺傳算法,用於二值圖像的去噪和根據二值紋理特性消除預定目標;Huttumen利用遺傳算法構造了軟式形態濾波器及其參數優化的設計方法,以實現灰度圖像的降噪功能。余農、李予蜀等人用遺傳算法在自然景象的目標檢測與提取方面進行了研究,通過自適應優化訓練使結構元素具有圖像目標的形態結構特征,從而賦予結構元素特定的知識,使形態濾波過程融入特有的智能,以實現對復雜變化的圖像具有良好的濾波性能和穩健的適應能力。其實質是解決濾波器設計中知識獲取和知識精煉的機器學習問題。
五 數學形態學存在的問題與進一步的研究方向
數學形態學是一門建立在集論基礎之上的學科,是幾何形狀分析和描述的有力工具。近年來,數學形態學在數字圖像處理、計算機視覺與模式識別等領域中得到了越來越廣泛的應用,漸漸形成了一種新的數字圖像分析方法和理論,引起了國內外相關領域研究人員的廣泛關注。目前,數學形態學存在的問題及研究方向主要集中在以下幾個方面:
(1) 形態運算實質上是一種二維卷積運算,當圖像維數較大時,特別是用灰度形態學、軟數學形態學、模糊形態學等方法時,運算速度很慢,因而不適於實時處理。
(2) 由於結構元素對形態運算的結果有決定性的作用,所以,需結合實際應用背景和期望合理選擇結構元素的大小與形狀。
(3) 軟數學形態學中關於結構元素核心、軟邊界的定義,及對加權統計次數*的選擇也具有較大的靈活性,應根據圖像拓撲結構合理選擇,沒有統一的設計標准。
(4) 為達到最佳的濾波效果,需結合圖像的拓撲特性選擇形態開、閉運算的復合方式。
(5) 對模糊形態學,不同的模糊算子會直接影響模糊形態學的定義及其運算結果。
(6) 有待進一步將數學形態學與神經網絡、模糊數學結合研究灰度圖像、彩色圖像的處理和分析方法。
(7) 有待進一步研究開發形態運算的光學實現及其它硬件實現方法。
(8) 有待將形態學與小波、分形等方法結合起來對現有圖像處理方法進行改進,進一步推廣應用。所以如何實現灰度形態學、軟數學形態學、模糊軟數學形態學的快速算法,如何改善形態運算的通用性,增強形態運算的適應性,並結合數學形態學的最新應用進展,將其應用到圖像處理領域,豐富和發展利用數學形態學的圖像處理與分析方法,成為數學形態學今后的發展方向。
六 結論
數學形態學對圖像的處理具有直觀上的簡明性和數學上的嚴謹性,在定量描述圖像的形態特征上具有獨特的優勢,為基於形狀細節進行圖像處理提供了強有力的手段。建立在集合理論基礎上的數學形態學,主要通過選擇相應的結構元素采用膨脹、腐蝕、開啟、閉合#種基本運算的組合來處理圖像。數學形態學在圖像處理中的應用廣泛,有許多實用的算法,但在每種算法中結構元素的選取都是一個重要的問題。
用3x3的結構元素,掃描圖像的每一個像素,用結構元素與其覆蓋的二值圖像做“與”操作:如果都為1,結果圖像的該像素為1。否則為0。
結果:使二值圖像減小一圈
定義:E = B S = { x,y | SxyB}
膨脹的算法:
用3x3的結構元素,掃描圖像的每一個像素,用結構元素與其覆蓋的二值圖像做“與”操作:如果都為0,結果圖像的該像素為0。否則為1
結果:使二值圖像擴大一圈
定義:E = B S = { x,y | Sxy∩B ≠Ф}
代碼: VC++ code
腐蝕:
把結構元素S 平移x 后得到Sx ,若Sx 包含於X ,我們記下這個x 點,所有滿足上述條件的x 點組成的集合稱做X 被S 腐蝕(Erosion)的結果。用公式表示為:
腐蝕的方法是,拿S 的原點和X上的點一個一個地對比,如果S 上的所有點都在X 的范圍內,則S 的原點對應的點保留,否則將該點去掉。以下是詳細的代碼,並且附上測試圖片:
#include
#include
#include
#include
#include
unsigned char **get_matrix_space(int m,int n)
{
int i;
unsigned char **a;
a=(unsigned char **)calloc(m,sizeof(unsigned char *));
for(i=0;ireturn a;
}
main(){
FILE *fs,*fd;
unsigned char c1,c2,**ps,**pd,**get_matrix_space(int,int);
int width,height,L,i,j,l,m,match;
if((fs= fopen("sourcea.pgm","rb")) ==NULL){
printf("can't open %s\n","source.pgm");
exit(1);
}
if((fd = fopen("destination.pgm","wb")) ==NULL){
printf("can't open %s\n","destination.pgm");
exit(1);
}
fscanf(fs,"%c%c\n%d%d\n%d\n",&c1,&c2,&width,&height,&L);
ps=get_matrix_space(height,width);
pd=get_matrix_space(height,width);
for(i=0;i for(j=0;j fread(&ps[i][j],sizeof(unsigned char),1,fs);
pd[i][j] = 0;
}
}
///////////////////////
match = 1;
for(i=0;i for(j=0;j for(m=i;m for(l=j;l if(ps[m][l]!=255){
match = 0;
}
}
}
if(match != 0){
pd[i][j]=255;
}
match = 1;
}
}
//////////////////////
fprintf(fd,"%c%c\n%d %d\n%d\n",'P','5',width,height,L);
for(i=0;i for(j=0;j fwrite(&pd[i][j],sizeof(unsigned char),1,fd);
}
}
}
膨脹:
把結構元素S 平移x 后得到Sx ,若Sx 與X 相交不為空,我們記下這個x 點,所有滿足上述條件的x 點組成的集合稱做X 被S 膨脹((dilation))的結果。用公式表示為:
膨脹的方法是,拿S 的原點和X 上的點一個一個地對比,如果S 上有一個點落在X 的范圍內,則S 的原點對應的點就為圖像。以下是詳細的代碼,並且附上測試圖片:
#include
#include
#include
#include
#include
unsigned char **get_matrix_space(int m,int n)
{
int i;
unsigned char **a;
a=(unsigned char **)calloc(m,sizeof(unsigned char *));
for(i=0;ireturn a;
}
main(){
FILE *fs,*fd;
unsigned char c1,c2,**ps,**pd,**v,**get_matrix_space(int,int);
int width,height,L,i,j,l,m,windowSize,match;
if((fs= fopen("source.pgm","rb")) ==NULL){
printf("can't open %s\n","source.pgm");
exit(1);
}
if((fd = fopen("destination.pgm","wb")) ==NULL){
printf("can't open %s\n","destination.pgm");
exit(1);
}
fscanf(fs,"%c%c\n%d%d\n%d\n",&c1,&c2,&width,&height,&L);
ps=get_matrix_space(height,width);
pd=get_matrix_space(height,width);
for(i=0;i for(j=0;j fread(&ps[i][j],sizeof(unsigned char),1,fs);
}
}
match = 0;
//////////////////////
//用2x2方塊作為膨脹的結構元素。
for(i=0;i for(j=0;j for(l=i;l for(m=j;m if(ps[l][m]==255){
match = 1;
}
}
}
if(match == 1){
pd[i][j] = 255;
match = 0;
}
}
}
//////////////////////
fprintf(fd,"%c%c\n%d %d\n%d\n",'P','5',width,height,L);
for(i=0;i for(j=0;j fwrite(&pd[i][j],sizeof(unsigned char),1,fd);
}
}
}
一般先將處理圖像轉為整型或邏輯型再處理即可。
s2=logical(originalBW)%這是邏輯型的(二值圖像),你也可以用uint8轉為8位非負整型(灰度或彩色圖像) s3=imdilate(s2,s2,'full')


