Halcon 一维测量的导数找边

首先,平滑灰度值轮廓,确定一阶导数和二阶导数。
measure_projection — 提取一个垂直于矩形或环形圆弧的灰度值轮廓。
create_funct_1d_array — 根据y值序列创建一个函数。
smooth_funct_1d_gauss — 用高斯函数平滑等距一维函数。
derivate_funct_1d — 计算一个函数的导数(一阶/二阶)。

 

gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
measure_projection (Image, MeasureHandle, GrayValues)  //根据测量框得到一个测量的轮廓线图

 

 


Sigma := 0.3
create_funct_1d_array (GrayValues, Function) //根据灰度轮廓线创建1D函数
smooth_funct_1d_gauss (Function, Sigma, SmoothedFunction)//对轮廓线平滑
derivate_funct_1d (SmoothedFunction, 'first', FirstDerivative)//求一阶数导数
derivate_funct_1d (SmoothedFunction, 'second', SecondDerivative)//求二阶数导数



确定一阶导数过零点的位置,即,(平滑的)灰度值轮廓有最小值和最大值的位置。
zero_crossings_funct_1d — 计算函数的过零。
zero_crossings_funct_1d (FirstDerivative, ZeroCrossings) //根据一阶数导数的过零点值就是极大值或者极小值(这个点就是边缘点)
选择最小值的位置。(即二阶导数为正的位置)其中平滑的灰度值轮廓具有高曲率,即,其中二阶导数的绝对值较大。这个标准确保只选择突出的线。
MinimumMagnitudeOfSecondDerivative := 8
PositionOfSalientLine := []
for i := 0 to |ZeroCrossings| - 1 by 1
get_y_value_funct_1d (SecondDerivative, ZeroCrossings[i], 'constant', Y) 
if (Y > MinimumMagnitudeOfSecondDerivative) 
PositionOfSalientLine := [PositionOfSalientLine,ZeroCrossings[i]]
endif
endfor

找到灰度值变化较大的位置,即线条的位置,即可将线条绘制出来。

posted @ 2021-12-14 10:41  zyl2  阅读(1542)  评论(0编辑  收藏  举报