halcon阈值分割算子

halcon有很多的阈值分割算子,有各自的适用场景。

阈值分割有非常多的算法,大体上分为全局和局部算法。全局算法包括全局固定阈值和基于图像直方图的阈值,局部算法包括局部动态阈值分割。基于图像直方图阈值分割的方法也有很多,比如常规的高斯滤波双峰法,OTSU大津法。但是这类所有的法都基于一个假设:图像是有前景和背景的,待分割目标处于背景中,即图像直方图是双峰的。如果因为非均匀光照导致待分割目标不处于背景或前景中,即图像直方图无双峰,那么基于图像直方图的所有法都是不甚理想的。

全局阈值

threshold

(Image : Region : MinGray, MaxGray : )

作用: 从输入图像中选取灰度值g满足以下条件的像素点:

如果传递了多个灰度值区间(MinGray和MaxGray的元组),则为每个区间返回一个单独的区域。该算子,根据灰度直方图确定阈值进行图像分割。

方法一:手设置阈值

  • threshold (Image, Region, 128, 255)

适用场景: 适用于环境稳定,光照变化不大,目标与背景存在明显的灰度差的场合

优缺点: 此方法局限性大,自己设置阈值,并且只适合上图这类目标与背景差别较大的图片,通用性较差,但原理比较简单,速度最快。

方法二:灰度图生成阈值

gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)
//sigma越大提取区域越少,当sigma取10的时候,MinThresh=[0, 88] MaxThresh=[87, 255]
histo_to_thresh (AbsoluteHisto, 10, MinThresh, MaxThresh) 
threshold (Image, Region, MinThresh, MaxThresh)

结果图如下:

binary_threshold

(Image : Region : Method, LightDark : UsedThreshold)

作用: 使用自动确定的全局阈值分割单通道图像

Method提供两种方法, 'max_separability’与 ‘smooth_histo’

选择Method = 'max_separability’时,调用基于Otsu(大津法,即最大类间方差)的灰度直方图的自动阈值分割。即遍历整个灰度阶,每次遍历都以当前遍历的灰度阶值作为分割阈值将整体像素分为2组,计算本次分割的组间方差,当遍历完整个灰度阶就会得到多个组间方差,选择最大的那个组间方差,该组间方差所用的灰度阶值就作为本次分割用的阈值。这个方法只适用于字节和uint2类型的图像。

选择Method = 'smooth_histo’时,首先,确定灰度值的相对直方图。然后,从直方图中提取相关的最小值,作为阈值操作的参数。为了减少最小值的数量,直方图用高斯平滑。在平滑直方图中,掩模尺寸增大,直到平滑直方图中只有一个最小值。然后,将阈值设置为该最小值的位置。

LightDark 提供两种选择,‘dark’ 与 ‘light’

dark是提取暗色区域,light提取亮色区域

在同质照明的背景下对字符的分割很有用。

auto_threshold

(Image : Regions : Sigma : )

作用: 自动全局阈值分割

1.计算灰度直方图。 2.高斯平滑后从直方图提取最小值。 3.根据提取的最小值进行阈值分割,sigma越大提取区域越少。

  • auto_threshold (Image, Region2, 10)

该算子效果看上去同threshold的第二种方法

fast_threshold

(Image : Region : MinGray, MaxGray, MinSize : )

作用: 使用全局阈值分割图像。

Image :输入图像,即待分割图像。

Region :输出区域,即分割后的区域。

MinGray :输入灰度低阈值,0~255。

MaxGray :输入灰度高阈值,0~255,需大于MinGray 。

MinSize :提取对象的最小尺寸。

函数原理:

算子通过从输入图像中提取灰度值gray满足:MinGray < gray< MAxGray条件的像素。为了减少处理时间,选择分两步进行:首先,处理所选水平线上的所有点,这些点由它们的距离MinSize指定。接着,处理所有之前选中的点的邻域(size (2MinSize+1) x (2MinSize+1))。

halcon官方提到,在支持SSE2指令集的多核计算机,threshold很可能比fast_threshold快。Fast_threshold可能只在这些特性不可用的情况下优先于threshold,例如在嵌入式平台上。

  • fast_threshold (Image, Region3, 120, 255, 10)

bin_threshold

(Image : Region : : )

作用: 使用自动确定的全局阈值分割单通道灰度值图。

这个算子,少了两个算法选项,也不能决定选择黑或者白。

因此被halcon建议作废。

dual_threshold

(Image : RegionCrossings : MinSize, MinGray, Threshold : )

作用:使用双重阈值对带符号图像的阈值分割。

Image :输入图像,即待分割图像。

RegionCrossings :输出区域,即分割后的区域。

MinSize:输入,小于MinSize的区域被抑制。

MinGray:输入,对绝对灰度值小于MinGray的区域进行抑制。

Threshold :输入,灰度值小于Threshold(或大于-Threshold)的区域将被抑制。

原理:将输入图像分割成灰度值>Threshold 的区域Threshold(“正”区域)和灰度值<Threshold 的区域“负”区域)。只有大小大于MinSize的“正”或“负”区域才会被保留,灰度值在MinGray和-MinGray之间的区域会被抑制。

dual_threshold通常在对图像应用拉普拉斯算子(Laplace, laplace_of_gauss, derivatives _gauss或diff_of_gauss)或两个图像的差值(sub_image)之后调用。

这个算子没用过

局部阈值

var_threshold

(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )

作用: 均值和标准偏差局部阈值分割,能够较好的分开目标和背景,对不适合的参数设置不敏感。

MaskWidth(input):用于平均值和偏差计算的掩模宽度。

MaskHeight(input):用于平均值和偏差计算的掩模高度。

StdDevScale(input):标准差乘数因子(简称标准差因子)。

AbsThreshold(input):最小灰度值与平均值的差值。

LightDark(input) : 提供四种类型选择,‘dark’, ‘equal’, ‘light’, ‘not_equal’。'light’或’dark’分别返回比周围环境更亮或更暗的所有像素。'equal’返回未被任何选项选中的所有像素,即与其周围相对相等的像素。'not_equal’返回’light’和’dark’的组合结果,即所有与其周围不同的像素。

以下内容来自于halcon帮助文档:

var_threshold从输入图像中选择图像区域像素满足阈值条件的区域。阈值是根据每个像素(x,y)周围大小为MaskWidth x MaskHeight的局部掩膜的平均灰度值和标准差计算得出的。

由MaskWidth和MaskHeight定义的过滤器掩码的大小决定了要分割的对象的最大大小。但是,如果模板选择的太大,则非常接近的对象可能会合并。

定义v(x,y)是可变的阈值,d(x,y)是遍历每个像素时,掩膜覆盖的那些像素块灰度的标准差;StdDevScale 是标准差因子; 当标准差因子StdDevscale>=0时, v(x.y)取(StdDevscale x 标准差)和AbsThreshold中较大的那个 ; 当标准差因子StdDevScale<= 0时, v(xy)取(StdDevscale x 标准差)和AbsThreshold中较小的那个。

实测发现,这里的比较大小是带符号比较,由于标准差是非负数,当StdDevscale <0时,(StdDevscalex标准差) <=0恒成立,所以此时的取值就是(StdDevScale x标准差) 。

帮助文档中StdDevscale的推荐值范围是-1-1,一般的明显的黑白过度处的在50左右,StdDevScale即-50 ~50,50的灰度差异,对于一般分割来说足够。

推荐的值是0.2,如果参数StdDevScale太大,可能分割不出任何东西;如果参数StdDevScale太小(例如-2) ,可能会把整个图像区域全部输出,也达不到有效分割的目的。一般推荐使用该算子时,StdDevScale取正值。

需要强调的是:在黑白过渡处,一般掩膜覆盖的像素的标准差较大,而在其他平缓的地方,标准差较小;因此最终采用的分割值随着掩膜在不断遍历像素的过程中,在(StdDevScale x 标准差)和AbsThreshold之间不断切换。

halcon提供的例程图片,对该类图分割效果较好

  • var_threshold (Image, Region, 15, 15, 1.01, 40, ‘dark’)

dyn_threshold

(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )

OrigImage:原始输入图像 ThresholdImage:平滑处理之后的输入图像 RegionDynThresh:结果输出图像 Offset: 相对于ThresholdImage图像每个像素值的偏移量 LightDark:选择项,提取亮、暗或类似区域,默认值:“light”提供的选项: ‘dark’, ‘equal’, ‘light’, ‘not_equal’

这个算子就是根据灰度值比较,来选择那些符合这个公式的像素点。

原理:

令 g_{o} = g_{OrigImage} 和 g_{t} = g_{ThresholdImage}。其中,g_{OrigImage}是原始图像点的灰度值,g_{ThresholdImage}是平滑后图像点的灰度值。

LightDark = ‘light’ 的条件是:

对于 LightDark = ‘dark’,条件是:

对于 LightDark = ‘equal’,条件是:

对于 LightDark = ‘not_equal’,条件是

重要的是不要将参数Offset设置为零,因为在这种情况下会发现太多的小区域(噪声)。5到40之间的值是一个有用的选择。偏移量越大,提取的区域就越小。

halcon提供的例程图片

dyn_threshold (ImageOpening, ImageClosing, RegionDynThresh, 75, ‘not_equal’)

作用: 观看halcon推荐的例程,在做缺陷检测的时候用的较多,搭配gauss_filter,mean_image、binomial_filter等使用。

dyn_threshold的效果类似于对原始图像的高通滤波版本应用threshold,突出缺陷。

hysteresis_threshold

(Image : RegionHysteresis : Low, High, MaxLength : )

Image (input) :输入图像 RegionHysteresis (output) :滞后阈值操作分割后Region Low (input) :设置的低阈值 High (input) :设置的高阈值 MaxLength (input) :“安全”点和“潜在”点路径的最大长度。

原理: 对图像执行滞后阈值操作

有点类似于canny。图像上灰度值大于或等于High的点有效,这样的点被称为“secure points安全点,灰度值小于Low的点无效,灰度值在Low和High之间的点如果到“secure points的距离小于MaxLength则为有效。

作用: 通常用于对边缘图像(找边缘算法生成的图像)进行找边。

watersheds_threshold

(Image : Basins : Threshold : )

作用:通过阈值实现图像的分水岭算法分割

分水岭算法主要用于图像的分割,如果目标物体是连接在一起的,则分割起来会很困难。此时经常采用分水岭分割算法,会得到比较好的效果。

分水岭算法是一种典型的基于边缘的图像分割算法,通过寻找区域之间的分界线,对图像进行分割。“分水岭”这个名字与一种地貌特点有关,它的思想是,把图像的灰度看作一张地形图,其中像素的灰度表示该地点的高度。灰度值低的区域是低地,灰度值越高,地势越高。

低地聚集的地方如同一块盆地,如果模拟向整片区域注水,那么每块盆地将成为一个单独的积水区,即图像上的分割区域,盆地与盆地之间的边界就是区域的边界。随着注水的量越来越多,盆地的积水面积会不断扩大,边界区域则会越来越小,最后形成的分割边界就是分水岭。

如图,黄色区域连接成一块。

watersheds 与watersheds_threshold算子都是进行分水岭分割。

区别在于,后者比前者多了一步操作,即在得到初步的分水岭分割结果之后,将灰度小于阈值的分水岭合并。

步骤一:通过分水岭算法watersheds()获取图像的盆地。

步骤二:设B1和B2分别为相邻盆地的最小灰度值,W为将盆地分割为两个盆地的最小灰度值。则分割结果为: max{ W-B1,W-B2}<Threshold

假设分水岭的最小灰度为W(min),分水岭两侧的“洼地”区域的最小灰度分别为B(1)、B(2),如果max{(W(min)-B(1),),(W(min)-B(2),)}的值小于阈值,则将这两个“洼地”区域合并,分水岭消失。通过这样的阈值处理,符合灰度阈值条件的灰度“洼地”区域即被提取出来。

可以从上图看出,watersheds_threshold对watersheds有合并的操作。

distance_transform

搭配distance_transform(Region : DistanceImage : Metric, Foreground, Width, Height : )食用更佳

https://www.cnblogs.com/roger1996/p/15244115.html

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

icecream_cheese

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

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

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

打赏作者

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

抵扣说明:

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

余额充值