鏈碼
鏈碼
常用的鏈碼按照中心像素點鄰接方向個數的不同,分為4連通鏈碼和8連通鏈碼。4連通鏈碼的鄰接點有4個,分別在中心點的上、下、左和右。8連通鏈碼比4連通鏈碼增加了4個斜方向,因為任意一個像素周圍均有8個鄰接點,而8連通鏈碼正好與像素點的實際情況相符,能夠準確地描述中心像素點與其鄰接點的信息。因此,8連通鏈碼的使用相對較多。
4鏈碼和8鏈碼
按照水平、垂直和兩條對角線方向,可以為相鄰的兩個像素點定義4個方向符:0、1、2、3,分別表示0度、90度、180度和270度四個方向。同樣,也可以定義8個方向符:0、1、2、3、4、5、6、7。鏈碼就是用線段的起點加上由這幾個方向符所構成的一組數列,通常稱之為Freeman鏈碼。用Freeman鏈碼錶示曲線時需要曲線的起點,對8鏈碼而言,奇數碼和偶數碼的對應線段長度不等,規定偶數碼單位長度為1,奇數碼的單位長度為0。
從邊界(曲線)起點S開始,按順時針方向觀察每一線段走向,並用相應的指向符表示,結果就形成表示該邊界(曲線)的數碼序列,稱為原鏈碼。
原鏈碼具有平移不變性(平移時不改變指向符),但當改變起點S時,會得到不同的鏈碼錶示,即不具備唯一性。為此可引入歸一化鏈碼,其方法是:對於閉合邊界,任選一起點S得到原鏈碼,將鏈碼看作由各方向數構成的n位自然數,將該碼按一個方向循環,使其構成的n位自然數最小,此時就形成起點唯一的鏈碼,稱為歸一化鏈碼,也稱為規格化鏈碼。
給定一個從任意點開始得到的鏈碼,把它看作一個由各方向數構成的自然數。將這些方向數依一個方向循環,以使它們所構成的自然數的值最小。我們將這樣轉換后所對應的鏈碼起點作為這個邊界的歸—化鏈碼的起點。
用鏈碼后,對象只要用起點坐標、周長(邊界點數)、鏈碼、對象編號,就可以描述。鏈碼一般用於一幅圖像中有多個對象的情況,對單個對象不適用。
在Matlab圖像處理工具箱中,提供了專門的bwlabel( )函數,對二值圖像的進行連通分支標記(非鏈碼)。其調用格式如下:L = bwlabel(BW,n)。該函數返回一個和輸入的二值圖像BW大小相同的L矩陣,包含了標記了BW中每個連通區域的類別標籤,這些標籤的值為1、2、n(連通區域的個數)。n的值為4或8,表示是按4連通尋找區域還是8連通尋找,如果參數省略,則默認為8。
8連通邊界的鏈碼生成程序:
function out=chaincode8(image)
%功能:實現8連通鏈碼
%輸入:二值圖像
%輸出:鏈碼的結果
n=[0 1;-1 1;-1 0;-1 -1;0 -1;1 -1;1 0;1 1];
%設置標誌
flag=1;
%初始輸出的鏈碼串為空
cc=[];
%找到起始點
[x y]=find(image==1);
x=min(x);
imx=image(x,:);
y=min(find(imx==1));
first=[x y];
dir=7;
while flag==1
tt=zeros(1,8);
newdir=mod(dir+7-mod(dir,2),8);
for i=0:7
j=mod(newdir+i,8)+1;
tt(i+1)=image(x+n(j,1),y+n(j,2));
end
d=min(find(tt==1));
dir=mod(newdir+d-1,8);
%找到下一個像素點的方向碼後補充在鏈碼的後面
cc=[cc,dir];
x=x+n(dir+1,1);y=y+n(dir+1,2);
%判別鏈碼的結束標誌
if x==first(1)&&y==first(2)
flag=0;
end
end
out=cc;