引言
主要講述幾種halcon中經常用到的一些閾值分割算子。
1,全局閾值分割
- threshold(Image : Region : MinGray, MaxGray : )
全局閾值分割,適用於環境穩定,目標與背景存在明顯的灰度差的場合。(即根據高低雙閾值將圖像分為前景和背景)
利用灰度直方圖確定閾值進行圖像分割。一般是物體與背景之間存在一個明顯的灰度差,直方圖會存在兩個波峰一個是目標一個是背景,那么閾值就是物體與背景之間的最小值。
read_image (Image, 'clip') gray_histo (Image, Image, AbsoluteHisto, RelativeHisto) gen_region_histo (Region, AbsoluteHisto, 255, 255, 1) *利用直方圖獲取閾值 histo_to_thresh (AbsoluteHisto,10, MinThresh, MaxThresh) *全局閾值分割 threshold (Image, Region1, MinThresh, MaxThresh)
2,自動全局閾值分割
- binary_threshold(Image : Region : Method, LightDark : UsedThreshold)
自動全局閾值分割,主要對灰度直方圖存在兩個波峰圖像的自動閾值分割。提供兩種方法“max_separability”和“smooth_histo”。
- 最大限度的可分性(max_separability):根據“灰度直方圖的閾值選擇方法”的灰度直方圖自動閾值調用。該算法首先計算圖像的直方圖,然后利用統計矩找到將像素分割為前景和背景的最優閾值,並最大化這兩個類之間的可分性。此方法僅適用於byte和uint2圖像。
- 直方圖平滑(smooth_histo):首先確定灰度值的相對直方圖。然后,從直方圖提取相關的最小值,作為閾值操作的參數。為了減少最小值,直方圖被平滑處理為一個高斯函數,就像在auto_threshold中一樣。在平滑直方圖中,掩模尺寸增大,直到得到2個波峰的最小值。然后,閾值設置為這個最小值的位置。
read_image (Image, 'clip') binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
3,局部閾值分割
- dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
局部閾值分割,當前背景之間差異明顯時,可以設定全局閾值進行threshold,但很多情況下由於背景不均一,目標體經常表現為比背景局部亮一些或暗一些,無法確定全局閾值操作(無法通過單個高低閾值對整幅圖像分割),需要通過其鄰域找到一個合適的閾值進行分割這時就要用到局部閾值分割了。
4,均值和標准偏差局部閾值分割
- var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )
均值和標准偏差局部閾值分割,能夠較好的分開目標和背景,對不適合的參數設置不敏感。
參數列表:
MaskWidth、 MaskHeight是用於濾波平滑的掩膜尺寸;
StdDevScale是標准差乘數因子(簡稱標准差因子);
AbsThreshold是設定的絕對閾值;
LightDark有4個值可選,’light’、’dark’、’equal’、’not_equal’。
需要強調的是var_threshold算子和dyn_threshold算子極為類似。不同的是var_threshold集成度更高,並且加入了“標准差×標准差因子”這一變量。可以有效地減少噪聲對分割的影響。
5,自動全局閾值分割
- auto_threshold(Image : Regions : Sigma : )
自動全局閾值分割(根據直方圖確定閾值),運行原理:
- 計算灰度直方圖。
- 高斯平滑后從直方圖提取最小值。
- 根據提取的最小值進行閾值分割。sigma越大提取區域越少。
read_image (Image, 'fabrik') median_image (Image, Median, 'circle', 3, 'mirrored') auto_threshold (Median, Regions, 3)
6,快速全局閾值分割
- fast_threshold(Image : Region : MinGray, MaxGray, MinSize : )
快速全局閾值分割,灰度值滿足MinGray<=g<=MaxGra聚合為一個區域,為了節省時間按兩步執行。
- 先處理行列間隔Minsize的所有像素點。
- 處理上一步選擇點的領域。和threshold相比分割速度快。
7,分水嶺閾值分割
- watersheds_threshold(Image : Basins : Threshold : )
分水嶺閾值分割,可以提取分水嶺盆地。其原理:
- 通過分水嶺算法watersheds()獲取圖像的盆地。
- 根據第一步分水嶺算法分離結果,若盆地部分的灰度< threshold,則被合並到一起。
總結:
綜上所述,全局threshold分割和局部的dyn_threshold分割用的比較多。尤其是圖片光照不均勻,而dyn_threshold選對兩個分割圖,再對結果做些篩選處理,效果會很好。一般用適當尺度的均值濾波圖和原圖,還有用灰度開閉的圖來局部分割。
轉載於:說說幾個常用的閾值分割算子 - 機器長眼睛 - 博客園 (cnblogs.com)