Halcon例程一维函数的使用之check_smd_tilt.hdev


前言

该程序检查 SMD 是否接近水平或是否相对于相机倾斜。图像是在小景深下拍摄的,因此倾斜的 SMD 部分模糊。
首先,从图像中分割出 SMD。 然后,计算边缘的幅度(灰度值的一阶导数)。 边缘幅度在模糊区域较弱。
因此,可以通过比较 SMD 左右部分的边缘幅度来检测倾斜的 SMD。


1、一维函数——check_smd_tilt.hdev

初始化窗口准备

dev_update_off ()
dev_close_window ()  //关闭活动图形窗口
//Open a new graphics window
dev_open_window (0, 0, 640 * .7, 512 * .7, 'black', WindowHandle)
dev_set_draw ('margin')   //定义区域填充模式
dev_set_line_width (3)    //定义区域轮廓输出的线宽
//Open a new graphics window
dev_open_window (0, 640 * .7 + 12, 640 * .7, 512 * .7, 'black', GrayProfileWindow)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
set_display_font (GrayProfileWindow, 16, 'mono', 'true', 'false')

图像处理

* 
NumImages := 10
for Index := 1 to NumImages by 1
    read_image (Image, 'smd/smd_tilted_' + Index$'02') //读取不同文件格式的图像
    * 
    * Segment the SMD
    * 
    //通过局部均值和标准差分析对图像进行阈值处理
    var_threshold (Image, Region, 20, 20, 0.1, 2, 'dark') 
    //计算区域的连通分量
    connection (Region, ConnectedRegions)
    //借助形状特征选择区域
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 15000, 99999999)
    //变换区域的形状
    shape_trans (SelectedRegions, RegionTrans, 'convex')
    //缩小图像的域
    reduce_domain (Image, RegionTrans, ImageReduced)
    * 
    * Check if the SMD is tilted
    * 
    //使用 Sobel 算子检测边缘(幅度)
    sobel_amp (ImageReduced, EdgeAmplitude, 'sum_abs', 3)
    //任何方向的最小环绕矩形
    //区域的最小周围矩形,请注意,计算是基于区域像素的中心坐标。 
    smallest_rectangle2 (RegionTrans, Row, Column, Phi, Length1, Length2)
    //创建任意方向的矩形
    gen_rectangle2 (Rectangle, Row, Column, Phi, Length1 - 3, 20)
    //准备提取垂直于矩形的直边
    gen_measure_rectangle2 (Row, Column, Phi, Length1 - 3, 20, 640, 512, 'nearest_neighbor', MeasureHandle)
    //提取垂直于矩形或圆弧的灰度值轮廓
    measure_projection (EdgeAmplitude, MeasureHandle, GrayValues)
    // Delete a measure object
    close_measure (MeasureHandle)
    Sequence := [1:|GrayValues|]
    //创建一维函数 (x,y)
    create_funct_1d_pairs (Sequence, GrayValues, Function)
    gen_arrow_contour_xld (Arrow, [Row,Row], [Column,Column], [Row - Length1 * sin(Phi),Row + Length1 * sin(Phi)], [Column + Length1 * cos(Phi),Column - Length1 * cos(Phi)], 25, 25)
    * 
    * Evaluate the edge amplitude of the SMD profile
    Length := |GrayValues|
    PartLeft := GrayValues[0:Length / 2]
    PartRight := GrayValues[Length / 2:Length - 1]
    RangeLeft := max(PartLeft) - min(PartLeft)
    RangeRight := max(PartRight) - min(PartRight)
    TiltRatio := RangeLeft / RangeRight
    if (TiltRatio > 3 or TiltRatio < 1.0 / 3)
        Color := 'red'
        String := 'Not OK:\nSMD is tilted'
    else
        Color := 'green'
        String := 'OK:\nSMD is aligned'
    endif
    * 
显示结果
    * Display the results
    dev_set_window (WindowHandle)   //激活图形窗口
    dev_display (Image)             //在当前图形窗口中显示图像对象
    dev_set_color (Color)           //设置一种或多种输出颜色
    dev_display (Arrow)             //在当前图形窗口中显示图像对象
    dev_display (RegionTrans)
    disp_message (WindowHandle, String, 'window', 12, 12, 'black', 'true')
    dev_set_window (GrayProfileWindow)  //激活图形窗口
    dev_clear_window ()                 //清除活动图形窗口的内容
    //绘制一维函数图像
    plot_funct_1d (GrayProfileWindow, Function, [], [], Color, 'axes_color', 'none')
    disp_message (GrayProfileWindow, ['Edge amplitude','Tilt ratio = ' + TiltRatio$'3.2f'], 'window', 12, 12, 'white', 'false')
    if (Index != NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor

1.1 图像边缘清晰对应的振幅(amplitude)

在这里插入图片描述

1.2 图像边缘模糊对应的振幅(amplitude)

在这里插入图片描述

1.3 局部均值和标准差分析对图像进行阈值处理var_threshold

在这里插入图片描述

1.4 借助形状特征选择区域 select_shape

在这里插入图片描述

1.5 变换区域的形状 shape_trans

在这里插入图片描述

1.6 缩小图像的域 reduce_domain

在这里插入图片描述

1.7 使用 Sobel 算子检测边缘(幅度) sobel_amp

在这里插入图片描述

1.8 任何方向的最小环绕矩形 smallest_rectangle2

创建任意方向的矩形gen_rectangle2

在这里插入图片描述

1.9 准备提取垂直于矩形的直边 gen_measure_rectangle2

在这里插入图片描述

2、分析关键函数功能和用法

2.1 dev_open_window (Operator)

2.1.1 函数原型

dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle)
//其中
Row (input_control)     rectangle.origin.y → (integer)
Column (input_control)  rectangle.origin.x → (integer)
	//左/右上角的行索引。
	//默认值:0
	//典型值范围:0 ≤ Row/Column
	//最小增量:1
	//推荐增量:1
	//限制:Row/Column >= 0
Width (input_control)   rectangle.extent.x → (integer)
Height (input_control)  rectangle.extent.y → (integer)
	//窗口的宽度/高度。
	//默认值:256
	//典型值范围:0 ≤ Width/Height  
	//最小增量:1
	//推荐增量:1
	//限制:(Width/Height  > 0) || (Width/Height  == -1)
Background (input_control)  integer → (integer / string)
	//Color of the background of the new window.
	//Default value: 'black'
WindowHandle (output_control)  window → (integer)
	//窗口标识符

2.1.2 example

dev_close_window ()
read_image (For5, 'for5')
get_image_size (For5, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (For5)
dev_set_lut ('rainbow')
dev_display (For5)
stop ()
dev_set_lut ('default')
dev_display (For5)
stop ()
dev_set_part (100, 100, 300, 300)
dev_display (For5)

2.1.3 analysis

dev_open_window 打开一个新的图形窗口,可用于显示图像、区域和线条等标志性对象以及执行文本输出。此窗口自动变为活动状态,这意味着所有输出(dev_display 和操作员结果的自动显示)都重定向到此窗口。这由活动按钮上的发光灯显示。

图形窗口的原点是坐标 (0,0) 的左上角。 x 值(列)从左到右增加,y 值(行)从上到下增加。默认情况下,坐标系的设置方式是图像显示时无需剪裁并完全适合图形窗口。对于在程序重置或加载新程序之后显示的第一幅图像,或者如果当前图像的图像大小与之前显示的图像不同,则根据此规则,坐标系适应窗口大小。窗口的大小不会自动调整,因此,如果图像的纵横比与窗口的纵横比不同,则图像会扭曲以适应窗口。这可以通过窗口大小菜单进行更改。

每个图形窗口管理一个历史记录,其中包含
1.对象和
2.显示参数


2.2 var_threshold

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

2.2.1 函数原型

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

参数

//参数
Image (input_object)  singlechannelimage(-array)object (byte/int2/int4/uint2/real)
	//input image
Region (output_object)  egion(-array) → object
	//Segmented regions
MaskWidth (input_control)   extent.x → (integer)
MaskHeight (input_control)  extent.y → (integer)
	//用于平均值和偏差计算的掩码宽度/高度。
	//默认值:15
	//建议值:9、11、13、15
	//限制:MaskWidth/MaskHeight  >= 1
StdDevScale (input_control)  number → (real / integer)
	//灰度值标准偏差的因子。
	//默认值:0.2
	//建议值:-0.2、-0.1、0.1、0.2
AbsThreshold (input_control) number → (real / integer)
	//与平均值的最小灰度值差异。
	//默认值:2
	//建议值:-2、-1、0、1、2
LightDark (input_control) string → (string)
	//Threshold type.
	//Default value: 'dark'
	//List of values: 'dark', 'equal', 'light', 'not_equal'

2.2.2 分析

运算符 var_threshold 从输入图像 Image 中选择像素满足阈值条件的那些区域。 阈值是根据每个像素 (x,y) 周围大小为 MaskWidth x MaskHeight 的局部窗口中的平均灰度值和标准偏差计算得出的。 如果 MaskWidth 或 MaskHeight 为偶数,则使用下一个较大的奇数值。 掩码窗口应大于要分割的图像特征,并且应至少包含三个像素。

设 g(x,y) 为输入图像 Image 中 (x,y) 位置的灰度值,m(x,y) 和 d(x,y) 为窗口中灰度值的对应均值和标准差 围绕那个像素和

在这里插入图片描述

在这里插入图片描述

标准偏差用作图像中噪声的度量,并由 StdDevScale 缩放以反映所需的灵敏度。 阈值条件由参数 LightDark 决定:

LightDark = ‘light’:

在这里插入图片描述

LightDark = ‘dark’:

在这里插入图片描述

LightDark = ‘equal’:

在这里插入图片描述

LightDark = ‘not_equal’:

在这里插入图片描述

所有满足上述条件的像素都被聚合到结果区域 Region 中。

对于参数 StdDevScale 值,介于 -1.0 和 1.0 之间是明智的选择,建议值为 0.2。 如果参数太高或太低,可能会返回一个空或完整的区域。 参数 AbsThreshold 在 StdDevScaledev(x,y) 上设置了一个额外的阈值。 如果 StdDevScaledev(x,y) 对于 StdDevScale 的正值低于 AbsThreshold,或者对于负值 StdDevScale 高于 AbsThreshold,则采用 AbsThreshold。


2.3 connection (Operator)

connection — 计算区域的连通分量

2.3.1 函数原型

connection(Region : ConnectedRegions : : )

//参数
Region (input_object)               region(-array) → object
	//input region
ConnectedRegions (output_object)    region -array → object
	//连接的组件

2.3.2 描述

connection 确定 Region 中给定的输入区域的连通分量。 用于此的邻域可以通过 set_system(‘neighborhood’,<4/8>) 设置。 默认是 8-neighborhood,这对于确定前景的连通分量很有用。 connection 返回的最大连接组件数可以通过 set_system(‘max_connection’,) 设置。 默认值 0 会导致返回所有连接的组件。 连接的逆运算符是 union1。


2.4 select_shape (Operator)

select_shape — 借助形状特征选择区域

2.3.1 函数原型

select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
//参数
Regions (input_object)            region-array → objec
	//要检查的区域
SelectedRegions (output_object)   region-array → object
	//满足条件的区域
Features (input_control)          string(-array)(string)
	//选择筛选的形状特征。
	/*Default value: 'area'
List of values: 'anisometry', 'area', 'area_holes', 'bulkiness', 'circularity', 
'column', 'column1', 'column2', 'compactness', 'connect_num', 'contlength', 
'convexity', 'dist_deviation', 'dist_mean', 'euler_number', 'height', 'holes_num', 
'inner_height', 'inner_radius', 'inner_width', 'max_diameter', 'moments_i1', 
'moments_i2', 'moments_i3', 'moments_i4', 'moments_ia', 'moments_ib', 'moments_m02', 
'moments_m02_invar', 'moments_m03', 'moments_m03_invar', 'moments_m11',
'moments_m11_invar', 'moments_m12', 'moments_m12_invar', 'moments_m20',
'moments_m20_invar', 'moments_m21', 'moments_m21_invar', 'moments_m30',
'moments_m30_invar', 'moments_phi1', 'moments_phi2', 'moments_psi1', 'moments_psi2', 
'moments_psi3', 'moments_psi4', 'num_sides', 'orientation', 'outer_radius', 'phi', 
'ra', 'rb', 'rect2_len1', 'rect2_len2', 'rect2_phi', 'rectangularity', 'roundness', 
'row', 'row1', 'row2', 'struct_factor', 'width'
*/

Operation (input_control)  string → (string)
	//单个特征的链接类型
	//Default value: 'and'
	//List of values: 'and', 'or'
Min (input_control)      real(-array)(real / integer / string)
	//Lower limits of the features or 'min'.
	//Default value: 150.0
	//Typical range of values: 0.0 ≤ Min ≤ 99999.0
	//Minimum increment: 0.001
	//Recommended increment: 1.0
Max (input_control)    real(-array)(real / integer / string) 
	//Upper limits of the features or 'max'.
	//Default value: 99999.0
	//Typical range of values: 0.0 ≤ Max ≤ 99999.0
	//Minimum increment: 0.001
	//Recommended increment: 1.0
	//Restriction: Max >= Min



2.3.2 example

* where are the eyes of the ape ?
read_image(Image,'monkey')
threshold(Image,S1,160,255)
connection(S1,S2)
select_shape(S2,Eyes,['area','anisometry'],'and',[500,1.0],[50000,1.7])
dev_display(Image)

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值