1. 程式人生 > >halcon閾值分割

halcon閾值分割

關於閾值分割:全域性閾值和區域性閾值之分

1.動態閾值分割-根據區域性均值和方差
var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )
var_threshold影象灰度值在均值與方差之和以上或在均值與方差之差以下
MaskWidth、 MaskHeight是用於濾波平滑的掩膜單元;StdDevScale是標準差乘數因子(簡稱標準差因子);AbsThreshold是設定的絕對閾值;LightDark有4個值可選,’light’、’dark’、’equal’、’not_equal’。

需要強調的是var_threshold運算元和dyn_threshold運算元極為類似。不同的是var_threshold整合度更高,並且加入了“標準差×標準差因子”這一變數。

例子:
var_threshold (Image, Region, 4, 4, 0.2, 12, ‘dark’)
在該程式中,先用4×4的掩膜在影象上逐畫素遊走,用原圖中的當前畫素和對應掩膜中16個畫素的灰度均值對比,找出暗(dark)的區域。當原影象素灰度比對應的掩膜灰度均值低(0.2,12)個灰階時,該區域被分割出來。本程式中StdDevScale = 0.2, AbsThreshold = 12,問題的關鍵就是理解如何通過StdDevScale和AbsThreshold來確定用於分割的閾值。

var_threshold的幫助文件中是這麼寫的:
說明:
1、d(x,y)指的是遍歷每個畫素時,掩膜覆蓋的那些畫素塊(本例中是4×4 = 16個畫素)灰度的標準差;StdDevScale 是標準差因子。
2、當標準差因子StdDevScale ≥ 0 時,v(x,y) 取(StdDevScale ×標準差)和AbsThreshold 中較大的那個。
3、當標準差因子StdDevScale < 0 時,v(x,y) 取(StdDevScale ×標準差)和AbsThreshold 中較小的那個。實測發現,這裡的比較大小是帶符號比較,由於標準差是非負數,當StdDevScale < 0 時,(StdDevScale ×標準差)≤ 0恆成立。所以此時的取值就是(StdDevScale ×標準差)。

幫助文件中StdDevScale 的推薦值範圍是-1~1,一般通過上面的例子可知,一般的明顯的黑白過度處的標準差在50左右,乘以StdDevScale即-50 ~ 50 ,50的灰度差異,對於分割來說一般是夠了的。
文件還說:推薦的值是0.2,如果引數StdDevScale太大,可能分割不出任何東西;如果引數StdDevScale太小(例如-2),可能會把整個影象區域全部輸出,也就說達不到有效分割的目的。

其中g(x,y)指的是原始影象當前畫素的灰度值;m(x,y)指的是遍歷畫素時,掩膜覆蓋的畫素的平均灰度值(mean)。
以LightDark = ‘dark’為例,當滿足m(x,y) - g(x,y) ≥ v(x,y)時(即原始影象對應畫素灰度比掩膜畫素灰度均值低v(x,y)個灰度值以上),相應的灰度值低的暗畫素被分割出來。

通過本人的分析,我認為StdDevScale取負值意義不大,因為它會分割出大量的不需要的區域,故一般推薦使用該運算元時,StdDevScale取正值。

需要強調的是:在黑白過渡處,一般掩膜覆蓋的畫素的標準差較大,而在其他平緩的地方,標準差較小;因此最終採用的分割閾值隨著掩膜在不斷遍歷畫素的過程中,在(StdDevScale×標準差)和AbsThreshold 之間不斷切換。

var_threshold和dyn_threshold的區別和聯絡:

dyn_threshold是將原圖和濾波平滑後的圖對比,var_threshold是將原圖和對應畫素掩膜覆蓋的畫素的平均灰度值對比。
在運算元var_threshold中,如果引數StdDevScale = 0,那麼就可以用動態閾值的方式非常近似地模擬。以下兩種演算法的效果極為類似: