首先,平滑灰度值轮廓,确定一阶导数和二阶导数。
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
找到灰度值变化较大的位置,即线条的位置,即可将线条绘制出来。