Halcon OSTU算法
2021/12/17 17:20:06
本文主要是介绍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 自动阈值分割后的图像
(2)使用 binary_threshold 自动阈值分割后的图像
从图像上看结果与 Halcon 中算子的实现效果一样,看一下输出的自动计算出的阈值:
这篇关于Halcon OSTU算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享