一. 首先,平滑灰度值轮廓,确定一阶导数和二阶导数。
measure_projection — 提取一个垂直于矩形或环形圆弧的灰度值轮廓。 create_funct_1d_array — 根据y值序列创建一个函数。 smooth_funct_1d_gauss — 用高斯函数平滑等距一维函数。 derivate_funct_1d — 计算一个函数的导数(一阶/二阶)。
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
四. 效果:
参考:halcon例程中的measure_caliper(测量卡尺的节距线之间的距离)