手把手HALCON代码解析OTSU算法
gen_image_const (Image, 'byte', 50, 10)
get_image_size (Image, Width, Height)
for i := 0 to Height - 1 by 1
for j := 0 to Width - 1 by 1
set_grayval (Image, i, j, rand(1)*255)
endfor
endfor
moments_gray_plane (Image, Image, MRow, MCol, Alpha, Beta, Mean)
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)
* 计算零阶累积矩(累加直方图)和一阶累积矩
zeroMoment := []
oneMoment := []
for k := 0 to 255 by 1
if(k == 0)
zeroMoment := [zeroMoment,RelativeHisto[k]]
oneMoment := [oneMoment, k*RelativeHisto[k]]
else
zeroMoment := [zeroMoment,zeroMoment[k-1]+RelativeHisto[k]]
oneMoment := [oneMoment, oneMoment[k-1]+k*RelativeHisto[k]]
endif
endfor
* 总平均值
all_mean := oneMoment[255]
* 计算类间方差
variance := []
for x := 0 to 254 by 1
if(zeroMoment[x] == 0 or zeroMoment[x] == 1)
variance := [variance,0]
else
cofficient := zeroMoment[x] * (1-zeroMoment[x])
temp := pow(zeroMoment[x] * all_mean - oneMoment[x], 2)
variance := [variance,temp / cofficient]
endif
endfor
tuple_find (variance, max(variance), Indices)
stop ()
dev_set_color ('red')
threshold (Image, Region, max(Indices), 255)
dev_set_color ('green')
binary_threshold (Image, Region1, 'max_separability', 'light', UsedThreshold)
原图:
手写OTSU代码后的阈值图片效果:
使用HALCON自带最大类间方差阈值图片效果:
参考书籍《OpenCV算法精解:基于Python与C》