Halcon算子学习:图像阈值分割-threshold、binary_threshold、dyn_threshold算子

Halcon算子学习:图像阈值分割算子

      • 前言
      • 1.threshold-全局固定阈值分割
      • 2.Binary Threshold-自动全局阈值分割
      • 3.dyn_threshold-局部动态阈值分割
        • 小结:
      • 4.var_threshold算子-均值和标准偏差局部阈值分割
      • 5.dual_threshold-双重阈值分割(有符号图像的阈值算子)
      • 6.auto_threshold-自动全局阈值分割
      • 7.fast_threshold-快速全局阈值分割
      • 8.watersheds-分水岭算法分割

前言

图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越精准的方法计算量也越大。参考博客:

  • 图像处理之常见二值化方法汇总
  • Halcon阈值化算子dual_threshold和var_threshold的理解
    在这里插入图片描述

1.threshold-全局固定阈值分割

threshold(Image : Region : MinGray, MaxGray : )
——使用全局固定阈值分割图像
阈值从输入图像中选取灰度值g满足以下条件的像素点
在这里插入图片描述
满足条件的图像的所有点作为一个区域返回。如果传递多个灰度值间隔(MinGray和MaxGray的元组),则每个间隔返回一个单独的区域。对于向量场图像,阈值不应用于灰度值,而是应用于向量的长度。

应用一:利用灰度直方图确定阈值进行图像分割。一般是物体与背景之间存在一个明显的灰度差,直方图会存在两个波峰一个是目标一个是背景,那么阈值就是物体与背景之间的最小值。

read_image (Image, 'clip')
*计算直方图
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)
*将直方图转换为区域(包含直方图的区域;输入的直方图;直方图中心的行/列坐标;直方图的比例因子)
gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)
*利用直方图获取阈值
histo_to_thresh (AbsoluteHisto,10, MinThresh, MaxThresh)
*期望阈值
TarGetGray:=23
for Index := |MinThresh|-1 to 0 by -1if(MinThresh[Index]<=TarGetGray)MinThresh:= MinThresh[Index]breakendifendforfor Index1 := 0 to |MaxThresh|-1 by 1if (MaxThresh[Index1]>=TarGetGray)MaxThresh:=MaxThresh[Index1]breakendifendfor
*全局阈值分割
threshold (Image, Region1, MinThresh, MaxThresh)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.Binary Threshold-自动全局阈值分割

参考: 阈值分割算子之OSTU算法(binary_threshold)
binary_threshold(Image : Region : Method, LightDark : UsedThreshold)
——自动全局阈值分割(自动确定的全局阈值分割单通道图像,并在区域中返回分割后的区域)
输入:

  • Image:需要进行阈值的图像
  • Region:处理后的区域

输出:

  • Method:分割方法(‘max_separability’:最大限度的可分性, ‘smooth_histo’:直方图平滑)
  • LightDark:提取的是黑色部分还是白色部分
  • UsedThreshold:自动阈值使用的阈值值
	read_image (Image, 'clip')binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)

例如,分割均匀照明的背景上有用的字符。binary_threshold还返回UsedThreshold中使用的阈值。
使用的阈值由方法中给出的方法确定。目前,该操作符提供了以下两个方法:
’max_separability’:最大限度的可分性, ‘smooth_histo’:直方图平滑
这两种方法只能用于具有双峰直方图的图像。(如下图)

smooth_histo方法提供的功能与操作符bin_threshold提供的功能相同。方法’max_separability’倾向于为UsedThreshold确定较小的值。此外,它对柱状图中的稀疏孤立峰不那么敏感,而且通常比‘smooth_histo’更快。

最大限度的可分性(max_separability):
通过选择Method= ’ max_separability ',根据“灰度直方图的阈值选择方法”的灰度直方图自动阈值调用。该算法首先计算图像的直方图,然后利用统计矩找到将像素分割为前景和背景的最优阈值,并最大化这两个类之间的可分性。此方法仅适用于byte和uint2图像
如果LightDark = ‘light’,则选中所有灰度值大于或等于"T*"的像素。
如果LightDark = ‘dark’,则选中所有灰色值小于"T*"的像素。

直方图平滑(smooth_histo):
通过选择Method = 'smooth_histo ’ binary_threshold可以通过以下方式确定阈值:首先确定灰度值的相对直方图。然后,从直方图提取相关的最小值,作为阈值操作的参数。为了减少最小值,直方图被平滑处理为一个高斯函数,就像在auto_threshold中一样。在平滑直方图中,掩模尺寸增大,直到最小值。然后,阈值设置为这个最小值的位置。
如果LightDark = ‘light’,则选中所有灰度值大于或等于"T*"的像素。
如果LightDark = ‘dark’,则选中所有灰色值小于"T*"的像素。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.dyn_threshold-局部动态阈值分割

在这里插入图片描述
dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
——局部动态阈值分割 Dynamic Threshold

  • ThresholdImage:是我们用来作为灰度值参考的另外一幅图像,在实际使用过程中通常都是对原图像OrigImage进行一次平滑处理,然后用平滑处理之后得到的图像作为参考图像。
  • LightDark:是问我们提取亮?暗?还是相似的区域?(当然,这是相对于ThresholdImage)
  • Offset:其实是在设定一个比较的区间范围,因为在图像处理这个主观性本来就比较强的领域中“绝对”这个科学名次实在有点太过分,所以什么事情,只要在一个合理的范围内,我们都是可以接受的,而不是死死抓住一个点不放,最后也得不到想要的结果。

dyn_threshold 这个算子就是根据一套灰度值比较规则来选择原图像中那些灰度值符合这个公式的像素点。

g_{o} = g_{OrigImage}; 代表原图中的像素点的灰度值
g_{t} = g_{ThresholdImage};代表参考图中的像素点的灰度值

我们的做法是把参考图像的灰度值加上(减去)一个Offset,然后去和原图的像素点逐像素对应地进行比较。

下面看Halcon中给出的这些公式:
在这里插入图片描述

  • 当参数 LightDark = ‘light’ 时,
    既然选择light,那就代表提取相对参考图来说亮一些的地方,那么自然要选择那些灰度值比 gt + Offset 要大的像素点。
    在这里插入图片描述

  • 当参数 LightDark = ‘dark’ 时:
    如果要提取的是比参考图要暗一些的区域,那么自然要选择比g_t的灰度值要小的那些像素点,但是这样直接比较的话提取的小区域太多了,并没有很好地提取出相对参考图来说很明显有差别的那部分,所以我们才给定Offset这个参数用来修正。这样给参考图的灰度值一减掉Offset,提取出来的和参考的之间的差距就会很明显。
    在这里插入图片描述

  • 当参数 LightDark = ‘equal’ 时,
    选择equal的意思是选择那些和参考图的差不多的,只要在这个合理的范围内的都算。
    在这里插入图片描述

  • 最后, 当 LightDark = 'not_equal’时
    反正只要不是差不多的就不选,亮的暗的无所谓。
    在这里插入图片描述

通常,阈值图像是原始图像的平滑版本(例如,通过应用mean_image、binomial_filter、gauss_filter等)。然后dyn_threshold 的效果类似于将 threshold 应用到经过高通滤波的原始图像上(参见highpass_image)。dyn_threshold可以提取出物体的轮廓,其中物体的大小(直径)由低通滤波器的掩码大小和物体边缘的振幅决定:

所选择的模板越大,找到的region就会越大。一般来说,模板的大小应该是我们要提取的物体直径大小的两倍左右。还有很重要的一点是最好不要把Offset这个变量设置为0,因为这样会导致最后找到太多很小的regions,而这基本上都是噪声。所以这个值最好是在5-40之间,值选择的越大,提取出来的regions就会越小。
在这里插入图片描述
在这里插入图片描述

经过dyn_threshold这个算子处理之后,我们就可以提取一个物体的轮廓了,具体提取的方法当然要用到什么类似select_shape之类的算子,当然,这里最重要的是gen_contour_region_xld这个算子,用你刚才提取出来的这些区域生成XLD轮廓线,这样就达到了提取物体轮廓的目的。 注意,我们这样提取出来的所有符合条件的像素点都会被返回到一个region中去,所以如果你要分开的区域的话,就用connection这个算子再计算一下就好啦。

小结:

threshold是最简单的阈值分割算子,理解最为简单;binary_threshold是自动阈值算子,它可以自动选出暗(dark)的区域,或者自动选出亮(light)的区域,理解起来也没有难度。
动态阈值算子dyn_threshold理解起来稍微复杂一点,使用dyn_threshold算子的步骤基本是这样的:

① 将原图进行滤波模糊处理。

② 用原图和模糊后的图逐个像素做比较,它可以根据参数分割出原图比模糊后的图灰度高(或者低)若干个灰度值的区域。
举例如下:
在这里插入图片描述
处理代码:

read_image (Image, ‘C:/Users/happy xia/Desktop/dynPic.png‘)
mean_image (Image, ImageMean, 9, 9)
dyn_threshold (Image, ImageMean, RegionDynThresh, 10, ‘dark‘)

程序分析:本例中,将图片模糊后,点阵字的黑色扩散了,随之就是字的黑色不如原图那么黑了,那么通过给定的限值“10”和“dark”,就可以将原图比模糊后的图暗10个灰阶以上的区域(即黑色文字部分)选出来了。

4.var_threshold算子-均值和标准偏差局部阈值分割

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

var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )
——均值和标准偏差局部阈值分割,能够较好的分开目标和背景,对不适合的参数设置不敏感。

  • MaskWidth、 MaskHeight 是用于滤波平滑的掩膜单元;
  • StdDevScale 是标准差乘数因子(简称标准差因子);
  • AbsThreshold 是设定的绝对阈值;
  • LightDark 有4个值可选,’light’、’dark’、’equal’、’not_equal’。

var_threshold图像灰度值在均值与方差之和以上或在均值与方差之差以下

1)应用示例

var threshold (Image, Region, 4, 4, 0.2, 12, 'dark' )

在该程序中,先用4x4的掩膜在图像上逐像素游走,用原图中的当前像素和对应掩膜中16个像素的灰度均值对比,找出暗(dark)的区域。当原图像素灰度比对应的掩膜灰度均值低(0.2,12)个灰阶时(本程序中StdDevScale = 0.2, AbsThreshold = 12),该区域被分割出来。
问题的关键就是理解如何通过StdDevscale和AbsThreshold来确定用于分割的阈值。

2)var_threshold的帮助文档
在这里插入图片描述

  • 1)d(x,y)指的是遍历每个像素时,掩膜覆盖的那些像素块(本例中是4×4 = 16个像素)灰度的标准差;StdDevScale 是标准差因子;
  • 2)当标准差因子StdDevscale>=0时, v(x.y)取(StdDevscale x 标准差)和AbsThreshold中较大的那个 ;
  • 3)当标准差因子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之间不断切换。

3)var_threshold和dyn_threshold的区别和联系:

  • var_threshold算子和dyn_threshold算子极为类似,不同的是var threshold集成度更高,并且加入了"标准差x标准差因子"这一变量。可以有效地减少噪声对分割的影响
  • dyn_threshold是将原图和滤波平滑后的图对比, var_threshold是将原图和对应像素掩膜覆盖的像素的平均,灰度值对比,在算子var_threshold中,如果参数StdDevScale=0,那么就可以用动态阈值的方式非常近似地模拟,以上两种算法的效果,极为类似。
  • 那么当StdDevScale > 0 时,var_threshold对比dyn_threshold还存在什么优点呢?我认为是在黑白过渡处能减少分割出不需要的区域的概率。(因为黑白过渡处标准差大,当然前提是StdDevScale 不能设置得太小)
    在这里插入图片描述

5.dual_threshold-双重阈值分割(有符号图像的阈值算子)

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

  • MinSize 表示分割出来的区域的最小面积(即分割出来的面积要大于MinSize);
  • MinGray 表示分割出来的区域对应的原图中图像像素的最高灰度大于MinGray设定值。
  • threshold 灰度值小于阈值(或大于阈值)的区域被抑制;
  • dual_threshold算子的缺陷:它只能分割出灰度值高的亮区域,不能分割出灰度值低的暗区域
read_image (Image, ‘C:/Users/happy xia/Desktop/2.png‘)
dual_threshold (Image, RegionCrossings1, 174, 200, 180)
dual_threshold (Image, RegionCrossings2, 176, 200, 180)
dual_threshold (Image, RegionCrossings3, 176, 216, 180)* MinGray = Threshold 时,即为单阈值分割:选取灰度值大于180的区域
dual_threshold (Image, RegionCrossings4, 176, 180, 180)

源图:
在这里插入图片描述
RegionCrossings1
在这里插入图片描述
RegionCrossings2
在这里插入图片描述
RegionCrossings3(齿轮右下角灰度值未超过216,故无法选取)
在这里插入图片描述
RegionCrossings4()
在这里插入图片描述

6.auto_threshold-自动全局阈值分割

auto_threshold(Image : Regions : Sigma : )
——根据直方图确定阈值自动全局阈值分割

  • 运行原理,
  • 第一,计算灰度直方图。
  • 第二,高斯平滑后从直方图提取最小值。
  • 第三,根据提取的最小值进行阈值分割。sigma越大提取区域越少。
	read_image (Image, 'fabrik')median_image (Image, Median, 'circle', 3, 'mirrored')auto_threshold (Median, Regions, 3)

7.fast_threshold-快速全局阈值分割

fast_threshold(Image : Region : MinGray, MaxGray, MinSize : )
——快速全局阈值分割

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

8.watersheds-分水岭算法分割

watersheds(Image : Basins, Watersheds : : )
——分水岭图像分割。可以分割出分水岭和盆地。
watersheds_threshold(Image : Basins : Threshold : )
——通过阈值实现图像的分水岭算法分割

	read_image (Br2, 'particle')gauss_filter (Br2, ImageGauss, 9)invert_image (ImageGauss, ImageInvert)watersheds (ImageInvert, Basins, Watersheds)dev_set_draw ('margin')dev_set_colored (12)dev_display (Br2)dev_display (Basins)

第1步:
通过分水岭算法watersheds()获取图像的盆地。
第2步:
根据第一步分水岭算法分离结果,若盆地部分的灰度**< threshold**,则被合并到一起。设B1和B2分别为相邻盆地的最小灰度值,W为将盆地分割为两个盆地的最小灰度值。则分割结果为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

起底软银帝国:芯片、机器人、棒球队无所不投

来源&#xff1a;巴伦全球投资企鹅号划重点&#xff1a;孙正义喜欢将软银的投资组合比作银河系中的星星&#xff0c;称它们“将持续闪耀300年。”孙正义对阿里巴巴的投资可能是所有投资人做过的最好的投资之一。软银并非真正意义上的企业集团&#xff0c;其结构也不是封闭式基金…

南京大学潘天群教授:人类智能发展的宏大叙事

作者&#xff1a;南京大学哲学系教授&#xff0c;科学技术与社会研究所所长潘天群新拿到刚出版的《崛起的超级智能》一书&#xff0c;我一口气读完了。作者刘锋敏锐地观察到&#xff0c;今天的互联网已经不是个人电脑及智能手机等的简单连接&#xff0c;而是一个有生命的智能体…

Halcon学习笔记:读取多张图片

1.第1种方法 遍历文件路径数组 path:E:/images1/ ImagePath:[] ImagePath[0]:a000.bmp ImagePath[1]:a001.bmp ImagePath[2]:a002.bmp ImagePath[3]:a003.bmp ImagePath[4]:a004.bmp ImagePath[5]:a005.bmp ImagePath[6]:a006.bmp ImagePath[7]:a007.bmp for i:0 to 7 by 1re…

win10下VS2013+OpenCV2.4.9环境配置

参考来源https://blog.csdn.net/wsf09/article/details/78853823 一、安装Visual Studio2013 VS2013的安装可以参考软件安装管家公众号 二、配置OpenCV2.4.9 1、首先下载安装包 可以从OpenCV的官网下载 OpenCV2.4.9&#xff0c;但是会有点慢&#xff0c;中途可能还下载失败…

大脑简史(3)-大脑的结构

来源&#xff1a;人机与认知实验室前两篇文章&#xff0c;笔者和大家简短的介绍了一下大脑历史上的大事件和研究大脑的常用手段&#xff0c;这篇文章&#xff0c;想和大家分享一下&#xff1a;大脑的结构&#xff0c;也就是说&#xff1a;我们的大脑内究竟有什么。1967年&#…

Halcon算子学习:xyz_to_object_model_3d

xyz_to_object_model_3d (X, Y, Z : : : ObjectModel3D) 将3D点从图像转换为3D对象模型。 输入&#xff1a; X (input_object) 单通道图像→object (real) 用三维点的x坐标和三维点ROI区域。Y (input_object) 单通道图像→object (real) 图像与三维点的y坐标。Z (input_obje…

传感器融合:自动驾驶领域的另一个突围方向

来源&#xff1a;AI芯天下目前&#xff0c;自动驾驶的安全事故原因绝大多数出现在传感器这个重要环节&#xff0c;将各类传感器融合在一起&#xff0c;能否就能起到1&#xff0b;1&#xff1e;2的效果呢&#xff1f;传感器是汽车感知周围的环境的硬件基础&#xff0c;在实现自动…

Halcon算子学习:surface_normals_object_model_3d

surface_normals_object_model_3d ( : : ObjectModel3D, Method, GenParamName, GenParamValue : ObjectModel3DNormals) 计算三维物体模型的三维曲面法线 输入&#xff1a; ObjectModel3D (input_control) 包含3D点数据的3D对象模型句柄。Method(input_control) 法线计算方…

Halcon算子学习:smooth_object_model_3d

smooth_object_model_3d ( : : ObjectModel3D, Method, GenParamName, GenParamValue : SmoothObjectModel3D) 平滑3D对象模型的3D点 输入&#xff1a; object_model_3d&#xff08;input_control&#xff09; 包含3D点数据的3D对象模型的句柄。Method&#xff08;input_con…

机器人巨头争霸,谁主沉浮?

来源&#xff1a;高工机器人过去以来&#xff0c;ABB、发那科、安川、库卡这四家机器人巨头独霸中国一半以上的市场份额。但这一情况开始逆转&#xff0c;本土企业在被外企“教育”了多年之后&#xff0c;开始用更大的勇气和更快的创新速度给以“老师”们迎头痛击。2019年&…

Halcon算子学习:create_surface_model

create_surface_model ( : : ObjectModel3D, RelSamplingDistance, GenParamName, GenParamValue : SurfaceModelID) 创建执行基于表面的匹配所需的数据结构 输入&#xff1a; object_model_3d 3D对象模型的句柄。RelSamplingDistance (input_control) real→(real) 相对于物…

任正非:5G独立组网全世界只有华为一家做好了 我们在等待高通进步

任正非来源&#xff1a; TechWeb华为创始人、CEO任正非7月18日在广东接受了意大利媒体的采访。近日&#xff0c;华为在心声社区公布了这次采访的圆桌纪要。在回答意大利媒体记者的提问中&#xff0c;任正非表示&#xff1a;“国际媒体对华为几乎都是负面报道&#xff0c;因为他…

Halcon算子学习:find_surface_model

find_surface_model ( : : SurfaceModelID, ObjectModel3D, RelSamplingDistance, KeyPointFraction, MinScore, ReturnResultHandle, GenParamName, GenParamValue : Pose, Score, SurfaceMatchingResultID) 在3D场景中找到一个表面模型的最佳匹配。 输入&#xff1a; Surf…

Nature指明大脑引流“废液”的确切路径

来源&#xff1a;中国生物技术网多年来&#xff0c;科学家们一直认为大脑中缺少淋巴系统&#xff0c;从而引发了液体、大分子和免疫细胞是如何被清除出去的问题。2015年&#xff0c;有两项小鼠研究证实&#xff0c;脑膜&#xff08;保护大脑并维持其形状的覆盖物&#xff09;的…

Halcon算子学习:distance_object_model_3d

distance_object_model_3d ( : : ObjectModel3DFrom, ObjectModel3DTo, Pose, MaxDistance, GenParamName, GenParamValue : ) 计算一个3D对象模型到另一个3D对象模型的点的距离。 输入&#xff1a; object_model_3d→(整数) 源3D对象模型的句柄。ObjectModel3DTo 目标3D对象…

郭仁忠院士:新城市科学认知与智慧城市建设

来源&#xff1a; 慧天地张亚勤、刘慈欣、周鸿祎、王飞跃、约翰.翰兹联合推荐这是一部力图破解21世纪前沿科技大爆发背后的规律与秘密&#xff0c;深度解读数十亿群体智能与数百亿机器智能如何经过50年形成互联网大脑模型&#xff0c;详细阐述互联网大脑为代表的超级智能如何深…

MATLAB把多行多列矩阵数据和文字写入txt文件

效果&#xff1a; 代码&#xff1a; a[1,2,3;4,5,6;7,8,9] [m,~]size(a) fidfopen(a.txt,w); fprintf(fid,第一列\t第二列\t第三列\r\n); for i1:m fprintf(fid,%d\t%d\t%d\r\n,a(i,:)); end fclose(fid);

数字图像处理:视觉系统中的坐标系介绍

参考&#xff1a; 图像坐标系、摄像机坐标系与世界坐标系四个坐标系简介和转换世界坐标、相机坐标、图像坐标、像素坐标的原理、关系&#xff0c;并用matlab仿真 1、像素坐标系(Pixel coordinate system)&#xff08;二维坐标系&#xff09; 摄像机采集的数字图像在计算机内…

图灵机与控制论之分歧,一切为了人类心智的荣耀!

来源&#xff1a;新智元作者&#xff1a;李力、郑南宁、王飞跃编辑&#xff1a;小芹【导读】图灵和维纳的思想都对人工智能的研究之路产生了重要影响&#xff0c;本文讨论了AI发展过程中的主要困难&#xff0c;特别是解释了图灵的人工智能方法和维纳的人工智能方法之间的关键区…