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区域
形态学处理后得到的划痕区域
原图像
均值滤波后得到的图像,用作阈值图像