第三章 系統架構
3.2 取瞳原理
3.2.2 斑點檢測
斑點檢測在影像處理中常用於檢測是否有符合程式設計者定義的影像區 域,並將每個區域視為一個獨立的斑點(Blob),設計者可以使用灰階值、色 彩值等條件來定義篩選機制,每個斑點內的所有像素點都擁有相同的特性,
以下為斑點檢測的執行程序 : A. 影像分割
如前段所說,影像分割的條件是由使用者定義的,本研究使用灰階 值來進行影像分割,也就是章節3.2.1 所提到的閥值分割法。
下圖3-5 為一個二值化處理後影像的示意圖,是一個由最小灰階值 0(黑色)與最大灰階值 255(白色)組成的影像,圖中的黑色區域將會在斑點 檢測的流程中被一一標出。
B. 斑點檢測
斑點檢測(Blob Detection)的目標是將符合條件且彼此鄰近的像素貼 上標籤(Labelling),再判斷每塊標籤彼此是否為同一個斑點物件(Blob)。
圖3-5 來源影像二值化示意圖
22
在判定過程中,若彼此相鄰的像素擁有不同的標籤時,需要透過一 開始建立的標籤表(Label Table,或稱標籤陣列)來決定是否為同一個斑點 物件。藉由這個方式將相鄰的像素標記為同一塊斑點,其方法與詳細步 驟如下 :
1. 建立標籤表
在此作為範例的示意圖為8x7 像素的二值化影像,當檢測灰階值 為0 的黑色區域時,該影像可能的最大斑點數量應為下圖 3-6 所示的 數量。
如圖中所示,任一單點的黑色像素皆沒有相鄰,代表每一個黑色 像素都是獨立的斑點物件,此刻的斑點數量為8x7 像素影像中的最 大值,共計16 個。斑點物件最大值與影像寬、影像高的關係如(3-2) 至(3-4)式所示。
圖3-6 具有最大斑點數量的影像
(3-2)
(3-3)
23
接著使用斑點物件最大值(Blob MaxVal)的數字建立標籤表陣列 Label_Tab[Blob_MaxVal],建立出來的陣列如下表所示。
上表中Label 表示該像素被給予的像素標籤,Blob 則是該像素隸 屬於哪一塊斑點,在初始化時的假設為每一塊標籤都自成一塊斑點 物件。
2. 建立斑點陣列
依照來源影像的尺寸計算出其陣列長(length),並以此陣列長建 立出斑點陣列表(Blob_Label),用來記錄二值化影像中符合定義而被 標籤的像素。
(3-4)
Label 1 2 3 4 5 … Blob_MaxVal Blob 1 2 3 4 5 … Blob_MaxVal
表3-1 Label Table 的初始值
圖 3-7 二值化影像與斑點陣列
24
25
由於B、C、D 像素皆超出影像範圍,Label Kernel 只會剩下檢測核 心X 與檢測像素 A。
圖3-9 中,當檢測核心 X 像素符合定義時(灰階值為 0,影像為 黑色時為true,反之則為 false),則依據 Label Kernel 檢測其相鄰像 素是否符合定義(在此僅需檢查 A 像素),其檢測公式如下
5. 對首行像素進行檢測
經過步驟4 的檢測後,將會得到如下圖 3-10 所示的結果,可以 看到原先首列的2 個像素應分別被標籤為 1 和 2,但由於兩像素相鄰,
故像素2 的標籤被併為像素 1 的標籤。
圖3-9 首列像素檢測與Label Kernel
(3-5)
(3-6)
26
接下來要針對首行(首列以外的任一列 Row N 的起始點)的像素 進行檢測,如下圖3-11 中的 Label Kernel(A、B 超出影像範圍),對 首行像素依序檢測是否有符合定義的相鄰像素並貼上標籤。
受檢測像素Pixel[X]的檢測順序如圖中的 Label Kernel 所示依序 為C、D,其中的檢測公式如下(3-7)、(3-8)式。
圖3-10 併入前與併入後的首列檢測像素
圖 3-11 首行像素檢測與 Label Kernel
(3-7)
27
6. 對其餘列(不包含首尾像素)進行檢測
檢測完首列與首行像素後,於本步驟開始計算其餘列(Row 2- Row N)起始點至結束點之間的像素。
受檢測像素Pixel[X]與其相鄰像素的檢測關係如上圖 3-12 所示,
檢測順序依序為A、B、C、D 像素,其中的檢測公式如下(3-9)、(3-10) 式。
(3-8)
圖 3-12 其餘列像素起始點至結束點間的像素檢測與 Label Kernel
(3-9)
(3-10)
28
到這個步驟,可能會出現一矛盾的狀況,受測點Pixel[X]檢測到 D 像素時,若斑點標籤 Blob_Label[X]與 Blob_Label[D]不同時,必須 更加一步探討標籤表中斑點物件與標籤之間的關係。
如圖3-13 中所示,在二值化影像中與 Pixel[X]相鄰的 Pixel[B]與 Pixel[D]都符合檢測定義(灰階值都為 0,黑色),依照(3-9)與(3-10)式,
Blob_Label[X]會為 4。由上圖 3-13 可觀察到像素 Pixel[D]所對應的 Blob_Label[D]應為 5,此時以 X 為核心檢測到 D 時,會發現
Blob_Label[X]不等同於 Blob_Label[D],意即像素 X 與像素 D 為不 同塊斑點,遇到這種狀況時則須檢視標籤表中紀錄的斑點物件與標 籤之間的關係。
由圖3-13 可知,Pixel[X]與 Pixel[D]2 個像素分別屬於不同的斑 點物件(Blob 4、Blob 5),在此情況下需要分成 3 種狀況討論 Label[4]
與Label[5]是否要歸為同一個斑點物件,分別是 : Label[X] = Blob_Label[X]、Label[D] = Blob_Label[D]、兩者皆非。
(1) Label[X] = Blob_Label[X]
此情況代表代表Pixel[X]歸屬於與自身標籤號碼相同的斑點物 件,代表Pixel[X]所屬的 Label 並未被其他斑點物件合併,在此情況 下會將像素X 所屬的 Label 合併到像素 D 所屬的斑點物件。
圖 3-13 標籤與斑點物件的從屬關係
29
如圖3-13 所示,Pixel[X]的標籤 Label 4 原本隸屬於 Blob 4,意即 Label[4] = Blob_Label[4] = 4,在更新後會得到 Label [4] = Label[D] = 5,即代表其歸屬於 Blob 5。
(2) Label[D] = Blob_Label[D]
當狀況(1)沒有發生時,才進入此狀況的判定。(2)步驟被觸發時 代表像素X 已經被合併到其他的斑點物件中,所以此步驟將探討像 素D 是否被合併於其他斑點物件中。若 Label[D] = Blob_Label[D]時 即代表像素D 的標籤隸屬於自身的斑點物件,並未受到合併。此時 會將像素D 的標籤併入像素 X 的斑點物件中,即 Label[D] = Label[X]。
倘若Label[D]不等於 Blob_Label[D]時,則代表像素 D 的標籤也已經 被併入其他斑點物件了,此時則繼續判斷步驟(3)。
(3) 兩者皆非
當(1)、(2)情況皆沒有發生時,代表像素 X 與像素 D 各自的標籤 都已經被併入其他的斑點物件了;在此,演算法上會先將像素X 標 籤所屬的斑點物件合併至像素D 標籤所屬的斑點物件,也就是 Label[Label[Blob_Label[X]]] = Label[Blob_Label[D]],接著將 X 像素 標籤的Blob_Label[X]一起併入像素 D 的斑點物件,即為
Label[Blob_Label[X]] = Label[D]。
7. 對末行進行檢測
前面的 3 個步驟已經完成了首列、首行、每列起始點至結束點間 的像素檢測,接下來只剩下末行(每一列的結束點)的像素檢測。
30
如上圖3-14 所示,針對與 Pixel[X]相鄰的像素進行檢測,符合 定義者則貼上標籤,檢測順序依序為A、B、C,其中的關係可用下 (3-11)、(3-12)式判定。
8. 檢測結果
圖 3-14 末行像素檢測與 Label Kernel
(3-11)
(3-12)
圖 3-15 二值化影像與斑點標籤陣列及標籤表
31
圖3-15 中可清楚得知 Label 1 至 Label 7 被分別分在 Blob 1、Blob 3、Blob 5、Blob 6、Blob 7 共 5 個斑點物件中,這 5 個物件即為斑點 檢測的結果。
下圖3-16 中為完成檢測後,各斑點分布狀況的示意圖與其中的 標籤數字列表。