Halcon阈值算子

编程入门 行业动态 更新时间:2024-10-15 14:17:17

Halcon<a href=https://www.elefans.com/category/jswz/34/1771248.html style=阈值算子"/>

Halcon阈值算子

Halcon阈值算子 – 局部阈值之dyn_threshold

相对于全局阈值,还有一类局部阈值算子。包含dyn_threshold,local_threshold,和var_threshold。本文先介绍dyn_threshold。

理论介绍

dyn_threshold算子的函数签名如下:
dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
输入参数有:

  • OrigImage:待处理图像
  • ThresholdImage:用作阈值的图像
  • Offset:施加在阈值处理上的固定offset
  • LightDark :枚举值 ‘dark’, ‘equal’, ‘light’, ‘not_equal’

输出参数有:

  • RegionDynThresh :阈值处理后的区域

如果令g_{o} = g_{OrigImage}, 和g_{t} = g_{ThresholdImage}.分别代表 OrigImage 和 ThresholdImage 在图像某点的灰度值。则根据如下关系生成 RegionDynThresh

  • LightDark = ‘light’
    g_{o} >= g_{t} + Offset
  • LightDark = ‘dark’
    g_{o} <= g_{t} - Offset
  • LightDark = ‘equal’
    g_{t} - Offset <= g_{o} <= g_{t} + Offset
  • LightDark = ‘not_equal’
    与‘equal’正好相反

dyn_threshold可以用来提取物体轮廓。ThresholdImage 通常是通过OrigImage平滑而来,平滑程度会影响能提取多大的物体轮廓。

offset实际上定义了在阈值操作时,OrigImage与ThresholdImage灰度值偏差的可接受范围。通常取值5~40

dyn_threshold 是一种动态局部阈值算子。

为什么要用动态阈值算子呢?因为此时往往图像中噪声较大,或者由于光照不均匀,导致无法用一个全局阈值,来分割出感兴趣的物体。
但是,在感兴趣物体的局部周围区域内,它和背景相比是可分离的。所以,可以用这个局部区域的背景灰度值作为阈值,来分割感兴趣物体。

如何确定这个局部区域的背景灰度值呢?可以通过图像平滑算子。
用f(r,c)表示输入图像,g(r,c)表示平滑后图像,gdiff表示可接受的最小灰度差(实际上就是dyn_threshold 算子的参数:Offset)。则对亮物体:
f(r,c) - g(r,c) >= gdiff
对暗物体:
f(r,c) - g(r,c) <= -gdiff

图像平滑到什么程度合适呢?这依赖于感兴趣物体的尺寸。以均值滤波为例,滤波器的宽度必须大于感兴趣物体的宽度。

代码演示

read_image (Image, 'surface_scratch')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, Width, Width, WindowID)
set_display_font (WindowID, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (4)
dev_display (Image)mean_image (Image, ImageMean, 7, 7)
dyn_threshold (Image, ImageMean, DarkPixels, 5, 'dark')
* 
* Extract connected components
connection (DarkPixels, ConnectedRegions)
dev_set_colored (12)
dev_display (Image)
dev_display (ConnectedRegions)select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 1000)
dev_display (Image)
dev_display (SelectedRegions)* Merge fractioned scratches via morphology
union1 (SelectedRegions, RegionUnion)
dilation_circle (RegionUnion, RegionDilation, 3.5)
dev_display (Image)
dev_display (RegionDilation)skeleton (RegionDilation, Skeleton)
connection (Skeleton, Errors)
dev_set_colored (12)
dev_display (Image)
dev_display (Errors)select_shape (Errors, Scratches, 'area', 'and', 50, 10000)
select_shape (Errors, Dots, 'area', 'and', 1, 50)
dev_display (Image)
dev_set_color ('red')
dev_display (Scratches)
dev_set_color ('blue')
dev_display (Dots)

阈值后的DarkPixels区域
形态学处理后得到的划痕区域

原图像

均值滤波后得到的图像,用作阈值图像

更多推荐

Halcon阈值算子

本文发布于:2024-03-05 00:57:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1710884.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:阈值   算子   Halcon

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!