[Halcon&图像] 图像阈值分割算法汇总

       图像二值化的目的概括来说就是将感兴趣区域与背景分离出来,从而便于图像的进一步处理。除了常规阈值分割算子threshold,下面介绍一些halcon中另一些常用的图像阈值分割算子:

  1. dyn_threshold— 使用动态阈值分割(一般在缺陷检测的时候使用)

     描述 :当前背景之间差异明显时,可以设定全局阈值进行threshold,但很多情况下由于背景不均一,目标体经常表现为比背景局部亮一些或暗一些,无法通过标准阈值进行分割操作,这时需要通过其邻域找到一个合适的阈值进行分割,

     如图:由于图像的灰度值变化不均一,没法通过固定阈值(蓝色线)提取到我们想要的山顶部分(感兴趣区域),因为阈值设的高会遗漏我们想要的阈值低的区域;阈值设的低又得到太多的干扰区域。这时候可以考虑使用动态阈值分割对其进行提取。

在这里插入图片描述
     函数:dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )

     参数
     OrigImage(in)需要进行阈值分割的原始图像
     ThresholdImage (in)在实际使用过程中通常都是对原图像OrigImage进行一次平滑处理(mean_image/gauss_image/binomial_filter等),然后用平滑处理之后得到的图像作为参考图像
     RegionDynThresh(out)对原图进行阈值分割后输出图像
     Offset(in)是一个阈值调节值,设定邻域比较的区间范围,灰度值变化在offset范围内均是可以接受的。
     LightDark(in)dark’, ‘light’, ‘equal’, ‘not_equal’一共有4种选择,这是原图相对于ThresholdImage 而言的,如果‘light’,则提取原图相对于参考图中亮一些的部分,提取的范围由Offset参数确定。

在这里插入图片描述

     处理步骤一般使用动态阈值分割时,先将图像做一下均值滤波,然后将原图(灰度值黑色线)与均值滤波后的图像(灰度值绿色线)作差,最后在对面积进行一下筛选,这样就可以得到我们想要的红色区域部分了。

但是,均值滤波图像时,选择的参数也需要根据图像的灰度值变化程度来看,就上面图像来看,如果均值滤波图像时参数过小,可能滤波之后的图像灰度值变化会变成下面的情况(黄色),导致提取山顶部分的效果也不会太好。

在这里插入图片描述
代码:一般动态阈值分割的一个思路

read_image (Image1, 'C:/Users/Administrator/Desktop/半导体硬件测试/图像/AOI工位/划痕 单同轴 增益5 曝光2300.png')
*******提取感兴趣区域部分图像*******
gauss_filter (Image1, ImageGauss, 5)
threshold (ImageGauss, Regions, 92, 255)
fill_up (Regions, RegionFillUp)
opening_circle (RegionFillUp, RegionOpening, 3.5)
connection (RegionFillUp, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1.60866e+006, 5e+006)
reduce_domain (Image1, SelectedRegions, ImageReduced)
*******对图像进行动态阈值分割*******
mean_image (ImageReduced, ImageMean, 200, 200)
dyn_threshold (Image1, ImageMean, RegionDynThresh, 60, 'light')

注:dyn_threshold 可以看成sub_image (均值滤波图像与增强图像进行作差)+threshold (*固定阈值分割,得到缺陷区域)

  1. var_threshold— 均值和标准偏差局部阈值分割

     :var threshold (Image, Region, 4, 4, 0.2, 12, ‘dark’ )

     描述 :在该程序中,先用4x4的掩膜在图像上逐像素游走,用原图中的当前像素和对应掩膜中16个像素的灰度均值对比,找出暗(dark)的区域。当原图像素灰度比对应的掩膜灰度均值低(0.2,12)个灰阶时(本程序中StdDevScale = 0.2, AbsThreshold = 12),该区域被分割出来。

     函数:var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )

     参数
     Image (in)原始图像
     Region (out)被分割的区域
     MaskWidth(in)计算平均值的偏差的淹膜高度
     MaskHeight(in)计算平均值的偏差的淹膜宽度
     StdDevScale(in)标准差因子,一般推荐使用该算子时,StdDevScale取正值,可以在黑白过渡处能减少分割出不需要的区域的概率。(因为黑白过渡处标准差大,当然前提是StdDevScale 不能设置得太小)
     AbsThreshold(in)绝对阈值,
     LightDark (in)阈值类型,一般又’light’、’dark’、’equal’、’not_equal’

     注: dyn_threshold是将原图和滤波平滑后的图对比, var_threshold是将原图和对应像素掩膜覆盖的像素的平均,灰度值对比,在算子var_threshold中,如果参数StdDevScale=0,那么就可以用动态阈值的方式非常近似地模拟,以上两种算法的效果,极为类似。不同的是var_threshold集成度更高,并且加入了“标准差×标准差因子”这一变量。可以有效地减少噪声对分割的影响

  1. binary_threshold— 自动全局阈值分割

     描述 :主要对灰度直方图存在两个波峰图像的自动阈值分割。例如,在同质照明的背景下对字符的分割很有用。binary_threshold还会返回UsedThreshold中使用的阈值

     函数:binary_threshold(Image : Region : Method, LightDark : UsedThreshold)
     参数
     Image (in)需要进行阈值分割的原始图像
     Region (out)被分割的区域
     Method(in)分割方法,“max_separability”和“smooth_histo”

     最大限度的可分性(max_separability):
     根据“灰度直方图的阈值选择方法”的灰度直方图自动阈值调用。该算法首先计算图像的直方图,然后利用统计矩找到将像素分割为前景和背景的最优阈值,并最大化这两个类之间的可分性。此方法仅适用于byte和uint2图像
     直方图平滑(smooth_histo):
     binary_threshold可以通过以下方式确定阈值:首先确定灰度值的相对直方图。然后,从直方图提取相关的最小值,作为阈值操作的参数。为了减少最小值,直方图被平滑处理为一个高斯函数,就像在auto_threshold中一样。在平滑直方图中,掩模尺寸增大,直到最小值。然后,阈值设置为这个最小值的位置。

     LightDark(in)选取暗边界还是亮边界及相似边界,dark’, ‘light’, ‘equal’, ‘not_equal’一共有4种选择
     UsedThreshold(in)使用的阈值大小

注:
     当LightDark=light,max_separability选的区域比smooth_histo少一点
     当LightDark=dark,max_separability选的区域比smooth_histo多一点

  1. fast_threshold — 快速全局阈值分割

     描述 :选择灰度值满足MinGray<=g<=MaxGra条件的像素,为了节省时间按两步执行。第一,先处理行列间隔Minsize的所有像素点。第二,处理上一步选择点的领域。和threshold相比分割速度快。

     函数:fast_threshold(Image : Region : MinGray, MaxGray, MinSize : )

     参数
     Image (in)原始图像
     Region (out)被分割的区域
     MinGray(in)最小灰度值
     MaxGray(in)最大灰度值
     MinSize (in)要提取对象的最小尺寸

  1. auto_threshold — 自动全局阈值分割

     描述 :根据直方图确定阈值自动全局阈值分割,运行原理,第一,计算灰度直方图。第二,高斯平滑后从直方图提取最小值。第三,根据提取的最小值进行阈值分割。

     函数:auto_threshold(Image : Regions : Sigma : )

     参数
     Image (in)原始图像
     Region (out)被分割的区域
     Sigma (in)平滑系数,sigma越大提取区域越少。

  1. watersheds — 分水岭算法分割
    watersheds(Image : Basins, Watersheds : : )
    ——从一幅图像中提取分界线和盆地(Basins:盆地,Watersheds:分界线)
    watersheds_threshold(Image : Basins : Threshold : )
    ——利用阈值从图像中提取盆地Basins(比阈值小的分水岭隔开的盆地被融合在一起),通常对其中的一块区域进行处理

     描述
     1)通过分水岭算法watersheds()获取图像的盆地。
     2)根据第一步分水岭算法分离结果,若盆地部分的灰度< Threshold ,则被合并到一起。设B1和B2分别为相邻盆地的最小灰度值,W为将盆地分割为两个盆地的最小灰度值。则分割结果为:
                                                                            max{W-B1,W-B2}<Threshold
     函数:watersheds(Image : Basins, Watersheds : : )
                watersheds_threshold(Image : Basins : Threshold : )

     参数
     Image (in)原始图像
     Basins (out)被分割的盆地
     Watersheds(out):盆地之间的分水岭
     Threshold (out)分水岭的门槛

     两种算法的分割效果:

     原图:
     在这里插入图片描述
     watersheds算法:
     在这里插入图片描述
     watersheds_threshold算法:
     在这里插入图片描述

  1. char_threshold — 阈值分割提取字符

     描述 :char_threshold的主要应用是在明亮的纸张上分割含有暗色字符的单通道图像。首先对HistoRegion区域内的点进行灰度直方图计算。为了消除噪声,直方图是平滑与给定的Sigma(高斯平滑)。在直方图中,背景(白纸)在高灰度值处对应一个大的峰,而字符在低灰度值处形成一个小的峰。相比之下,运算符binary_threshold(带有’Method’=‘smooth_histo’)定位最小值

     函数:char_threshold(Image,HistoRegion:Characters:Sigma,Percent:Threshold)

     参数
     Image (in)原图像,要做字符提取的图像
     HistoRegion(out)要提取字符所在的region
     Characters(in)提取到的region
     Sigma(in)高斯光滑因子
     Percent(out)灰度直方图中的灰度值差的百分比
     Threshold(in)输出用于阈值处理的阈值

     注: 此方法关键在于找到直方图中的最大值,在最大值的左侧找到读取阈值。可参考char_threshold.hdev例程

  1. dual_threshold — 双重阈值分割

     描述 :分割符号图像的阈值处理,通常和算子:diff_of_gauss sum_image等算子一起使用,就像前后两帧做差得到的图像(差帧法),像素值有正值有负值(灰度值有正负之分)

     函数:dual_threshold(Image:RegionCrossings:MinSize,MinGray,Threshold:)

     参数
     Image (in)输入的符号图像
     RegionCrossings(out)输出的区域
     MinSize(in)表示分割出来的区域的最小面积(即分割出来的面积要大于MinSize)
     MinGray(in)表示分割出来的区域对应的原图中图像像素的最高灰度大于MinGray设定值。
     Threshold(in)输出的区域灰度值的绝对值必须大于Threshold,注意这里是绝对值

     注: dual_threshold算子的缺陷:它只能分割出灰度值高的亮区域,不能分割出灰度值低的暗区域

 


有用的话戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。
  • 13
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶布布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值