第三章 研究內容與方法
3.2 瞳孔偵測
本論文使用的瞳孔偵測方法主要可分為四個步驟,圖 3-5 為瞳孔偵測流程圖,
在經由瞳孔攝影機取得原始影像後,會先對影像進行二值化,接著進行輪廓追蹤 找出各區塊的輪廓後,進行橢圓擬合找出相似於瞳孔的形狀,最後進行排除誤判
區域,以下會逐一介紹。 二值化法又稱為大津二值化法,是由 Nobuyuki Otsu(大津展之)先生於 1979 年提 出的一種自動二值化演算法。主要概念是將一張灰階圖的所有像素分為前景和背
為了計算各個閥值的類間變異數,首先會根據影像內所有像素的灰階值建立 一個表格稱作直方圖,在灰階影像中,灰階值的範圍為 0 到 255,讀取影像中每 一個像素的灰階值,統計出所有灰階值的像素在影像中的數量,並將這些統計出 的數量建成一個表格即為直方圖。舉例來說,在一張灰階影像中,灰階值為 0 的 像素總共有 n0個,灰階值為 1 的像素總共有 n1個,以此類推統計到灰階值為 255 的像素共有 n255個。統計完成之後對這些 n 值做正規化,將每個灰階值的 n 值除 上影像中像素的總數量,就能得到灰階值 i 在影像中出現的機率ℎ(𝑖),最後以窮 舉法去計算灰階值 1 到 254 的類間變異數𝜎𝑏2,將𝜎𝑏2最大的灰階值當作閥值。
在本論文中,因為在瞳孔攝影機旁邊有加裝紅外光 LED 燈照射瞳孔增加影像 清晰度,單使用 Otsu 二值化法找出的閥值會有過大的情況,無法有效的區分出 影像中的瞳孔。經過多次測試後,本論文將求出的閥值乘上一常數 0.6,降低閥 值再進行二值化即可有效區分出影像中的瞳孔。圖 3-6 為原始影像和經過二值化 的影像,可以看到原始影像在經過二值化後,瞳孔的圖形可以很明顯的被區分出 來。
圖 3-6 原始影像和經過二值化後的影像
3.2.2 輪廓追蹤
輪廓追蹤是為了擷取二值化影像中輪廓的演算法,在本論文中,使用 OpenCV 提供的輪廓追蹤函數提取輪廓[23][24],將上一節產生的二值化影像中各區塊的 輪廓點擷取出來進行下一步的橢圓擬合,以下會簡單介紹輪廓追蹤的演算法。
首先定義一個 8-connectivity 的遮罩如圖 3-7,其中 P 為中心像素,0~7 為 P 周圍 8 個像素,也代表 8 個方向:
圖 3-7 輪廓追蹤使用的 8-connectivity 遮罩
輪廓追蹤演算法的步驟如下:
(1) 將遮罩從上至下、從左至右掃描影像,將搜尋到第一個為區塊像素的像 素作為起始像素 P0。
(2) 定義一個初始值為 7 的方向變數 dir,以 P0為中心點從 dir 方向開始以 逆時針方向搜尋,尋找下一個區塊像素。
(3) 找到下一點後將其標為 P1,若此時 dir 的方向為偶數,則將 dir 加 7;
若 dir 為奇數,則將 dir 加 6。
(4) 重複 2~4 的步驟,直到標記到 Pn時搜尋到的像素為 P1,且 Pn-1和 P0為相 同像素。
(5) 此區塊的輪廓即為 P0、P1、…、Pn-2。
(6) 繼續掃描影像直到搜尋到下一個未被標記的區塊像素,重複上述步驟直 到掃描完整張影像。
圖 3-8 為經過輪廓追蹤後將輪廓畫出的影像:
圖 3-8 輪廓追蹤後將輪廓畫出的影像
3.2.3 橢圓擬合
μ𝑖 = √𝑢 1
𝑖𝑇𝐶𝑢𝑖 = √𝑢λ𝑖
𝑖𝑇𝑆𝑢𝑖 (3-6) 最後令𝑎̂ = μ𝑖 𝑖𝑢𝑖,取λ𝑖 > 0的解作為橢圓擬合的解。
圖 3-9 為橢圓擬合後的結果,可以看到影像中瞳孔的區塊被擬合成完整的橢 圓。
圖 3-9 橢圓擬合後產生的瞳孔影像
3.2.4 排除誤判區域
在大部分的情況下,經過橢圓擬合之後就能找出適當的瞳孔位置,但影像中 難免會有非瞳孔的橢圓形出現,最常見的情況就是瞳孔較接近眼角時會和眼角形 成橢圓,因此本論文採取一個簡單的篩選方法來避免誤判情形。
圖 3-10 為一個可能出現誤判的瞳孔影像情形,在瞳孔靠近眼角處時,擬合出 紅色的橢圓即為誤判區域,和誤判區域相比,在瞳孔內部的像素多為深色像素,
而瞳孔靠近眼角時形成的橢圓內部的淺色像素較多。
圖 3-10 可能出現誤判的瞳孔影像情形
因此在判斷橢圓是否為瞳孔時,本論文檢查橢圓內部的五點是否為深色像素,
依照深色像素的多寡判斷是否為瞳孔。圖 3-11 為檢查內部點的示意圖,橢圓中
的綠點為需要檢查的點,透過檢查橢圓中心、最短軸上的兩點和最長軸上的兩點 共五點為淺色或深色像素來判斷是否為瞳孔,考慮到紅外光點可能會在瞳孔內,
因此若橢圓內五點中有超過兩點為淺色像素就將此橢圓排除。
圖 3-11 橢圓內部圖
除了使用上述的方法求得瞳孔中心外,若是因為環境光線或是攝影機照射角 度問題無法順利取得瞳孔中心,使用者可以選擇使用手動的方式求得瞳孔中心,
藉由手動調整閥值、區塊的最大最小值和手動選取興趣區塊,系統會依照這些參 數和條件使用區塊標籤來找到符合條件區塊的重心作為瞳孔中心,其中區塊標籤 的演算法會於 3.3.2 節介紹。