Felzenszwald & Huttenlocher의 논문 에 따르면 1D 제곱 유클리드 거리 변환을위한 C # 코드는 다음과 같습니다 .
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이고 흰색은 값이 크므로 (이미지에서 가능한 최대 제곱 거리보다 크지 만 무한대는 아님) 변환에서 검정 픽셀로부터의 거리를 반환하고 흰색 픽셀은 생략됩니다.
진정한 유클리드 거리 변환을 위해서는 출력 이미지에서 각 픽셀의 제곱근을 취하십시오.