在影像處理的第一個需要做的任務很有可能就是 Image Segmation,
把我們所感興趣的部份從背景分割出來。
然而 Image Segamation 也是機器視覺領域中相對較難的問題。
In practical situations,There is clearly a tension between simple cost-efficive solution and general-purpose but more computationally expensive solution.
如上引言所述,一個真正擁有高CP值的Thresholding 方法便顯得相當重要。
Concept behind thresholding
Threshold 其意義其實只有選擇一個特定的數值 (X) 作為標準,大於X設為1小於X設為0,因此如何挑選合適的閾值才是箇中關鍵。
有一種方法是去檢視影像的直方圖(histogram),查看是否有一個清晰的位置來分開背景(Background:不感興趣的部份)以及物體(Object:我們所感興趣的部份)。
但不是每種圖片都能夠有這麼理想的狀況發生。
簡單整理一些常見的Thresholding Method :
Basic Global Thresholding
又稱為 ISODATA (Iterative Self-Organizing Data Analysis Technique A)
(p.s. 最後的"A"只是為了好發音 ..xd)
是一種 historgram-based 的Thresholding method ,滿足
threshold = (image[image <= threshold].mean() +
image[image > threshold].mean()) / 2.0
其演算流程如下:
為了更詳細的了解此演算法,我們實際操作一次並進行觀察 :
…
…
其中在scikit-image中有其 實現代碼。
Otsu's method
variance-based thresholding
算法假設圖像像素能夠根據閾值,被分成背景 [background]和目標 [objects]兩部分。然後,計算該最佳閾值 來區分這兩類像素,使得兩類像素區分度最大。
算法推導如下 :
- 假設 背景pixel佔比 有 :
- 假設 前景pixel佔比 有 :
前景piex佔比也可以由 "1-背景佔比"來計算出
- 背景平均pixel 值
ω0=N0/ M×N (1) ω1=N1/ M×N (2) N0+N1=M×N (3) ω0+ω1=1 (4) μ=ω0*μ0+ω1*μ1 (5) g=ω0(μ0-μ)^2+ω1(μ1-μ)^2 (6) 將式(5)代入式(6),得到等價公式:
g=ω0ω1(μ0-μ1)^2 (7)
Another strategy using gradient
另一個好的策略是找到圖像中強度梯度(gradient)明顯的位置對應於邊緣區域中的像素-並且分析這些位置的強度值而忽略圖像中的其他點。
散點圖:將像素屬性繪製在二維地圖上,其中一個軸的強度變化,而另一個軸的強度梯度大小變化。