Felzenszwald & Huttenlocher'ın kağıdına göre 1D kare öklid mesafe dönüşümü için bir C # kodu :
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]]);
}
}
Bu, ikili ve gri tonlamalı görüntüler için önce resim sütunlarına ve sonra satırlara (veya tam tersi) uygulanarak kolayca kullanılabilir.
Dönüşüm gerçekten çok hızlı.
İşte kaynak ve çıktı görüntüleri:
Siyah pikseller 0 değerine sahiptir ve beyazlar büyük bir değere sahiptir (görüntülerdeki mümkün olan en büyük kare mesafeden daha büyük olmalıdır ancak sonsuz değildir), böylece dönüşüm siyah piksellere olan mesafeyi döndürür ve beyaz olanlar dışlanır.
Gerçek öklid mesafe dönüşümü elde etmek için, çıktı görüntüsünden her pikselin bir karekökü alın.