首先,平滑灰度值輪廓,確定一階導數和二階導數。
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
找到灰度值變化較大的位置,即線條的位置,即可將線條繪制出來。