Halcon dyn_threshold详解

dyn_threshold

原型

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

功能

利用局部阈值分割图像

参数列表

OrigImage (input_object):原始图像
ThresholdImage (input_object):处理后图像(一般采用滤波处理)
RegionDynThresh (output_object):分割后区域
Offset (input_control):灰度值偏移量。
LightDark (input_control):提取区域类型( ‘dark’, ‘equal’, ‘light’, ‘not_equal’)

详解

如果满足给定的条件,算子会分割出不同区域。具体如下图
在这里插入图片描述
ThresholdImage图可以通过mean_image, binomial_filter, gauss_filter等滤波方式处理。
滤波选择的掩膜尺寸越大,提取的区域越大。根据经验,掩膜大小选择应该是要提取目标直径的两倍。参数Offset不要设置0,否则将会提取到很多小的噪点区域,一般介于5-40最佳,其值越大,提取的区域越小。

举例

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

代码

主函数

* 像素偏移值
Offset := 15
* 加载一幅图像
read_image (Image, 'letters')
* 获取图像尺寸
get_image_size (Image, ImageWidth, ImageHeight)
* 均值滤波
mean_image (Image, ImageMean, 5, 5) 
* Halcon算子
dyn_threshold (Image, ImageMean, OriLightRegion, Offset, 'light')
dyn_threshold (Image, ImageMean, OriDarkRegion, Offset, 'dark')
dyn_threshold (Image, ImageMean, OriEqualRegion, Offset, 'equal')
dyn_threshold (Image, ImageMean, OriNotEqualRegion, Offset, 'not_equal')
* 获取亮、暗、类似、不同Region(根据文档实现算子)
DynThreshold (Image, ImageMean, LightRegion, DarkRegion, EqualRegion, NotEqualRegion, ImageWidth, ImageHeight, Offset)

子函数(速度有点慢,主要目的是加深算子理解)

* 数组存储下标初始化
LightTime := 0
DarkTime := 0
EqualTime := 0
NotEqualTime := 0
* 满足条件数组初始化
tuple_gen_const (0, 0, LightPixelsPositionRowTuple)
tuple_gen_const (0, 0, LightPixelsPositionColTuple)
tuple_gen_const (0, 0, DarkPixelsPositionRowTuple)
tuple_gen_const (0, 0, DarkPixelsPositionColTuple)
tuple_gen_const (0, 0, EqualPixelsPositionRowTuple)
tuple_gen_const (0, 0, EqualPixelsPositionColTuple)
tuple_gen_const (0, 0, NotEqualPixelsPositionRowTuple)
tuple_gen_const (0, 0, NotEqualPixelsPositionColTuple)
* 区域初始化
gen_empty_region (LightRegion)
gen_empty_region (DarkRegion)
gen_empty_region (EqualRegion)
gen_empty_region (NotEqualRegion)
* 遍历一幅图,寻找满足条件的点位置
for ColIndex := 0 to ImageWidth - 1 by 1
    for RowIndex := 0 to ImageHeight - 1 by 1
        * 分别获取两张图对应位置的灰度值
        get_grayval (ImageMean, RowIndex, ColIndex, ImageMeanGrayval)
        get_grayval (ImageOrig, RowIndex, ColIndex, ImageGrayval)
        * 寻找亮区域
        if (ImageGrayval - ImageMeanGrayval >= Offset)
            LightPixelsPositionRowTuple[LightTime] := RowIndex
            LightPixelsPositionColTuple[LightTime] := ColIndex
            LightTime := LightTime + 1
       endif
       
       * 寻找暗区域
       if (ImageMeanGrayval - ImageGrayval >= Offset)
           DarkPixelsPositionRowTuple[DarkTime] := RowIndex
           DarkPixelsPositionColTuple[DarkTime] := ColIndex
           DarkTime := DarkTime + 1
       endif
       
       * 寻找类似区域
       if (abs(ImageGrayval - ImageMeanGrayval) <= Offset)
           EqualPixelsPositionRowTuple[EqualTime] := RowIndex
           EqualPixelsPositionColTuple[EqualTime] := ColIndex
           EqualTime := EqualTime + 1
       endif
       
       * 寻找不同区域
       if ((ImageMeanGrayval - ImageGrayval > Offset) or (ImageGrayval - ImageMeanGrayval > Offset))
           NotEqualPixelsPositionRowTuple[NotEqualTime] := RowIndex
           NotEqualPixelsPositionColTuple[NotEqualTime] := ColIndex
           NotEqualTime := NotEqualTime + 1
       endif
    endfor
endfor
* 根据获取的点位信息生成亮区域
tuple_gen_const (LightTime, 0, PhiTuple)
tuple_gen_const (LightTime, 0.1, Length1Tuple)
tuple_gen_const (LightTime, 0.1, Length2Tuple)
gen_rectangle2 (LightRegion, LightPixelsPositionRowTuple, LightPixelsPositionColTuple, PhiTuple, Length1Tuple, Length2Tuple)
union1 (LightRegion, LightRegion)

* 根据获取的点位信息生成暗区域
tuple_gen_const (DarkTime, 0, PhiTuple)
tuple_gen_const (DarkTime, 0.1, Length1Tuple)
tuple_gen_const (DarkTime, 0.1, Length2Tuple)
gen_rectangle2 (DarkRegion, DarkPixelsPositionRowTuple, DarkPixelsPositionColTuple, PhiTuple, Length1Tuple, Length2Tuple)
union1 (DarkRegion, DarkRegion)

* 根据获取的点位信息生成类似区域
tuple_gen_const (EqualTime, 0, PhiTuple)
tuple_gen_const (EqualTime, 0.1, Length1Tuple)
tuple_gen_const (EqualTime, 0.1, Length2Tuple)
gen_rectangle2 (EqualRegion, EqualPixelsPositionRowTuple, EqualPixelsPositionColTuple, PhiTuple, Length1Tuple, Length2Tuple)
union1 (EqualRegion, EqualRegion)

* 根据获取的点位信息生成不同区域
tuple_gen_const (NotEqualTime, 0, PhiTuple)
tuple_gen_const (NotEqualTime, 0.1, Length1Tuple)
tuple_gen_const (NotEqualTime, 0.1, Length2Tuple)
gen_rectangle2 (NotEqualRegion, NotEqualPixelsPositionRowTuple, NotEqualPixelsPositionColTuple, PhiTuple, Length1Tuple, Length2Tuple)
union1 (NotEqualRegion, NotEqualRegion)
return ()
  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值