“BG” 找到同時符合判斷式(3.5) 與 (3.6) 的 codeword, xij是背景。
“FL” 只有找到符合判斷式(3.5) 的 codeword, xij為前景。
“FC” Otherwise, xij為前景。
(3.7)
此演算法切割出來的背景, 由於影子與亮光的影響, 所以不夠精確。 下節將介紹如何改進背景切 割的正確性。
3.2 背景修正演算法
當一張畫面有陰影投射在背景上時, 會有一些背景像素的亮度與平均值差不多, 有些卻低於平均值很 多。 因此背景模型若要能正確將陰影部分辨識為背景, 必須要將較暗的背景色彩也納入模型中。 但如 此會造成深色前景被誤判為背景的機率 (前景錯誤率) 增加, 這也是背景模型在處理陰影所面對的難 題。 事實上, 此問題的根源是因為背景模型只描述了每個像素的色彩分佈, 這些資訊並不足以分辨陰
b
c
(a)
(b)
(c)
圖 3.3: 邊緣放大圖。(a) 同時有前景與影子的影像; (b) 影子的邊緣; (c) 前景 (人的衣服) 的邊緣。
影與深色背景, 若要正確辨識陰影並同時減少前景錯誤率, 引入其他的資訊是必要的。 本修正演算法 使用了 region-level 的資訊解決上述的問題。
3.2.1 原理
如圖 3.3所示, 一個前景物體的邊緣處會有明顯的色彩變化 (圖3.3c), 而影子會有一些邊緣色彩變化 非常緩慢 (圖 3.3b)。 欲對 codebook model 輸出的前景作修正, 可以從前景邊緣往內逐步檢查, 我 們將正在檢查的像素稱為”生長點”; 在一個以生長點為中心的固定範圍中, 與生長點色彩相近的像 素稱為”參考點”。 若此時生長點是在真正的前景邊緣, 由於背景色彩與前景有差異, 參考點中只會有 前景的像素; 相對來說, 若此時生長點在影子的邊緣, 參考點會含有比較多的背景像素。
3.2.2 修正演算法
首先假設 xij 為原影像在座標 (i, j) 的像素值, codebook model 的分割結果為 Cij (定義請見公 式 (3.7))。 則我們定義 8-neighbors 為與 xij 相鄰的八個像素:
N8(xij) = {xpq|(p, q) 6= (i, j) and |p − i| ≤ 1 and |q − j| ≤ 1}
參考視窗是以 xij 為中心, (2rs+ 1) × (2rs+ 1) 的方形區域:
W (i, j) = {xpq|(p, q) 6= (i, j) and |p − i| ≤ rs and |q − j| ≤ rs},
rs is spatial radius, 參考視窗的空間半徑。
(3.8)
(a)
(b)
(c)
圖 3.4: rs= 2, rr = 20 時, 參考視窗與參考點範例。 (a) 參考視窗在圖中的位置 (綠色方格); (b) 參考視窗 放大圖; (c) 參考點 (黃色部分)。
參考點為參考視窗中, 與中心點色彩相近的像素:
R(i, j) = {xpq|xpq ∈ W (i, j), kxpq− xijk < rr},
rr is range radius, 即色彩差異的允許範圍。
(3.9)
圖 3.4 為參考視窗與參考點的範例。 參考點的數量以 Size(i, j) = |R(i, j)| 表示, 參考點中屬於背 景的像素個數為
Bctr(i, j) = |{xpq|xpq ∈ R(i, j) and Cij = “BG”}|
在演算法的執行過程中, 影像的每個像素 xij 會被賦予一個狀態
State(i, j) ∈ {“未處理”, “生長點”, “潛在生長點”, “非生長點”}
四種狀態的意義如下:
1. “未處理” 演算法尚未處理過的像素。
2. “生長點” 演算法目前要處理的像素。
3. “潛在生長點” 曾經是生長點, 但還不確定是否要修正, 仍有可能在未來成為生長點。
4. “非生長點” 已經修正過或確定不需要修正的像素, 未來不會再成為生長點。
一個像素 xij 要能成為生長點, 必須符合以下條件:
Cij = “FL” (3.10)
kxijk ≥ Ie (3.11)
由於背景被影子投射或照到強光時, 只會造成亮度偏離背景範圍。 判斷式 (3.11) 是用來篩選出符 合判斷式 (3.5) (與背景色彩的色相與飽和度相近) 但不符合判斷式 (3.6)(與背景色彩的亮度差距較 大), 而被判定為前景的像素, 這類像素事實上有可能為背景。
修正演算法假設前景物體的邊緣有明顯的色彩變化。 當光源被嚴重遮蔽時, 拍攝到的影像中可能會出 現亮度很低的區域 (如圖 3.5 ), 在這樣的區域中各種物體的色彩資訊都會嚴重流失, 背景與前景的交 界不會有明顯的色彩變化, 所以使用修正演算法的前提是生長點的亮度必須大於一個預設值 (符合 判斷式 (3.11))。
圖 3.5: 光源被嚴重遮蔽的範例影像
所有生長點置於一個佇列 Q 中。 決定一個生長點 xij 要被改判為背景, 必須符合以下兩條件:
Size(i, j) > Tr, Tr is a threshold. (3.12) Bctr(i, j) ≥ κ Size(i, j) (3.13)
生長點的修正與否是由參考點決定, 所以參考點的數量必須夠多 (符合判斷式 (3.12)), 其決定才 被認為是可靠的; 使用判斷式 (3.13) 的的意義在於當參考點中屬於背景像素的比例高於一個預設值 時, 我們才認為此生長點應該修正為背景。 κ 是一個小於 1的常數。
演算法分成兩個部分, 一是初始化, 二是演算法主體, 詳細內容如下。
Initialize()
For each xij ∈ I
If Cij = “FL” and kxijk ≥ Ie
If ∃ xpq ∈ N8(xij) s.t. Cpq = “BG”
State(i, j) ← “生長點”
Q ← xij
Else
State(i, j) ← “未處理”
Else
State(i, j) ← “非生長點”
背景修正演算法
I. Initialize() II. While Q 6= ∅
1. xij ← Q 2. 檢查下列兩條件
(a) Size(i, j) > Tr
(b) Bctr(i, j) ≥ κ Size(i, j) 3. If (a)(b) 都成立
• Cij ← “BG”
• State(i, j) ← “非生長點”
• Wake Up:
For each xpq ∈ N8(xij) s.t. State(p, q) = “未處理”, State(p, q) ← “生長點”
Q ← xpq
• Update:
For each xpq ∈ R(i, j) s.t. State(p, q) = “潛在生長點”, Bctr(p, q) ← Bctr(p, q) + 1
If Bctr(p, q) ≥ κ Size(p, q) State(p, q) ← “生長點”
Q ← xpq
4. If (a) 成立,(b) 不成立, 且 ∃ xpq ∈ R(i, j) s.t. State(p, q) 6= “非生長點”
State(p, q) ← “潛在生長點”
5. Otherwise
State(p, q) ← “非生長點”
3.2.3 時間複雜度
背景修正演算法的時間複雜度計算如下。 定義 N 為影像的像素個數, Nf 為影像中前景部分的像素 個數, 初始化時每個像素只會處理一次, 每次花費時間為常數, 所以初始化的時間為 O(N) 。
只有前景像素能成為生長點, 而一個像素最多只能成為生長點兩次, 所以進入佇列 Q 的生長點 最多只有 O(2Nf) = O(N) 個。
每個生長點計算 Size(i, j) 與 Bctr(i, j)的時間為 O(r2s) , update 需要 O(rs2) , 其餘的動作 只需要 O(1) 的時間, 所以一個生長點的處理時間為 O(2rs2+ 1) = O(r2s) 。
所以全部花費的時間為 O(N + N × rs2) = O(Nr2s)