形態(tài)學,即數(shù)學形態(tài)學(Mathematical Morphology),在圖像處理中有廣泛的應用,主要應用是從圖像中提取對于表達和描繪區(qū)域形狀有意義的圖像分量,使后續(xù)的識別工作能夠抓住目標對象最為本質(最具區(qū)分能力——most discrimination)的形狀特征,像是邊界、連通區(qū)域等。
基本概念
在數(shù)字圖像處理的形態(tài)學運算中,常常把一幅圖像或者圖像中1個感興趣的區(qū)域稱作集合;而元素通常是指1個單個的像素,用該像素在圖像中的整型位置坐標z=(z1,z2)表示。其他的一些基本概念就是集合的交并補集。值得一提的是差集,A與B的差集由所有屬于A但不屬于B的元素構成,至于包含就是AB的子集關系。
結構元素:設有兩幅圖像A、S。若A是被處理的對象,而S是用來處理A的,則稱S為結構元素,通常是一些比較小的圖像,二者的關系有點類似于濾波中圖像與模板之間的關系。
二值圖像中的基本形態(tài)學運算
tip:所有的形態(tài)學運算都是針對圖像中的前景物體進行的(通常更習慣于將物體用黑色(灰度值為0)表示,背景用白色(灰度值為255)表示,比如Visual C++的一般就遵循這種規(guī)定;但是Matlab在二值圖像形態(tài)學處理中,默認白色為前景,而黑色為背景)。
腐蝕
對Z2上元素的集合A和S,使用S對A進行腐蝕,可以表示為

簡單說來,就是讓原本位于圖像原點的結構元素S在整個Z2平面上進行移動,當S的原點平移至某一點(假定為z)時,S可以完全包含在A中,則所有這樣的點z構成的集合,即為S對A的腐蝕圖像。

假設左邊為待處理的原始圖A,右邊為結構元素S,以S的左下角為原點,進行腐蝕運算后的結果應該為,

tip:這種運算的運算結果不僅與結構元素的形狀有關,還與結構元素的原點位置密切相關。
Matlab中與腐蝕相關的兩個常用函數(shù)為imerode()和strel(),具體應用如下,
>> I=imread('erode_dilate.bmp');
>> figure1=imshow(I);
>> se=strel('square',3)
se =
strel is a square shaped structuring element with properties:
Neighborhood: [3x3 logical]
Dimensionality: 2
>> Ib=imerode(I,se); %腐蝕
>> figure2=imshow(Ib);
>>
>> se=strel('square',5); %將結構元素換成5*5的正方形
>> Ic=imerode(I,se); %腐蝕
>> figure3=imshow(Ic);
>> se=strel([0 1 0;1 1 1;0 1 0]); %將結構元素換成3*3的十字結構元素
>> Id=imerode(I,se); %腐蝕
>> figure4=imshow(Id);
>> se=strel('square',6); %將結構元素換成6*6的正方形
>> Ie=imerode(I,se); %腐蝕
>> figure5=imshow(Ie);
>> se=strel('square',7); %將結構元素換成7*7的正方形
>> If=imerode(I,se); %腐蝕
>> figure6=imshow(If);
顯示結果如下,

由此我們可以看出腐蝕的作用,也就是能夠消融物體邊界,當然具體效果要根據(jù)圖像本身和結構元素的形狀來判斷,如果物體整體上小于結構元素,則被腐蝕后將會完全消失;如果僅有部分區(qū)域小于結構元素(如細小的連通),則連通處會被斷開。
膨脹
對于Z2上元素的集合A和S,使用S對A進行膨脹,可以表示為

也就是說,讓原本位于圖像原點的結構元素S在Z2上移動,當自身原點平移至z點,S相對于其自身原點的反射映像S'和A有公共的交集,也就是說至少有一個像素是重疊的,這樣的z點構成的集合也就是S對A的膨脹圖像。

如圖所示,左側為待處理圖像A,右側為結構元素S,膨脹后圖像為

值得注意的是,膨脹和腐蝕中的不同點是膨脹中要求有公共交集的不是S本身,而是S的反射集,在使用非對稱結構元素的時候需要格外注意。
Matlab中有Imdilate()函數(shù)用于完成圖像膨脹,常用調(diào)用形式如下,
I2=imdilate(I,SE);
參數(shù)形式和之前腐蝕基本一樣,返回值為膨脹后的圖像,具體應用如下,
>> I=imread('starcraft.bmp');
>> se=strel('square',3);
>> Ie1=imerode(I,se); %3*3正方形結構元素的腐蝕
>> se=strel([0 1 0;1 1 1; 0 1 0]);
>> Ie2=imerode(Ie1,se); %3*3十字架結構元素的腐蝕
>> se=strel('square',3);
>> Id1=imdilate(Ie2,se); %3*3正方形結構元素的膨脹
>> Id2=imdilate(Id1,se); %3*3正方形結構元素的膨脹
>> se=strel([0 1 0;1 1 1; 0 1 0]);
>> Id3=imdilate(Id2,se); %3*3十字架結構元素的膨脹
效果如下,

開運算與閉運算
開閉運算都是由膨脹和腐蝕復合而成,開運算是先腐蝕后膨脹,閉運算是先膨脹后腐蝕。
開運算
開運算可以表示為,

一般來說,開運算使圖像的輪廓變得光滑,斷開下載的連接和消除細毛刺。
>> I=imread('img02.bmp');
>> Ie=imerode(I,se);
>> imshow(Ie);
>> Ie2=imdilate(Ie,se);
>> imshow(Ie2);
>> subplot(1,3,1),imshow(I),title('原圖像');
>> subplot(1,3,2),imshow(Ie),title('先腐蝕');
>> subplot(1,3,3),imshow(Ie2),title('后膨脹');
效果如下,

為了更直觀的看出開運算的效果,我們將結構元素稍微設置大一點,
>> se=strel('square',6);
>> Ie4=imopen(I,se);
>> imshow(Ie4)

再直觀一點,
>> I=imread('erode_dilate.bmp');
>> Io=imopen(I,ones(6,6));%采用6*6的正方形結構元素進行開運算
>> subplot(1,2,1),imshow(I);
>> subplot(1,2,2),imshow(Io);
tip:原始圖像分為兩個主要的區(qū)域(圓形和矩形),中間用一個寬度為5的條形連通帶,上面是一個3*3的十字,底部三個正方形邊長分別為3、5、6。

對比前面的腐蝕,我們可以看到,開運算在過濾噪聲的同時并沒有對物體的形狀、輪廓產(chǎn)生明顯的影響,這是一大優(yōu)勢,但是若是只關心物體的位置和個數(shù)的時候,腐蝕的計算速度更具有優(yōu)勢。
閉運算
使用結構元素S對A進行閉運算,可以記作,

閉運算同樣使得輪廓變得光滑,但是與開運算相反,它通常能夠彌合狹窄的間斷,填充小的孔洞。
tip:開閉運算也是對偶的,對于某圖像多次應用開運算或者閉運算,和只進行一次運算的效果相同。
如圖所示,分別是原始圖、閉運算后、開運算后,

