第 12 章 形狀與邊界

14
12 12 第 第第第第第 第 第第第第第 12.1 12.1 第第 第第 12.2 12.2 第第第第第第 第第第第第第 12.3 12.3 第第第第第第 第第第第第第

description

第 12 章 形狀與邊界. 12.1 導論 12.2 鏈碼與形狀數 12.3 傅利葉描述元. 12.1 導論. 本章會著重在檢視物體形狀的方法上 描述形狀的正式方法稱為形狀描述元 ( shape descriptors ) 精確的的定義某項物體的形狀稱為形狀表示法 ( shape representation ) 12.2 鏈碼與形狀數 鏈碼 (chain code) 的概念相當直接 : 沿著物體的邊界行進,並記下行進的方向即可,這些方向便是鏈碼. 要使用 MATLAB 函數求得鏈碼 , 我們可以寫一個小函數來完成 - PowerPoint PPT Presentation

Transcript of 第 12 章 形狀與邊界

Page 1: 第 12 章 形狀與邊界

第第 1212 章 形狀與邊界章 形狀與邊界12.1 12.1 導論導論12.2 12.2 鏈碼與形狀數鏈碼與形狀數12.3 12.3 傅利葉描述元傅利葉描述元

Page 2: 第 12 章 形狀與邊界

12.1 12.1 導論導論• 本章會著重在檢視物體形狀的方法上• 描述形狀的正式方法稱為形狀描述元 (shape descriptors)• 精確的的定義某項物體的形狀稱為形狀表示法 (shape

representation)

12.2 鏈碼與形狀數• 鏈碼 (chain code) 的概念相當直接 : 沿著物體的邊界行進,並記下行進的方向即可,這些方向便是鏈碼

Page 3: 第 12 章 形狀與邊界

0 1 1 1 1 00 1 1 1 1 10 1 1 1 1 11 1 1 1 1 11 1 1 1 1 11 1 1 1 1 0

Page 4: 第 12 章 形狀與邊界

• 要使用 MATLAB 函數求得鏈碼 ,我們可以寫一個小函數來完成• 假設二元數位影像 im 包含了單一物體。我們可以使用下列

MATLAB 指令找出左上角像素• >>[x y]=find(im==1); • >>x=min(x); • >>imx=im(x,:); • >>y=min (imx); • 我們可以將這些數值放入一個矩陣• >>n=[0 1;-1 0;0 -1;1 0];• 給定一個方向 dir, 鍵入下列指令• 這樣就會從正確的方向掃描影像

im 在位置 (x,y) 的鄰域。鄰域掃描完 , 所有的數值都會放入一個小向量 tt

• >> newdir=mod(dir+3,4); • >>fori=0:3,• >>j=mod(newdir+i,4)+1;• >>tt(i+1)=image(x+n(j,1),

y+n(j,2));• 用下列指令找出第一個非零的數值 :• >>d=min(find(tt==1)); • 更新 dir, 目前像素的位置變為 :• >>dir=mod(newdir+d-

1,4); • >>x=x+n(dir+1,1);y=y+n

(dir+1,2); • 執行的同時 , 最新的 dir 值便存入一個向量 , 此項量將會成為最後的鏈碼

Page 5: 第 12 章 形狀與邊界

12.2.1 12.2.1 鏈碼的正規化鏈碼的正規化• 前一節所討論的鏈碼定義會產生兩個問題 :• 1. 鏈碼會因起點像素而改變• 2. 鏈碼會因為物體的方位而改變• 鏈碼正規化概念如下 : 將鏈碼沿著圓型排列 , 將讀取的起始點設為最小整數位置 , 得出的結果便是物體的正規化鏈碼• 首先討論第一個問題• 假設物體由 3x3 方形構成 :

• >>a=zeros(5,5);a(2:4,2:4)=1• a = 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0

• >> c=chaincode4(a)• c =• 3 3 0 0 1 1 2 2• 將鏈碼排列成圓形

Page 6: 第 12 章 形狀與邊界

• 產生循環矩陣• >> m=c;• >>for i=2:8,m=[m;[m(i-1,8),m(i-1,1:7)]];end• >>m m = 3 3 0 0 1 1 2 2 2 3 3 0 0 1 1 2 2 2 3 3 0 0 1 1 1 2 2 3 3 0 0 1 1 1 2 2 3 3 0 0 0 1 1 2 2 3 3 0 0 0 1 1 2 2 3 3 3 0 0 1 1 2 2 3• 使用函數 sortrows, 找出最小整數值的列• >> ms=sortrows(m)• ms = 0 0 1 1 2 2 3 3 0 1 1 2 2 3 3 0 1 1 2 2 3 3 0 0 1 2 2 3 3 0 0 1 2 2 3 3 0 0 1 1 2 3 3 0 0 1 1 2 3 0 0 1 1 2 2 3 3 3 0 0 1 1 2 2• 正規化鏈碼剛好就是第一列• >> ms(1,:) ans = 0 0 1 1 2 2 3 3

Page 7: 第 12 章 形狀與邊界

12.2.212.2.2 形狀數形狀數• 現在來討論如何解決鏈碼會因物體方位而改變的問題• 舉例來說 , 一個簡單的 L 型 :• >>L=zeros(7,6);L(2:6,2:3)=1;L(5:6,4:5)=1• L = 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0

Page 8: 第 12 章 形狀與邊界

• 求其鏈碼• c=chaincode4(L)• c = 3 3 3 3 0 0 0 1 2 2 1 1 1 2• 將鏈碼正規化• >> normalize(c)• ans = 0 0 0 1 2 2 1 1 1 2 3 3 3 3• 假設我們旋轉物體至不同方位 ( 使用函數 rot 函數 , 將矩陣旋轉 90

度 ):• >> L2=rot90(L)• L2 = 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0

Page 9: 第 12 章 形狀與邊界

• 求此新方位的正規化鏈碼 :• >> c2=chaincode4(L2)• c2 = 3 3 2 2 2 3 0 0 0 0 1 1 1 2• >> normalize(c2)• ans = 0 0 0 0 1 1 1 2 3 3 2 2 2 3• 即使經過正規化 , 鏈碼仍舊不同。• 要解決這個問題 , 可以取鏈碼之間的差值 , 再將差值正規化 , 求出形狀數• 使用 MATLAB 求出形狀數。給定鏈碼 c, 產生循環平移編碼 , 將第一個元素移至最後 :• >> c=chaincode4(a)• c = 3 3 0 0 1 1 2 2• >> c1=[c(2:8) c(1)]• c1 = 3 0 0 1 1 2 2 3

Page 10: 第 12 章 形狀與邊界

• 將上述兩向量相減 , 取 mod4• >> mod(c1-c,4)• ans = 0 1 0 1 0 1 0 1• 上述編碼正規化後便是物體的形狀數。使用此函數檢視 L 型及旋轉後的形狀。• >> c=chaincode4(L);• >>lc=length(c);• >>c1=[c(2:lc) c(1)];• >>mod(c1-c,4)• ans = 0 0 0 1 0 0 1 1 0 3 0 0 1 1• 上面結果已正規化。

Page 11: 第 12 章 形狀與邊界

• 檢視 L2:• >> c=chaincode4(L2);• >>lc=length(c);• >>c1=[c(2:lc) c(1)];• >>mod(c1-c,4)• ans =• 0 3 0 0 1 1 0 0 0 1 0 0 1 1• 將其正規化 :• >>normalize(ans)• ans=• 0 0 0 1 0 0 1 1 0 3 0 0 1 1• 與 L 的結果一樣

Page 12: 第 12 章 形狀與邊界

12.3 12.3 傅利葉描述元傅利葉描述元• 概念如下 : 我們沿著物體邊界行走,但並非記下方向,而是記下邊界座標。所有的座標 (x,y) 會轉換為一列複數 z=x+yi 。而這列複數經過傅利葉轉換的結果則稱為該物體的傅利葉描述元 (Fourier

descriptor)• 使用傅利葉描述元的好處在於,只要根據轉換的前面幾項,就可以辨別物體或進行分類• 函數 chaincode4.m 可以簡單的修改為 boundary4.m ,將下列指令 cc=[cc,dir];

x=x+n(dir+1,1);y=y+n(dir+1,2); 換為 x=x+n(dir+1,1);y=y+n(dir+1,2); cc=[cc,x y];

Page 13: 第 12 章 形狀與邊界

• 如此一來,變數 cc 包含了邊界像素值。假設函數已經修改並執行如下 :• >>a=zeros(5,5);a(2:4,2:4)

=1• a = 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0• >>b=boundary4(a)• b= 3 2 4 2 4 3 4 4 3 4 2 4 2 3 2 2

• 將數值轉換為複數 :• >>c=complex(a(:,1),a(:,2))• c = 3.0000 + 2.0000i 4.0000 + 2.0000i 4.0000 + 3.0000i 4.0000 + 4.0000i 3.0000 + 4.0000i 2.0000 + 4.0000i 2.0000 + 2.0000i 2.0000 + 2.0000i

Page 14: 第 12 章 形狀與邊界

• 然後畫出來 :• >>plot(c,'o'),axis([1,5,1,5]),axis equal• 進行傅利葉轉換,然後擷取其中幾項 :• >> f=fft(c)• f = 24.0000 + 24.0000i 0 - 9.6569i 0 0 0 0 + 1. 6569i 0 0>>f1=zeros(size(f)); >>f1(1:2)=f(1:2); >>plot(ifft(f1),'o'),axis([1.0,5.0,1.0,5.0]),axis

square• 結果如圖 12.2 所示。可發現下列幾點:• 1.c 經過傅利葉轉換後只有三項不為零• 2. 只要知道轉換結果的其中兩項就可獲得對物體的形狀、大小對稱性的概念。• 3. 即使形狀大幅度改變 , 例如方形變圓形 , 許多形狀描述元仍只有小幅變動

圖 12.11 邊界像素

圖 12.12 使用傅利葉描述元求邊界 近似值