您好,欢迎来到刀刀网。
搜索
您的当前位置:首页Halcon 一维测量卡尺找点

Halcon 一维测量卡尺找点

来源:刀刀网

        一维测量主要是指提取测量对象的边缘 ,所以必须获得测量区域的灰度变化,边缘提取前面博文有介绍过这里不再赘述。计算测量区域内垂直于轮廓线上单位像素间隔的平均灰度值,其实就是计算投影线的平均灰度值,其中头ing先的长度是测量区域的宽,计算各个平均灰度值后即可得到整个轮廓线的灰度值。在求取平度灰度值的过程中,去过测量矩形不是水平或垂直状态,则必须沿投影线对像素进行插值,可以选则不同的插值方法,目前Halcon支持的有临近区域法(Nearest_neighbor),双线性插值法(Bilinear),双三次插值法(Bicubic)等。

      最近邻插值法nearest_neighbor是最简单的灰度值插值。也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。最近邻插值法可应用于图像的缩放,因为简单的变换与计算,效果一般不好。

         双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值,其核心思想是在两个方向分别进行一次线性插值。
        双三次插值又叫双立方插值,用于在图像中“插值”(Interpolating)或增加“像素”(Pixel)数量/密度的一种方法。通常利用插值技术增加图形数据,以便在它打印或其他形式输出的时候,能够增大打印面积以及(或者)分辨率。双立方插值通常能产生效果最好,最精确的插补图形,但它速度也几乎是最慢的。“双线性插值”(Bilinear interpolation)的速度则要快一些,但没有前者精确。在商业性图像编辑软件中,经常采用的是速度最快,但也是最不准确的“最近相邻”(Nearest Neighbor)插值。其他一些插值技术通常只在高档或单独应用的程序中出现。
        显然,无论技术多么高级,插补过的数据肯定没有原始数据准确。这意味着对一个图形文件进行插值处理后,虽然文件长度增加了(数据量增大),但不会有原先那幅图锐利,可能会在图形质量上打折扣。

     本文主要针对Halcon卡尺算子在双线性插值方法下做效果展示。

    算子有measure_pos,measure_pairs,measure _ thresh

1:measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)提取测量区域内垂直于矩形或扇环的边缘(只适用于直边缘,不适用于从曲面对象中提取边缘)

Image:输入图像
MeasureHandle:测量句柄
Sigma:进行高斯平滑的方差值,0.4-100
Threshold:边缘的最小幅度,即只有轮廓线一阶导数绝对值大于该参数时,边缘才会被选中,1-255
Transition:边缘灰度值过渡类型,将沿主轴方向从暗到亮定义为正向边缘(Positive),将从亮到暗定义为负向边缘(Negative)
Select:选择返回的边缘点,‘all’返回所有边缘点,‘first’返回第一个点,‘last’返回最后一个点
RowEdge, ColumnEdge:边缘中心行,列坐标
Amplitude:边缘梯度幅值,即相应的一阶导数值
Distance:连续边缘之间的距离

read_image (Image123, 'E:/资源图片/123.png')
rgb1_to_gray (Image123, GrayImage)
gen_rectangle1 (ROI_0, 241.966, 131.705, 375.14, 3.043)
reduce_domain (GrayImage, ROI_0, ImageReduced)
crop_domain (ImageReduced, ImagePart)
dev_get_window (WindowHandle)
Colors := ['blue','red','green','orange','yellow']
dev_set_draw ('margin')
dev_set_color ('blue')
*手动划定ROI
draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
*生成ROI展示区域
gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2)
get_image_size (ImagePart, Width, Height)
*生成测量句柄
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
*卡尺获取区域内所有满足条件点
measure_pos (ImagePart, MeasureHandle, 1, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 6, 0.78)
distance_pp (RowEdge[0], ColumnEdge[0], RowEdge[1], ColumnEdge[1], Distance1)
dev_display (ImagePart)
dev_display (Rectangle)
dev_display (Cross)

*positive沿主轴方向由暗到亮的正向边缘
measure_pos (ImagePart, MeasureHandle, 1, 30, 'positive', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 6, 0.78)

dev_display (ImagePart)
dev_display (Rectangle)
dev_display (Cross)

*从亮到暗的负向边缘
measure_pos (ImagePart, MeasureHandle, 1, 30, 'negative', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 6, 0.78)

dev_display (ImagePart)
dev_display (Rectangle)
dev_display (Cross)
close_measure (MeasureHandle)

2:measure_pairs ( Image :: MeasureHandle , Sigma . Threshold , Transition . Select : RowEdgeFirst , ColumnEdgeFirst . AmplitudeFirst , RowEdgeSecond . ColumnEdgeSecond . AmplitudeSecond . IntraDistance , InterDistance )功能:提取测量区域内垂直于矩形或者扇环的边缘对(只适用于直边缘,不适用于从曲面对象中提取边缘)。
 Sigma :进行高斯平滑的方差值,0.4≤ Sigma ≤100.
Threshold :边缘的最小幅值,即只有轮廓线一阶导数绝对值大于该参数时,边缘才会被选中,1≤ Threshold ≤255。
Transition :边缘灰度值过渡类型。
Slect :选择返回的边缘点,如果 Select 设置为" all ",则返回所有边缘对:如果设置为" first ",则只返回第一个提取的边缘对;若设置为" last ",则只返回最后一个边缘对。
RowEdgeFirst 、 ColumnEdgeFirst :边缘对中第一个边缘的中心行、列坐标。
AmplitudeFirst :边缘对中第一个边缘的过渡幅值,即第一个边缘的一阶导数值(带符号)。
RowEdgeSecond 、 ColumnEdgeSecond :边缘对中第二个边缘的中心行、列坐标。
AmplitudeSecond :边缘对中第二个边缘的过渡幅值,即第二个边缘的一阶导数值(带符号)。
IntraDistance :一组边缘对内两个边缘之间的距离(亚像素)。
InterDistance :连续边缘对之间的距离(亚像素)。
        对于参数 Transition ,如果 Transition =" positive ",则在 RowEdgeFirst 和 ColumnEdgeFirst 中将返回沿矩形长轴方向的由暗到亮过渡的边缘点,在 RowEdgeSecond 和 ColumnEdgeSecond 中将返回由明到暗的边缘点;如果 Transition =" negative ",则相反;如果 Transition =" all ",则RowEdgeFirst 和 ColumnEdgeFirst 定义为首先检测到的边缘,即根据测量对象的定位,返回"亮暗亮"的边缘对或"暗亮暗"的边缘对。对于有多个相同过渡的连续边缘时,如果把第一个边缘用作边缘对的元素,则会导致不能选择足够高的 Threshold 来抑制相同过渡的连续边缘,这种情况下可以使用第二种找边缘对模式,仅选择一系列连续的上升沿和下降沿中的相应最强边沿。通过将"_ strongest "附加到用于转换的上述任何模式中(例如 negative _ strongest )来选择该模式。

dev_display (ImagePart)
draw_rectangle2 (WindowHandle, Row1, Column1, Phi1, Length11, Length21)
gen_rectangle2_contour_xld (Rectangle1, Row1, Column1, Phi1, Length11, Length21)
get_image_size (ImagePart, Width1, Height1)
gen_measure_rectangle2 (Row1, Column1, Phi1, Length11, Length21, Width1, Height1, 'nearest_neighbor', MeasureHandle1)
measure_pairs (ImagePart, MeasureHandle1, 1, 30, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
dev_set_color (Colors[0])
gen_cross_contour_xld (Cross1, RowEdgeFirst[0], ColumnEdgeFirst[0], 6, Phi1)
dev_set_color (Colors[1])
gen_cross_contour_xld (Cross1, RowEdgeFirst[1], ColumnEdgeFirst[1], 6, Phi1)
dev_set_color (Colors[2])
gen_cross_contour_xld (Cross2, RowEdgeSecond[0], ColumnEdgeSecond[0], 6, Phi1)
dev_set_color (Colors[3])
gen_cross_contour_xld (Cross2, RowEdgeSecond[1], ColumnEdgeSecond[1], 6, Phi1)
 

 dev_display (ImagePart)
 dev_display (Rectangle1)
*获取第一组边缘对
 measure_pairs (ImagePart, MeasureHandle1, 1, 30, 'all', 'first', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
dev_set_color (Colors[0])
gen_cross_contour_xld (Cross1, RowEdgeFirst, ColumnEdgeFirst, 6, Phi1)
 dev_set_color (Colors[1])
gen_cross_contour_xld (Cross2, RowEdgeSecond, ColumnEdgeSecond, 6, Phi1)

 dev_display (ImagePart)
 dev_display (Rectangle1)
*获取最后一组
 measure_pairs (ImagePart, MeasureHandle1, 1, 30, 'all', 'last', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
dev_set_color (Colors[0])
gen_cross_contour_xld (Cross1, RowEdgeFirst, ColumnEdgeFirst, 6, Phi1)
 dev_set_color (Colors[1])
gen_cross_contour_xld (Cross2, RowEdgeSecond, ColumnEdgeSecond, 6, Phi1)

 dev_display (ImagePart)
  dev_display (Rectangle1)
*获取明亮区域对
 measure_pairs (ImagePart, MeasureHandle1, 1, 30, 'positive', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
dev_set_color (Colors[0])
gen_cross_contour_xld (Cross1, RowEdgeFirst, ColumnEdgeFirst, 6, Phi1)
 dev_set_color (Colors[1])
gen_cross_contour_xld (Cross2, RowEdgeSecond, ColumnEdgeSecond, 6, Phi1)

 dev_display (ImagePart)
  dev_display (Rectangle1)
*获取暗场区域对
 measure_pairs (ImagePart, MeasureHandle1, 1, 30, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
dev_set_color (Colors[0])
gen_cross_contour_xld (Cross1, RowEdgeFirst[0], ColumnEdgeFirst[0], 6, Phi1)
dev_set_color (Colors[1])
gen_cross_contour_xld (Cross1, RowEdgeFirst[1], ColumnEdgeFirst[1], 6, Phi1)
dev_set_color (Colors[2])
gen_cross_contour_xld (Cross2, RowEdgeSecond[0], ColumnEdgeSecond[0], 6, Phi1)
dev_set_color (Colors[3])
gen_cross_contour_xld (Cross2, RowEdgeSecond[1], ColumnEdgeSecond[1], 6, Phi1)
close_measure (MeasureHandle1)

3: measure _ thresh ( Image :: MeasureHandle , Sigma , Threshold , Select : RowThresh , ColumnThresh , Distance )
功能:提取测量区域内轮廓线上具有指定灰度值的点(只适用于直边缘,不适用于从曲会面对象中提取边缘)。
Threshold :阈值,即指定的灰度值。
Select :要返回的点," first "指返回第一个点," last "指最后一个点," first _ last "指第一个和最后一个点,‘all’指所有的点
 RowThresh , ColumnThresh 提取点的行列坐标
 Distance 两连续点之间的距离

dev_display (ImagePart)

draw_rectangle2 (WindowHandle, Row2, Column2, Phi2, Length12, Length22)
gen_rectangle2_contour_xld (Rectangle2, Row2, Column2, Phi2, Length12, Length22)
get_image_size (ImagePart, Width2, Height2)
gen_measure_rectangle2 (Row2, Column2, Phi2, Length12, Length22, Width2, Height2, 'nearest_neighbor', MeasureHandle2)

measure_thresh (ImagePart, MeasureHandle2, 0.3, 230, 'all', RowThresh, ColumnThresh, Distance2)
 tuple_length (RowThresh, Length)
 for Index := 1 to Length by 1
     dev_set_color (Colors[Index])
     gen_cross_contour_xld (Cross3, RowThresh[Index-1], ColumnThresh[Index-1], 6, Phi1)
 endfor
close_measure (MeasureHandle2)

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务