鏈碼

鏈碼

鏈碼(又稱為freeman碼)是用曲線起始點的坐標和邊界點方向代碼來描述曲線或邊界的方法,常被用來在圖像處理、計算機圖形學、模式識別等領域中表示曲線和區域邊界。

簡介

常用的鏈碼按照中心像素點鄰接方向個數的不同,分為4連通鏈碼和8連通鏈碼。4連通鏈碼的鄰接點有4個,分別在中心點的上、下、左和右。8連通鏈碼比4連通鏈碼增加了4個斜方向,因為任意一個像素周圍均有8個鄰接點,而8連通鏈碼正好與像素點的實際情況相符,能夠準確地描述中心像素點與其鄰接點的信息。因此,8連通鏈碼的使用相對較多 。

4鏈碼和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 。

分類

1、原鏈碼

從邊界(曲線)起點S開始,按順時針方向觀察每一線段走向,並用相應的指向符表示,結果就形成表示該邊界(曲線)的數碼序列,稱為原鏈碼。

2、歸一化鏈碼

原鏈碼具有平移不變性(平移時不改變指向符),但當改變起點S時,會得到不同的鏈碼錶示,即不具備唯一性。為此可引入歸一化鏈碼,其方法是:對於閉合邊界,任選一起點S得到原鏈碼,將鏈碼看作由各方向數構成的n位自然數,將該碼按一個方向循環,使其構成的n位自然數最小,此時就形成起點唯一的鏈碼,稱為歸一化鏈碼,也稱為規格化鏈碼。

給定一個從任意點開始得到的鏈碼,把它看作一個由各方向數構成的自然數。將這些方向數依一個方向循環,以使它們所構成的自然數的值最小。我們將這樣轉換後所對應的鏈碼起點作為這個邊界的歸—化鏈碼的起點。

MATLAB套用

用鏈碼後,對象只要用起點坐標、周長(邊界點數)、鏈碼、對象編號,就可以描述。鏈碼一般用於一幅圖像中有多個對象的情況,對單個對象不適用。

在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;

相關詞條

相關搜尋

熱門詞條

聯絡我們