Halcon OSTU算法

Halcon 中的全局阈值分割算子 binary_threshold 中,Method = 'max_separability' 指的就是Otsu法(最大类间方差法,有时也称之为大津算法)。
Otsu 算法也叫全局最优阈值处理,使用聚类思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找一个合适的灰度级别来划分。 所以可以在二值化的时候采用otsu算法来自动选取阈值进行二值化。otsu算法被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响。因此,使类间方差最大的分割意味着错分概率最小。

设t为设定的阈值。

wo: 分开后 前景像素点数占图像的比例

uo: 分开后 前景像素点的平均灰度

w1:分开后 被景像素点数占图像的比例

u1: 分开后 被景像素点的平均灰度

u=w0*u0 + w1*u1 :图像总平均灰度


从L个灰度级遍历t,使得t为某个值的时候,前景和背景的方差最大, 则 这个 t 值便是我们要求得的阈值。

其中,方差的计算公式如下:

g=wo * (uo - u) * (uo - u) + w1 * (u1 - u) * (u1 - u)

[ 此公式计算量较大,可以采用: g = wo * w1 * (uo - u1) * (uo - u1) ]

基本的计算步骤如上面讲的那样,然后我们在Haclon中自己来实现代码:
get_image_size (srcImage, Width, Height)
* 最大方差初始化为0
otu:=[]
MaxVariance := 0.0
* 自动计算的最佳阈值
BsetThreshold := []
* 前景区域的灰度均值
Mean0 := []
* 背景区域的灰度均值
Mean1 := []
* 图像像素点总个数
PixelSum := Width * Height
tuple_real (PixelSum, PixelSum)
* 前景区域的像素点个数
Area0 := []
* 背景区域的像素点个数
Area1 := []
for ImgThreshold := 1 to 255 by 1
dev_display (srcImage)
* 区域分割
threshold (srcImage, Region, ImgThreshold, 255)
* 获得前景区域像素个数
area_center (Region, Area0, Row, Column)
* 获得前景区域均值和方差
intensity (Region, srcImage, Mean0, Deviation)
* 获得背景区域像素个数、均值和方差
difference (srcImage, Region, RegionDifference)
area_center (RegionDifference, Area1, Row1, Column1)
intensity (RegionDifference, srcImage, Mean1, Deviation1)
* 计算类间方差
Otsu := Area0/PixelSum * Area1/PixelSum * pow(Mean0-Mean1,2)
* 获取最大类间方差最佳阈值
otu:=[otu,Otsu]
if (Otsu > MaxVariance)
MaxVariance := Otsu
BestThreshold := ImgThreshold
endif
endfor
我在Halcon中对代码进行了封装,生成了一个.hdvp外部函数 threshold_Otsu(Image : Region : LightDark : UsedThreshold) ,可以直接调用使用,调用方法如下所示:

read_image (Image, 'particle')
threshold_Otsu (Image, Region1, 'Light', UsedThreshold1)
binary_threshold (Image, Region2, 'max_separability', 'light', UsedThreshold2)
看一下最终的实现效果:

 

(1)使用 threshold_Otsu 自动阈值分割后的图像

 Halcon OSTU算法

 

 

(2)使用 binary_threshold 自动阈值分割后的图像

从图像上看结果与 Halcon 中算子的实现效果一样,看一下输出的自动计算出的阈值:

 Halcon OSTU算法

 

上一篇:The Φ Accrual Failure Detector机制学习总结


下一篇:ThreadLocal笔记