算子var_threshold

名称

var_threshold — 通过局部均值和标准差分析对图像进行阈值处理。

签名

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

描述

使用 var_threshold 算子,可以选择输入图像 Image 中满足以下条件的像素:

  • 具有较高的局部标准差(当 StdDevScale 为正值时),或者具有较低的局部标准差(当 StdDevScale 为负值时)。

  • 根据 LightDark 参数,在局部区域内为亮像素或暗像素。

因此,该算子能够在不均匀、有噪声或光照不均匀的背景下分割出目标区域。

输入参数提示
  • MaskWidthMaskHeight

    • MaskWidthMaskHeight 定义的滤波模板大小决定了要分割对象的最大尺寸。然而,如果模板选择得过大,彼此非常接近的对象可能会被合并。

    • (1)原始图像;目标是对垂直线条进行计数。(2)MaskWidth 设为 12,MaskHeight 设为 12,StdDevScale 设为 0.1,所有垂直线条都被正确分割。(3)如果模板尺寸选择得过小(设为 3),则无法正确选择所需区域。(4)如果模板尺寸过大(设为 40),彼此非常接近的对象可能会被合并。

    • 如果 MaskWidthMaskHeight 为偶数,则会使用下一个更大的奇数。总体而言,3 可以被认为是最小的合理值。

  • StdDevScale

    • 局部标准差用于衡量图像中的噪声。可以通过 StdDevScale 对其进行缩放,以反映所需的灵敏度。值越高,意味着只选择与周围像素差异非常大的像素。

    • 对于参数 StdDevScale,取值在 -1.0 到 1.0 之间是比较合理的选择,建议值为 0.2。如果该参数设置得过高或过低,可能会返回空区域或全区域。

    • (1)如果 StdDevScale 设置得过高(设为 1.3),算子会变得“挑剔”,只选择与周围像素非常相似的像素。(2)如果 StdDevScale 设置得过低(设为 -0.3),会错误地选择过多与周围像素有些相似的像素。

  • AbsThreshold

    • 在图像的均匀区域中,标准差较低,因此单个灰度值的影响较大。为了降低算子在均匀区域的灵敏度,可以调整 AbsThreshold 参数。这样,就可以忽略均匀背景中较小的灰度值变化。需要注意的是,当 StdDevScale 为负值时,AbsThreshold 也应选择负值。

  • LightDark

    • 'light''dark' 分别返回比其周围像素更亮或更暗的所有像素。

    • 'equal' 返回未被上述两种选项选中的所有像素,即与周围像素相对相等的像素。

    • 'not_equal' 返回 'light''dark' 的组合结果,即所有与周围像素不同的像素。

计算过程

  • (1)初始图像。(2)经过阈值处理后的图像(StdDevScale 设为 0.6,MaskWidth 设为 15,MaskHeight 设为 15,AbsThreshold 设为 10)。以下图像以示例方式展示了沿蓝色箭头方向的结果是如何得到的。

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

设:

  • g(x,y) 为输入图像 Image 中位置 (x, y) 处的灰度值。

  • m(x,y) 为相应的平均灰度值。

  • d(x,y) 为该像素周围模板内的相应标准差。

即这些像素周围模板内的原始灰度值、相应的平均灰度值和相应的标准差。

那么,可变阈值 v(x,y) 定义如下

$$
v(x,y) = max(StdDevScale * d(x,y), AbsThreshold) \;\ for \;\ StdDevScale \geqslant 0
$$

or

$$
v(x,y) = min( StdDevScale * d(x,y), AbsThreshold) \;\; for \;\; StdDevScale \leqslant 0
$$
  • 解释:当 StdDevScale 为正值时,会分析每个像素。确定用户定义的 AbsThreshold 和缩放后的标准差哪个更大,选择较大的值作为可变阈值 v(x,y)。当 StdDevScale 为负值时,则选择相应的较小值。

可以使用 StdDevScale 对标准差进行缩放。

可变阈值是根据缩放后的标准差和 AbsThreshold 来选择的。

根据可变阈值选择哪些像素由参数 LightDark 决定:

  • 'light'

    $$
    g(x,y) \ge m(x,y)+v(x,y)
    $$
    • 解释:如果某个像素比其周围像素亮 v(x,y) 个灰度值,则该像素被选中。

  • 'dark'

    $$
    g(x,y) \le m(x,y)-v(x,y)
    $$
    • 解释:如果某个像素比其周围像素暗 v(x,y) 个灰度值,则该像素被选中。

  • LightDark = 'equal'

    $$
    m(x,y)-v(x,y)\le g(x,y)\le m(x,y)+v(x,y)
    $$
    • 解释:精确选择那些未被 'light''dark' 选中的像素,即与周围像素相对相等的像素。

  • 'not_equal'

    $$
    m(x,y)-v(x,y)\ge g(x,y) \; \or \: g(x,y) \ge m(x,y)+v(x,y)
    $$
    • 解释:选择 'light''dark' 两种情况下的所有像素,即所有与周围像素相差 v(x,y) 个灰度值的像素。

'light''dark' 是根据相应的平均灰度值和可变阈值计算得出的。

例如,如果选择了 “暗(dark)” 选项,那么所有 “暗曲线” 高于 “灰度值曲线” 的像素都会被选中

注意事项

请注意,如果使用具有缩小定义域的图像作为输入,滤波算子可能会返回意外结果。请参考“滤波器”章节。

参数
  • Image(输入对象) 单通道图像(数组) → 对象(byte / int2 / int4 / uint2 / real

    • 输入图像。

  • Region(输出对象) 区域(数组) → 对象

    • 分割后的区域。

  • MaskWidth(输入控制) 范围.x → (整数)

    • 用于计算均值和标准差的模板宽度。

    • 默认值:15

    • 建议值:9, 11, 13, 15

    • 限制条件:MaskWidth >= 1

  • MaskHeight(输入控制) 范围.y → (整数)

    • 用于计算均值和标准差的模板高度。

    • 默认值:15

    • 建议值:9, 11, 13, 15

    • 限制条件:MaskHeight >= 1

  • StdDevScale(输入控制) 数值 → (实数 / 整数)

    • 灰度值标准差的缩放因子。

    • 默认值:0.2

    • 建议值:-0.2, -0.1, 0.1, 0.2

  • AbsThreshold(输入控制) 数值 → (实数 / 整数)

    • 与均值的最小灰度值差异。

    • 默认值:2

    • 建议值:-2, -1, 0, 1, 2

  • LightDark(输入控制) 字符串 → (字符串)

    • 阈值类型。

    • 默认值:'dark'

    • 取值列表:'dark', 'equal', 'light', 'not_equal'

复杂度

设 A 为输入区域的面积,则运行时间为 O(A)。

结果

如果所有参数正确,var_threshold 算子返回 2 (H_MSG_TRUE)。可以通过 set_system 函数设置标志 'no_object_result''empty_region_result''store_empty_region' 的值来确定对输入图像和输出区域的处理方式。必要时会抛出异常。

替代算子

dyn_thresholdthreshold

参考文献

W.Niblack,《数字图像处理导论》,第 115 - 116 页,新泽西州恩格尔伍德克利夫斯,普伦蒂斯·霍尔出版社,1986 年

模块

基础模块

HDevelop 例程

  • var_threshold.hdev:使用根据局部均值和标准差计算得到的局部阈值对图像进行分割。

  • label_word_process_mlp.hdev:使用基于多层感知器(MLP)的 OCR 分类器和词典读取保质期标签,以提高识别结果。

  • check_smd_tilt.hdev:检查表面贴装器件(SMD)是否倾斜。

  • check_blister.hdev:检查自动填充的泡罩包装的内容物。

算子var_threshold的更多相关文章

  1. Halcon阈值化算子dual_threshold和var_threshold的理解

    Halcon中阈值二值化的算子众多,通常用得最多的有threshold.binary_threshold.dyn_threshold等. threshold是最简单的阈值分割算子,理解最为简单:bin ...

  2. HALCON中的算子大全(中英对照)

    HALCON中的算子大全(中英对照) Chapter 1 :Classification1.1 Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训 ...

  3. HALCON学习之算子大全

    1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训练数据上. 2.classify_class_gmm ...

  4. halcon 算子功能查找大全中文版(可直接下载)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11543364.html haicon算子中文查找大全百度云链接 链接:https://pan. ...

  5. Halcon斑点分析涉及算子及其高阶运用

    涉及算子 获取图像 使用ROI 对齐ROI或图像 校正图像 基础内容这里不再重述 预处理图像(过滤) 基础: mean_image(平均平滑过滤),gauss_filter(高斯滤波),binomia ...

  6. (八)map,filter,flatMap算子-Java&Python版Spark

    map,filter,flatMap算子 视频教程: 1.优酷 2.YouTube 1.map map是将源JavaRDD的一个一个元素的传入call方法,并经过算法后一个一个的返回从而生成一个新的J ...

  7. opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较

    opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较 参考: http://wenku.baidu.com/link?url=1aDYAJBCrrK-uk2w3sSNai7h52x_ ...

  8. 特征描述算子-sift

    特征描述算子-sift http://boche.github.io/download/sift/Introduction%20to%20SIFT.pdf

  9. EasyPR--开发详解(3)高斯模糊、灰度化和Sobel算子

    在上篇文章中我们了解了PlateLocate的过程中的所有步骤.在本篇文章中我们对前3个步骤,分别是高斯模糊.灰度化和Sobel算子进行分析. 一.高斯模糊 1.目标 对图像去噪,为边缘检测算法做准备 ...

  10. Spark算子选择策略

    摘要  1.使用reduceByKey/aggregateByKey替代groupByKey 2.使用mapPartitions替代普通map 3.使用foreachPartitions替代forea ...

随机推荐

  1. function keyword is non-standard. Delete it.

    SC2112 – ShellCheck Wiki See this page on GitHub function keyword is non-standard. Delete it. Proble ...

  2. 解决:pip is configured with locations that require TLS/SSL

    解决: mkdir -p ~/.pipvim ~/.pip/pip.conf然后输入内容: [global]index-url = http://mirrors.aliyun.com/pypi/sim ...

  3. Qt编写安防视频监控系统36-onvif连续移动

    一.前言 时隔一年多,重新对视频监控系统的onvif内核重写,一方面为了兼容Qt6,一方面按功能分类提高效率.整体逻辑思路是一样的,主要的改动是由于Qt6不再支持QtXmlPatterns模块(其实这 ...

  4. 闲话即时通讯:腾讯的成长史本质就是一部QQ成长史

    1.前言 在猴年新春的时候,腾讯当时推出了新春广告片(点击观看视频),作为<弹指间 心无间>的延续.片中通过春节期间发送QQ红包让家人打车回家团聚,让我们感受到了"最温暖的红包, ...

  5. vivo手机上的系统级消息推送平台的架构设计实践

    本文由vivo互联网服务器团队李青鑫分享,有较多修订和改动. 1.引言 本文内容来自vivo互联网服务器团队李青鑫在"2021 vivo开发者大会"现场的演讲内容整理而成(现场演讲 ...

  6. 即时通讯安全篇(九):为什么要用HTTPS?深入浅出,探密短连接的安全性

    本文由ELab技术团队分享,原题"探秘HTTPS",有修订和改动. 1.引言 对于IM开发者来说,IM里最常用的通信技术就是Socket长连接和HTTP短连接(通常一个主流im会是 ...

  7. .NET Core 委托原理解析

    .NET Core 委托原理解析 在 .NET Core 中,委托(Delegate)是一种类型安全的函数指针,它允许你将方法作为参数传递给其他方法,或者将方法存储在变量中以便稍后调用.委托在事件处理 ...

  8. CDS标准视图:维护包描述 I_MaintPackageTextData

    视图名称:维护包描述 I_MaintPackageTextData 视图类型:基础 视图代码: 点击查看代码 @EndUserText.label: 'Maintenance Package - Te ...

  9. winform 引用AForge调用摄像头拍照

    Nuget安装这个2个: AForge.Controls; AForge.Video.DirectShow; code: namespace WindowsFormsApp1 { partial cl ...

  10. c# Progress<T>

    c# Progress<T> 用于显示进度........主要是利用IProgress<T> 的Report(T)方法: private void BtnDownload_Cl ...