提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
图像预处理主要是对图像进行全局处理,而实际检测关注的往往是图像的局部区域。为了使检测范围进一步缩小,可以将感兴趣的局部区域从背景中分离出来,使关键目标更便于辨识和分析。图像分割就是完成这一任务的方法。图像分割的标准可以是像素的灰度、边界、几何形状、颜色,甚至是纹理。
图像分割的方法很多,根据不同的检测图像特征可以使用不同的方法,分割的效果会直接影响视觉分析和识别的准确率。本篇文章将从阈值处理、区域提取、边缘检测3个方面对图像分割的原理和方法进行讨论。
在场景中选择物体或特征是图像测量或识别的重要基础,而阈值处理是最简单也最常用的区域选择方法,特别适用于目标和背景的灰度有明显区别的情况。下面就介绍几种常用的阈值处理方法。
阈值分割有非常多的算法,大体上分为全局和局部算法。全局算法包括全局固定阈值和基于图像直方图的阈值,局部算法包括局部动态阈值分割。基于图像直方图阈值分割的方法也有很多,比如常规的高斯滤波双峰法,OTSU大津法。
但是这类所有的法都基于一个假设:图像是有前景和背景的,待分割目标处于背景中,即图像直方图是双峰的。如果因为非均匀光照导致待分割目标不处于背景或前景中,即图像直方图无双峰,那么基于图像直方图的所有法都是不甚理想的,只能在此基础上进行一定的变换,例如nbl算法等,这些都属于局部算法。
任何算法,都会基于假设空间的。没有假设空间,所有算法性能一致。包括经典算法和深度学习算法。
首先来看什么是阈值。简单来说,阈值就是一个指定的像素灰度值的范围。假设阈值为0~255灰度值,阈值处理就是将图像中的像素灰度值与该阈值进行比较,落在该范围内的像素称为前景,其余的像素称为背景。一般会用黑白两色来表示前景与背景。这样图像就变成了只有黑与白两种颜色的二值图像。
当检测对象的图像灰度与背景差异比较大时,用阈值处理可以很方便地将其与背景分离开来。根据像素与相邻像素之间的灰度值差异设置一个阈值,可以将像素与其相邻像素分隔开来。如果是在图像边缘,可以利用边缘的灰度差值进行简单的阈值处理,有助于沿边界分割图像。在Halcon中,可使用threshold 算子进行全局阈值处理。举例如下:
read_image (Image, 'data/codes' )
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, DarkArea, 0, 128)
该程序的阈值处理结果如下图所示,其中左图为输入图像,右图中的红色区域为阈值处理后提取出的较暗区域。
在上面的例子中,threshold算子的第1个参数GrayImage为输入图像,这里用的是灰度图;第2个参数DarkArea为输出的区域,类型为Region;第3个和第4个参数为阈值的区间值,表示0~128灰度范围内的像素区域。
有时手动设定阈值并不是一个严谨的方法,因为人对图像灰度的感受并不精准,即使对同一场景,当光线有微妙变化时,灰度也会有差异。手动设定阈值在粗估计时可能是一个便捷的方法,但是随着后续计算步骤的叠加,将带来不可估量的误差。在连续采集的图像中,图像的灰度也是动态变化的,环境光照、拍摄角度等因素都会影响图像的灰度。如果阈值是一个固定的值,那么在处理连续图像时结果会不够准确。因此,可以使用自适应阈值进行调节。
自适应阈值是一种基于直方图的阈值。直方图是图像像素落在0~255这个区间内的数量统计图。通过直方图可以看出图像灰度的大致分布,在有些情况下甚至可以估计检测对象的面积与结构。
在Halcon中使用auto_threshold算子进行自适应阈值处理。该算子可以对单通道图像进行多重阈值处理,其原理是,以灰度直方图中出现的谷底为分割点,对灰度直方图的波峰进行分割。因此,有多少个波峰,就会分割出多少个区域。auto_threshold算子的第3个参数Sigma(此例中为8.0)是一个平滑算子,可以对直方图进行平滑处理。举例如下:
read_image(Image,'data/shapes)
rgb1_to_gray (Image, GrayImage)
auto threshold(GrayImage,Regions,8.0)
该程序的阈值处理结果如下图所示,其中左图为灰度图像,包括几种不同灰度的对象,右图用3种不同的颜色区分了自动阈值分割出的3个区域。其中圆形与矩形物体因为灰度值相近被分割为同一区域;三角形的灰度值与另外两种有差异,被分割为单独的区域;背景灰度值最大,也被分割为一个单独的区域。
我们来看一下auto_threshold算子的工作原理。单步运行rgb1_to_gray (Image, GrayImage),打开灰度直方图,下图就是没有平滑过的绝对灰度直方图。“平滑”项后面红色方框中的数值对应auto_threshold算子的第3个参数Sigma。将“操作”项“阈值”左侧的图标点开为“√”状态,表示根据最小化和最大化参数在左侧显示窗口中输出对应Region.
下图是将Sigma值设为8.0,在灰度直方图上通过拖动上下限游标后将阈值范围设置在49-125的灰度图。可以看到,经过平滑处理后,波峰减少为3个。也观察到,auto_threshold就是以相邻波谷的灰度范围来作为分割不同Region的依据。
auto_threshold算子的前两个参数分别为输入的Image图像和输出的Region类型的区域。第3个参数Sigma为对灰度直方图进行高斯平滑的核的大小。这一块涉及到高斯卷积运算,其计算原理是,先确定图像的绝对灰度直方图,然后使用高斯滤波器对该直方图进行平滑处理。
本例中的原始灰度直方图,可以看出波峰比较多,如不处理将产生大量的分割区域,不利于提取出有意义的部分,因此这里将Sigma值设得大一些,使波峰变得平滑。经过将Sigma设为8.0对灰度直方图进行高斯平滑后的效果,可见波峰明显减少到了3个,因此图像中自动分割的区域也减少到了3部分。
因此,Sigma的值越大,平滑效果越显著,直方图波峰越少,分割出的区域也越少;反之,Sigma的值越小,直方图平滑的效果越不明显,分割的次数也越多。
注意:
1)、可以使用gray_histo 算子和gen_region_histo 算子查看Sigma参数对灰度直方图的影响。
2)、 有时为了过滤干扰因素,需要使用中值滤波算子median_image (ImageReduced, ImageMedian, ‘circle’, 5, ‘mirrored’) ,然后再进行auto_threshold。如果不进行过滤的话,可能会返回很多个干扰区域。
总结:利用直方图确定的阈值分割图像,通过多阈值分割单通道图像,会返回多个区域;首先输入图像的绝对直方图的灰度值是确定的,然后高斯平滑(Sigma)后从直方图中提取相关的最小值,Sigma越大,提取的区域就越小。
除了auto_threshold算子外,还常用binary_threshold 算子对直方图波峰图像进行自动阈值分割。binary_threshold算子同样利用了直方图,但不同的是,该算子是根据直方图中的像素分布提供可选的分割方法,如使用最大类间方差法(OTSU算法或大津法)或平滑直方图法(高斯滤波双峰法),都可以自动计算出一个灰度级别用于分割区域。
同时,该算子也可以选择提取较亮还是较暗的范围,尤其适用于在比较亮的背景图像上提取比较暗的字符。举例如下:
read image (Image, 'data/codes')
rgb1_to_gray (Image, GrayImage)
binary_threshold (GrayImage, RegionMaxSeparabilityLight, 'max_separability','dark', UsedThreshold)
该程序运行效果如下图所示,其中左图为灰度图像,右图为使用 binary_threshold算子进行阈值分割后的图像。
binary_threshold算子的前两个参数分别为输入和输出的对象。第3个参数为分割的方法,这个例子中选择max_separability,表示在直方图中对最大的可分性进行分割;也可以选择smooth_histo,表示平滑直方图,平滑的原理与auto_threshold算子类似。第4个参数表示提取前景还是背景,这里选择dark,表示提取较暗的部分;也可以选择light,表示提取较亮的部分。最后一个参数UsedThreshold为返回结果,将返回所用的阈值。
目前,操作符提供了以下两种方法:“max_separability”和“smooth_histo”。这两种方法都只能用于具有双峰直方图的图像。
通过选择Method= ’ max_separability ',根据“灰度直方图的阈值选择方法”的灰度直方图自动阈值调用。该算法首先计算图像的直方图,然后利用统计矩找到将像素分割为前景和背景的最优阈值,并最大化这两个类之间的可分性。此方法仅适用于byte和uint2图像。方法“max_separability”倾向于为UsedThreshold确定较小的值。此外,它对柱状图中的稀疏孤立峰不太敏感,而且往往比“平滑”要快得多。
方法“smooth _histo”提供了由操作员bin_threshold提供的相同功能。直方图平滑(smooth_histo):通过选择Method = 'smooth_histo ’ ,binary_threshold可以通过以下方式确定阈值:首先确定灰度值的相对直方图。然后,从直方图提取相关的最小值,作为阈值操作的参数。为了减少最小值,直方图被平滑处理为一个高斯函数,就像在auto_threshold中一样。在平滑直方图中,掩模尺寸增大,直到最小值。然后,阈值设置为这个最小值的位置。另外一种解释:该方法是使用高斯滤波器对图像的相对灰度直方图进行滤波,逐步加大滤波器的模板大小,直到滤波后的相对灰度直方图的极小值个数只有一个,该极小值所对应的灰度值就是用于分割图像的阈值。
OTSU算法扩展:
OTSU算法也称最大类间方差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
对于上面左边的灰度图片,我们想让这些物体(前景)和背景区分更明显一些,比如让物体为纯黑,背景全白。那么我们就需要找到一个合适的阈值,使图片上灰度值大于这个阈值的像素点为255(白色),灰度值小于阈值的像素点为0(黑色)。也就是变成上面右边的图片。
怎样确定这个阈值呢?OTSU算法说,我们可以求出用这个阈值分割后的两个图像对应pixel的类间方差。对于每一个可能的阈值,我们计算并取出类间方差最大的那个像素pixel值,此时这个值就可以较好的对图像进行分割。
算法流程:
1、将灰度值区间为[0,m],对于[0,m]间的每一个灰度t,将它作为阈值将图像分割为灰度为[0,t]以及[t+1,m]两部分;
2、计算每一部分的所占比例ω0、ω1,每一部分的平均灰度值μ0、μ1,以及总的平均灰度值μ;
3、计算他们的类间方差:δ2=ω0(μ0-μ)2+ω1(μ1-μ)2=ω0ω1(μ0-μ1)2
4、取出类间方差最大时对应的阈值t,这就可以作为我们最终所取的阈值。
大津法的形象理解:对于直方图有两个峰值的图像,大津法求得的T近似等于两个峰值之间的低谷。这个是全局二值化处理做阈值分割的算子。使用Threshold找到两个波峰之间的最小值,分割出来的是非黑即白。
上面介绍了三种全局阈值分割方法,这里介绍一个基于局部阈值分割的dyn_threshold算子。它适用于一些无法用单一灰度进行分割的情况,如背景灰度比较复杂,有的部分比前景目标亮,有的部分比前景目标暗;又如前景目标包含多种灰度,因而无法用全局阈值完成分割。该算子利用邻域,通过局部灰度对比,找到一个合适的阈值进行分割。
dyn_threshold 算子的应用步骤一般分三步:首先,读取原始图像;然后,使用平滑滤波器对原始图像进行适当平滑;最后,使用dyn_threshold算子比较原始图像与均值处理后的图像局部像素差异,将差异大于设定值的点提取出来。
举一个例子,如下图所示,该图中前景部分的字符颜色不均匀,无法用单一的灰度阈值进行提取,因此可以使用局部阈值分割方法进行提取。代码举例如下:
read_image (Image, 'data/text')
*将图像转换为灰度图
rgb1_to_gray (Image, GrayImage)
*由于图像对比度比较低,因此对图像进行相乘,增强对比度
mult_image (GrayImage, GrayImage, ImageResult, 0.005, 0)
*使用平滑滤波器对原始图像进行适当平滑
mean_image (ImageResult, ImageMean, 50,50)
*动态阈值分割,提取字符区域
dyn_threshold (ImageResult, ImageMean, RegionDynThresh, 4, 'not_equal')
*开运算,去除无意义的小的杂点
opening_circle (RegionDynThresh, Regionopening,1.5)
*显示结果
dev_clear_window()
dev_display(RegionOpening)
该段代码运行效果如下图所示,其中左图为灰度图像,图像中的字符部分颜色不均;右图为用dyn_threshold算子进行阈值分割后的图像。
再举一个使用动态阈值进行轮廓提取的例子。如下图所示,该图的前景与背景部分灰度都不均匀,因而无法用全局阈值进行提取,这时可以用dyn_threshold算子提取前景的轮廓。代码如下:
read image (Image, 'data/garlic')
*将图像转换为灰度图
rgb1_to_gray (Image, GrayImage)
*使用平滑滤波器对原始图像进行适当平滑
mean_image (GrayImage, ImageMean, 30,30)
*动态阈值分割,提取字符区域
dyn_threshold (GrayImage, ImageMean, RegionDynThresh, 30, 'not_equal')
*腐蚀操作,去除杂点
erosion_circle (RegionDynThresh, RegionClosing,1.5)
该段代码运行效果如下图所示,其中左图为灰度图像,前景目标灰度复杂,背景因为光照不均匀,局部甚至比前景目标更亮;右图为使用dyn_threshold 算子进行阈值分割后的图像。
dyn_threshold算子的第1个参数为输入的灰度图像。第2个参数为输入的预处理图像,这里使用mean_Image得到了一张均值图像,用于做局部灰度对比。通常,预处理图像是原始图像的平滑版本,可以利用 mean_image, binomial_filter, gauss_filter等来创建阈值图片。使用 mean_image算子时,MaskSize尺寸越大,发现的区域就越大,一般,MaskSize的大小应该是被提取对象直径的两倍。第3个参数为输出的阈值区域。第4个参数是offset值,是将原图与均值图像作对比后设定的值,灰度差异大于该值的将被提取出来。注意:offset不应该设置成0,如果设置成0会有很多干扰会被一起提取出来,建议值应该是5到40,offset越大,被提取的区域就会越小,超过60可能就发现不了任何点了,整个函数的返回就是一个空区域。第5个参数决定了提取的是哪部分区域,一般有如下4个选择。
1)、light:表示原图中大于等于预处理图像像素点值加上 offset 值的像素被选中,即g0≥gt+offset;
2)、dark:表示原图中小于等于预处理图像像素点值减去offset值的像素被选中,即g0≤gt-offset;
3)、equal:表示原图中像素点大于预处理图像像素点值减去offset值,小于预处理图像像素点值加上 offset 值的点被选中,即gt-offset≤g0≤gt+offset;
4)、not_equal:表示与equal相反,它的提取范围在equal范围以外,即gt-offset>g0 v g0>gt+offset。可以理解为是light+dark。
上面选择中的g0是原始图片,gt是阈值图片。该算子适用于在复杂背景下提取前景目标的轮廓,或无法用单一灰度阈值提取边缘等情况。
注意:实际应用中可以根据图像的灰度值,设置均值滤波器的系数和动态阂值的参数。
除了dyn_threshold算子可以利用局部像素灰度差进行分割外,var_threshold算子也是一种基于局部动态阈值的分割方法。该方法分割的依据是局部的均值和标准差,选择图像中邻域像素满足阈值条件的区域进行分割。该阈值不是一个固定的值,而是在点(x,y)的邻域中使用矩形mask进行扫描,分别用点(x,y)的灰度与均值图像中的点(x,y)的灰度,和矩形的中心点的标准差灰度进行比较。该矩形mask的长宽需要是奇数,这样便于找到矩形的中心点,其具体的宽和高应该略大于待分割的图像区域。举例如下:
read_image (Image,'data/holes')
rgb1_to_gray (Image, GrayImage)
*设置矩形,选择感兴趣区域
gen_rectanglel (Rectangle, 170, 80, 370, 510)
reduce_domain (GrayImage, Rectangle, ImageReduced)
var_threshold (ImageReduced, Region, 15, 15, 0.2, 35, 'dark')
该程序的运行效果如下图所示,其中左图为输入图像,右图为使用var_threshold算子进行阈值分割后的图像,灰度变化符合阈值的区域被提取了出来。
该算子的第1个参数为输入的灰度图像;第2个参数为输出的阈值区域;第3个和第4个参数为用于扫描邻域的矩形mask的宽和高;第5个参数为标准差因子,用于计算灰度标准差,默认为0.2;第6个参数为设定的绝对阈值,该值用于比较矩形区域内的灰度标准差与均值图像的最小灰度值;第7个参数决定了提取的是哪部分区域,一般有4个选择,即dark、light、equal、notequal,具体解释与dyn_threshold算子相同。
该算子一般用来提取字符,适用于在明亮的背景上提取黑暗的字符。该算子的运算过程如下:首先计算一个灰度曲线;然后给定一个Sigma值,用于平滑这个曲线;最后将前景与背景区分开来。
分割的阈值取决于直方图中的最大值。例如,如果选择百分比为95%,灰度阈值将锁定在距离直方图峰值的5%左右的区域,因为这个算子假定的是字符的灰度都暗于背景。举例如下:
read_image (Char, 'data/char')
rgb1_to_gray (Char, GrayImage)
char_threshold (GrayImage, GrayImage, Characters, 6, 95, Threshold)
该程序的运行效果如下图所示,其中左图为灰度图像,右图为使用char_threshold算子进行阈值分割后的图。
与 binary_threshold 算子相比,char_threshold算子适用于直方图的波峰之间没有明确的谷底的情况,或者是直方图没有明确的峰值的情况。这种情况是可能出现的,如图像中只包含几个字符,或者是存在不规则光照。
dyn_threshold和var_threshold属于局部阈值处理算子。相较于全局阈值算子,这里的“局部”如何理解?在threshold、auto_threshold和binary_threshhold算子中,确定好对应的threshold(阈值)后,就可以对图片进行整体分割,所以全局是针对整张图片而言的。而dyn_threshold和var_threshold计算出来的threshold(阈值),只适用于所分割的局部区域,每个threshold(阈值)只在对应某一片区域有效、进行分割。
对于如何理解这些阈值处理算子,学者需要在实践中不断体会。此外,看Halcon帮助文档和示例程序有助于帮助我们快速理解这些算子。
使用dyn_threshold算子时,一般要用mean_image算子对图像进行预处理。经过mean_image算子预处理的图像,一般来说具有如下特点:明暗相接的区域处,原来高灰度值的像素其灰度会变小;原来低灰度值的像素其灰度会变大。其他灰度均匀的地方,像素灰度值则变化不明显。因为这种特点,所以dyn_threshold特别适用于在复杂背景下提取目标轮廓。
首先调用mean_image对图像进行均值滤波,下图显示了使用不同卷积核尺寸的滤波效果。可以看到卷积核尺寸越大,图片越模糊。且卷积核尺寸一般要设为奇数,因为奇数可以保证中心像素处于滤波器正中间。
接着将上面掩膜尺寸30×30的预处理图片作为dyn_threshold的预处理图片,根据“LightDark”不同选项产生的效果图。可以看出:
1)、选择“light”区域时,提取的是轮廓内侧,因为在原图中,轮廓内侧区域像素的灰度值肯定大于预处理后的相同区域像素灰度,因为亮度大(灰度大),被滤波后受轮廓外侧亮度低区域的影响,灰度变小(可以理解为被均摊);
2)、选择“dark”区域时,提取的是轮廓外侧,因为在原图中,轮廓外侧区域像素的灰度值肯定小于预处理后的相同区域像素灰度,因为区域较暗(灰度小),被滤波后受轮廓内侧亮度高区域的影响,灰度变大(可以理解为被均摊)。从图上也可以明显看出,提取的就是轮廓的外侧;
3)、选择“equal”区域时,提取的灰度均匀的区域。因为灰度均匀的区域,被滤波后,区域内像素灰度变化不大。从下图可以看到,“equal"提取出来的就是原图中明暗分布均匀的区域;
4)、选择“not_equal”区域时,提取的"light”+"dark"区域。从下图可以看到,最后得到的轮廓=轮廓内侧+轮廓外侧(图中黄色圈标记出来是为了细致观察和确认,是否为包含关系)。
这里通过Halcon官方的帮助文档,对var_threshold算子进行深入理解。首先,看下该算子的调用格式:
var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )
上面的StdDevScale为标准差因子,用于计算灰度标准差,默认为0.2,官方建议的值为 -0.2、-0.1、 0.1、 0.2。AbsThreshold为绝对阈值,该值用于比较矩形区域(MaskWidth×MaskHeight)内的灰度标准差与均值图像的最小灰度值,官方建议值为-2、-1、0、1、2。
官方对此算子的描述:
1)、适用于局部标准差高(正的StdDevScale)、局部标准差低(负的StdDevScale)的图片;
2)、适用于局部明亮或黑暗的图片;
综上,可以用此算子在有噪声、光照不均匀的图片上分割出区域。
过滤掩膜尺寸(MaskWidth×MaskHeight)决定了被分割对象的最大尺寸,如果尺寸太大,需要提取的区域可能会因为靠得太近而合并,如下图所示。如果MaskWidth或MaskHeight被设置为偶数,实际运算时采用的是这个偶数后面的奇数。
局部标准差用来衡量图像中的噪声,可以通过标准差因子StdDevScale去反应需要的灵敏度。很大的StdDevScale值,意味着只有那些与其周围像素灰度值相差很大的像素才会被选中。StdDevScale合理的设置范围为-1.0~1.0,0.2是官方建议值,如果该值设置得太大或太小,可能会导致选出空区域或整个区域。
在图像中灰度均匀的区域,标准偏差会较小。因此,单灰度值的影响就高。为了减小在灰度均匀区域的灵敏度,可以适应AbsThreshold。这样,在灰度均匀区域内灰度值变化小的像素可以被忽略。注意,StdDevScale如果为负数,AbsThreshold也应该用负值。
我们看一下官方实例,定义:
g(x,y) 为原图中(x,y)位置像素的灰度值,m(x,y) 为对应像素的平均灰度值,d(x,y)为在掩膜内该像素的灰度标准偏差。
最终,可变threshold v(x,y) 通过如下公式计算:
若StdDevScale≥0:v(x,y)=max(StdDevScaled(x,y),AbsThreshold)
若StdDevScale<0:v(x,y)=min(StdDevScaled(x,y),AbsThreshold)
这里解释一下v(x,y)的取值原则,对于StdDevScale≥0的情况,具体是用被StdDevScale标准差因子比例化的标准偏差,还是用AbsThreshold,取决于谁大,谁大就用谁。而StdDevScale<0时,则看谁的值小,值小的会作为v(x,y).
下图展示的是v(x,y)取值与ScaledStdDev和AbsThreshold之间的关系。
需要强调的是:在黑白过渡处,一般掩膜覆盖的像素的标准差较大,而在其他平缓的地方,标准差较小;因此最终采用的分割值随着掩膜在不断遍历像素的过程中,在(StdDevScalex标准差)和AbsThreshold之间不断切换,从上图我们也可以看出这一规律。
var_threshold算子和dyn_threshold算子极为类似,不同的是var threshold集成度更高,并且加入了"标准差x标准差因子"这一变量。dyn_threshold是将原图和滤波平滑后的图对比, var_threshold是将原图和对应像素掩膜覆盖的像素的平均灰度值对比,在算子var_threshold中,如果参数StdDevScale=0,那么就可以用动态阈值的方式非常近似地模拟,以上两种算法的效果,极为类似。
对于提取目标的灰度与背景灰度区分明显的,可以直接用threshold。threshold分割图片的阈值是人为指定的。而binary_threshold 的阈值是自己产生的,不是人为设置的,是典型的二值化处理,分割出来的图片呈“两极化”,可以理解为非黑即白。而auto_threshold是通过多个阈值去分割单通道图片,并返回多个区域。
个人心得:学会使用直方图工具,用直方图工具来分析图片
1、使用最多的基本就是threshold、dyn_threshold、binary_threshold和var_threshold;
2、正常干扰不多的情况下直接用threshold即可;
3、复杂情况根据具体需要选择dyn_threshold、binary_threshold、var_threshold。
1、Halcon算子threshold、dyn_threshold、binary_threshold、auto_threshold、fast_threshold、var_threshold;
2、阈值分割的OTSU算法;
3、勇哥的实验:halcon阈值分割算子细谈(三)binary threshold,bin_threshold
4、Halcon机器视觉算法原理与编程实战/杨青编著.北京大学出版社