• 沒有找到結果。

線追隨(Line Following)演算法

Line Following Algorithm Concept Introduction

在Baruch[3]的原理提到,藉由一個細長的線條,如圖 2-1 所示。線條的兩個 側邊(左側與右側)各取一個點(X),這兩個點經由特定數值(Coefficient d)的擴展形

成一個矩形包覆該線條的某個線段後,該矩形的中心點(O)就是這線段的中心點,

如圖 2-2 所示。

圖 2-1 細長的線條示意圖

圖 2-2 藍色矩形包覆某線段,並形成該線段的中心點(O)

只要沿著線條的左右兩側不斷地取出兩個點來形成矩形並得到所對應的中心 點,如圖 2-3 ~ 圖 2-7 所示。

圖 2-3 取第 2 個矩形並找出中心點(O)

圖 2-4 取第 3 個矩形並找出中心點(O)

圖 2-5 取第 4 個矩形並找出中心點(O)

圖 2-6 取第 5 個矩形並找出中心點(O)

圖 2-7 取第 6 個矩形並找出中心點(O)

再將這數個中心點連接起來就是這條黃色線條的骨架(Skeleton)也就是細線化 的結果,如圖 2-8 所示。

圖 2-8 連接 6 個中心點(O)即為該線條的骨架,如綠色直線所示

如此一來,一條細長線條可以藉由好幾個矩形的中心點,並連接這些中心點來 形成該線條的骨架,再刪掉非中心點的其餘部份而達到細線化的目的。

線條的兩側邊界點定義

(Left Points 與 Right Points)

在Line Following 中如定義出線條的兩側邊界:左側邊界與右側邊界是至關重 要的。其觀念可以用一行人走在單行道上來做說明。當一行人沿著一條單行道從起 點走到終點的過程中,行人的左手邊代表該單行道的左側,右手邊則代表該單行道 的右側,如圖 2-9 所示。

圖 2-9 行人由左往右,走在一條平坦彎曲的單行道上

相反地,如果把圖 2-9 行人的起點與終點互相對換,原本的單行道的左側和 右側也會跟著互後對換,如圖 2-10 所示。

圖 2-10 行人由右往左,走在一條平坦彎曲的單行道上

現在,有了以上的觀念,吾人將之應用到Line Following 內的線條細線化概念 上。在一個BMP 圖檔的線條圖案,行人換成矩形 Window,單行道換成是線條,

而矩形從線條的起點到終點的過程中,左側的Pixel 點均為 Left Points,右側的 Pixel 點均為Right Points,如圖 2-11 所示。而從起點到終點的多個矩形中心點串連起來 即為該線條的骨架。

圖 2-11 在 BMP 圖檔的線條圖案中,矩形 Window 如同行人,線條如同單行道

圖 2-12 Line Following 圖形化表示方式

一般來說,矩形Window 可以簡化成 W,而 W 的行進方向可以用兩個箭頭做 為行進方向的標示用,如圖 2-12 所示。

線追隨的所有判斷直行或是分岔或是轉彎,靠 Window 所包覆住的線段狀態

而定。所以Window 也可比喻為人的眼睛一樣。

四種

Window 行進方向(往右、往左、往上、往下)定義

在Baruch[3]中的範例有提到三種不同的 Line Following Window 的行進方向,

本研究在多增加一種方向使其更加完善,如表 2-1 所示。

表 2-1 Window 行進的方向與種類比較表

研究論文 Window 行進方向種類 Window 行進方向類型 Line thinning by line

following 3 往上、往右、往下

本研究 4 往上、往右、往下、往左

為了方便後續討論,將對四種Window 行進方向做一個簡稱定義與說明,如表

Right Direction LF-RD Line Following 的 Window 的行進方向 為往右邊來做細線化

Line Following

Left Direction LF-LD Line Following 的 Window 的行進方向 為往右邊來做細線化

Line Following

Down Direction LF-DD Line Following 的 Window 的行進方向 為往右邊來做細線化

Line Following

Up Direction LF-UD Line Following 的 Window 的行進方向 為往右邊來做細線化

Coefficient d

在Baruch[3]中提到係數 d 的值,其論述 d 值越大,Line Following 的速度就越

快。本研究會再下一節2.5 深入探討用這個 d 值所擴展出來的 Window 到底有什麼 神秘的意義在。

係數d 是 Left Point 和 Right Point 再各自延伸 d 個單位。而此延伸的動作是有 方向性的,意即Left Point 是往前延伸 d 個單位;Right Point 則是往後延伸 d 個單 位。在圖 2-13 中的灰色區塊是指某一條線段,而 L 在上,R 在下,可以說明 Window 的行進方向為RD,當係數 d 等於 2 時,Ld 的位置會在 L 的往左與往前 2 單位的 點上,Rd 則是在 R 的往右與往後 2 單位的點上。

圖 2-13 係數 d 等於 2 且當 Window 為 RD 時的示意圖

以下是Window 的行進方向同樣是 RD 但係數 d 變為 3 時的 Ld 與 Rd 所在位 置示意圖,如圖 2-14 所示。由此可知,Ld 與 Rd 的設定除了與係數 d 息息相關之 外,也與行進Window 的「前方」與「後方」和「左方」與「右方」有密切的關聯。

圖 2-14 係數 d 等於 3 且當 Window 為 RD 時的示意圖

當Window 行進方向為 UD 且係數 d 等於 2,其 Ld 與 Rd 的分佈位置如圖 2-15 所示。

圖 2-15 係數 d 等於 2 且當 Window 為 UD 時的示意圖

當Window 行進方向為 LD 且係數 d 等於 1 其 Ld 與 Rd 的分佈位置如圖 2-16 所示。

圖 2-16 係數 d 等於 1 且當 Window 為 LD 時的示意圖

當Window 行進方向為 DD 且係數 d 等於 2 其 Ld 與 Rd 的分佈位置如圖 2-17 所示。圖 2-17 是一張模擬真實線條(灰色區塊部份)的不規則兩個側邊時,當 Window 行進方向為 DD,在線條一側邊的眾多 Pixel 中任取一點為 L,在另外一側 邊的眾多Pixel 中任取一點為 R,因為係數 d 等於 2,所以可以定位出 Ld 與 Rd 的 位置。

圖 2-17 係數 d 等於 2 且當 Window 為 DD 時的示意圖

Expanded Window 與 Window 中心點計算

在前一節中已定位出Ld 與 Rd 的位置,接下來透過任意兩點可以構成一個矩 形的觀念,將Ld 與 Rd 形成一個矩形,而這個矩形就是 Pixel 點 L 與 Pixel 點 R 透 過係數d 所架構出來的擴展矩形(Expanded Window),在 Line Following 中簡稱為 Window 或 W,為了表明 Window 的行進方向為何,會加上兩個箭頭符號(由左往 右),表示此 Window 的行進方向為 RD,如圖 2-18 所示。反之,兩個箭頭符號為 由下往上則代表Window 的行進方向為 UD,如圖 2-19 所示。剩下 2 個的 Window 的行進方向其標示法以此類推。

圖 2-18 擴展矩形(Expanded Window)

圖 2-19 Window 的行進方向的箭頭標示法(UD)

當Window 形成後就是找出 Window 的中心點做為該線段的中心點。在 BMP 的圖檔架構中其座標系統為笛卡爾座標系,原點在左下角,如圖 2-20 所示。

圖 2-20 BMP 座標系統圖示

而其Pixel 的掃描方式是從左下角的原點(0,0)開始往右再往上一行的最左邊開 始往右掃描。如此反覆一直掃描到最後一個Pixel 停止,如圖 2-21 所示。

圖 2-21 BMP 座標掃描方式圖示

BMP 圖檔的像素(Pixel)排列方式有其特定的規則,如之前的圖 2-20 所示。因 此,會將像素的值存放在1 維陣列內並透過該 1 維陣列的 Index 索引值來對應該像 素的值。下面將利用幾張圖片說明BMP 圖片像素與 1 維陣列索引值的相對關係,

這對於如何找出Window 中心點與其它的相關參數,如 Rd、Ld、如何找出 Window

的前邊界是有分岔以及第三章所要討論的輪廓追蹤所架構出的 Window…等等的

一些公式推導有很重要的相關性。

以一條9 x 3 的黑色橫直線且周圍均佈滿空白的 13 x 7 的 8bit 二值化灰階的 BMP 圖檔為例,如圖 2-22 所示。將這條黑色橫直線變更為灰色並加入格線後,可 以使得觀看更加容易,如圖 2-23 所示。

圖 2-22 一張 13 x 7 的 BMP 圖片中有一條 9 x 3 的黑色橫直線

圖 2-23 將圖 2-22 的黑色橫直線以底色為灰色表示之 再將圖 2-23 的灰色方塊標示為 1;空白標示為 0,如圖 2-24 所示。

圖 2-24 灰色標識為 1;空白標識為 0

下圖是該13 x 7 的 BMP 圖片的 1D Array 的表示,可以發現 BMP 圖片的第 1 個 Pixel 是從圖片的左下角算起,並放入 Index 索引值為 0 的 1D Array 內,如圖 2-25 所示。第 14 個像素的值會放在 Index 索引值為 13 的 1D Array 內,最後一個 像素,也就是第91 個像素的值會放在 Index 索引值為 90 的 1D Array 內。

圖 2-25 BMP 圖檔的像素與 1D Array 索引值對應分佈圖

吾人姑且將上述的1D Array 命名為 BL(Black Line 的簡稱),其陣列內有 91 個 元素。再綜合以上並比對圖 2-24 與圖 2-25 這兩張圖示後可以了解到此黑色橫直 線共有 9 x 3=27 個像素表示之,這 27 個像素的值會存放在 BL[28]~BL[36]、

BL[41]~BL[49]以及 BL[54]~BL[62]內且值均為 1,而其它的 64 個像素則存放在 BL

剩餘的元素內,其值均存放0。舉例:BL[45]=1,BL[76]=0,剩下的以此類推。

圖 2-26 以黑色橫直線為例的 L、R、Ld 以及 Rd 範例說明圖(RD)

根據Baruch[3]內所提到給定 L、R 與系數 d 後就可以構成一個 Window(W),

如圖 2-26 的藍色矩形所示。L 的索引值為 58,R 的索引值為 32,係數 d 為 2,則 根據Ld 與 Rd 位置定義(可參考圖 2-13 之說明),Ld 的索引值會落在 86,Rd 的索 引值會落在4,Window(W)中心點的索引值為 45。以下整理出各 Window 行進方向 (RD、DD、LD、UD)的 L、R、Ld、Rd 與 Window 中心點的計算公式。其中 BMPWidth 代表BMP 圖檔的寬,BMPHeight 代表 BMP 圖檔的高;BMPWindow_Width 代表 Window 的寬,BMPWindow_Height 代表 Window 的高;BMP_j_x_start 代表 Window 的寬的最左邊的點所對應至X 軸的值,BMP_j_x_end 代表 Window 的寬的最右邊 的點所對應至X 軸的值;BMP_i_y_start 代表 Window 的高的最下邊的點所對應至 Y 軸的值,BMP_i_y_end 代表 Window 的高的最上邊的點所對應至 Y 軸的值;

BMP_LPRP_Center 代表 Window 中心點。可對照下方的圖 2-27 與圖 2-28 的圖片 說明。

關於公式內的參數d 已經在 2.4 章節中討論過,可由圖 2-13 可以發現 Ld 與 Rd 均是藉由 L 與 R 往 X 軸與 Y 軸擴展同樣一個數值也就是參數 d 來架構出整個 Window。在第 3 章 中會針對 Chouinard and Plamondon[4]所提出的參數 d 是由不 同的X 軸與 Y 軸擴展值來架構出整個 Window,此架構出來的 Window 與其所定 義出的分岔類型(type T 與 type X)對於 Thinning 議題中的重要課題-分岔處理,是 非常具有價值的。

公式中運用Excel VBA 的 2 個函數語法,Int()為取得數值的整數部分,小數點 以下無條件捨去,另一個Mod()則為傳回兩數相除後的餘數。

圖 2-27 一個 13 x 9 的 BMP 圖檔中有一個 9 x 3 的黑色橫直線

圖 2-28 圖 2-27 的索引值表示圖與定義 4 個參數 RD:

Ld = L + (BMPWidth * d + d) Rd = R - (BMPWidth * d + d)

BMP_j_x_start = Rd Mod BMPWidth BMP_j_x_end = Ld Mod BMPWidth BMP_i_y_start = Int(Rd / BMPWidth)

BMP_i_y_end = Int(Ld / BMPWidth)

BMPWindow_Width = BMP_j_x_end - BMP_j_x_start + 1 BMPWindow_Height = BMP_i_y_end - BMP_i_y_start + 1

BMP_LPRP_Center = R + Int((BMPWindow_Width - d * 2) / 2) + Int((BMPWindow_Height - d * 2) / 2) * BMPWidth

DD:

Ld = L - BMPWidth * d + d Rd = R + BMPWidth * d – d

BMP_j_x_start = Rd Mod BMPWidth BMP_j_x_end = Ld Mod BMPWidth BMP_i_y_start = Int(Ld / BMPWidth) BMP_i_y_end = Int(Rd / BMPWidth)

BMPWindow_Width = BMP_i_y_end - BMP_i_y_start + 1 BMPWindow_Height = BMP_j_x_end - BMP_j_x_start + 1

BMP_LPRP_Center = L - Int((BMPWindow_Height - d * 2) / 2) + Int((BMPWindow_Width - d * 2) / 2) * BMPWidth

LD:

Ld = L - (BMPWidth * d + d) Rd = R + (BMPWidth * d + d)

BMP_j_x_start = Ld Mod BMPWidth BMP_j_x_end = Rd Mod BMPWidth BMP_i_y_start = Int(Ld / BMPWidth) BMP_i_y_end = Int(Rd / BMPWidth)

BMPWindow_Width = BMP_j_x_end - BMP_j_x_start + 1

BMPWindow_Height = BMP_i_y_end - BMP_i_y_start + 1

BMP_LPRP_Center = L + Int((BMPWindow_Width - d * 2) / 2) + Int((BMPWindow_Height - d * 2) / 2) * BMPWidth

UD:

Ld = L + BMPWidth * d - d Rd = R - BMPWidth * d + d

BMP_j_x_start = Ld Mod BMPWidth BMP_j_x_end = Rd Mod BMPWidth BMP_i_y_start = Int(Rd / BMPWidth) BMP_i_y_end = Int(Ld / BMPWidth)

BMPWindow_Width = BMP_i_y_end - BMP_i_y_start + 1 BMPWindow_Height = BMP_j_x_end - BMP_j_x_start + 1

BMP_LPRP_Center = R - Int((BMPWindow_Height - d * 2) / 2) + Int((BMPWindow_Width - d * 2) / 2) * BMPWidth

以上列出的公式皆截取自 BMP 動態線追隨圖像化擴展 Window 追蹤系統 V10.0 內的程式設計碼,因應論文內容只有些許的部分變數命名有做變動。其中 Window 中心點 BMP_LPRP_Center 公式並不是唯一的,可依照參考的點的不同而 做不一樣的變化。

Next Left Point 與 Next Right Point 取點準則

Next Left Point 與 Next Right Point 取點準則

相關文件