นี่คือรหัส C # สำหรับ 1D ยืดระยะทางยุคลิดเปลี่ยนไปตามกระดาษ Felzenszwald & Huttenlocher ของ :
private static void DistanceTransform(double[] dataInput, ref double[] dataOutput)
{
int n = dataInput.Length;
int k = 0;
int[] v = new int[n];
double[] z = new double[n + 1];
v[0] = 0;
z[0] = Double.NegativeInfinity;
z[1] = Double.PositiveInfinity;
double s;
for (int q = 1; q < n; q++)
{
while (true)
{
s = (((dataInput[q] + q * q) - (dataInput[v[k]] + v[k] * v[k])) / (2.0 * q - 2.0 * v[k]));
if (s <= z[k])
{
k--;
}
else
{
break;
}
}
k++;
v[k] = q;
z[k] = s;
z[k + 1] = Double.PositiveInfinity;
}
k = 0;
for (int q = 0; q < n; q++)
{
while (z[k + 1] < q)
{
k++;
}
dataOutput[q] = ((q - v[k]) * (q - v[k]) + dataInput[v[k]]);
}
}
สามารถใช้สิ่งนี้ได้อย่างง่ายดายสำหรับภาพไบนารีและโทนสีเทาโดยนำไปใช้ก่อนในคอลัมน์ภาพแล้วแถว (หรือในทางกลับกันแน่นอน)
การแปลงร่างเร็วมากจริงๆ
นี่คือภาพต้นฉบับและภาพออก:
พิกเซลสีดำมีค่า 0 และสีขาวมีค่าขนาดใหญ่บางส่วน (จะต้องมีขนาดใหญ่กว่าระยะทางยกกำลังสองที่ใหญ่ที่สุดเท่าที่จะเป็นไปได้ในภาพ แต่ไม่ใช่อินฟินิตี้) เพื่อให้การแปลงเปลี่ยน
เพื่อให้ได้การแปลงระยะทางแบบยุคลิดอย่างแท้จริงเพียงนำสแควร์รูทของแต่ละพิกเซลออกจากภาพที่ส่งออก