2011-09-15 17 views
22

Estoy buscando el algoritmo más rápido disponible para la transformación de distancia.Algoritmo más rápido disponible para la transformación de distancia

De acuerdo con este sitio http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htm, describe: "La transformación de distancia se puede calcular de manera mucho más eficiente utilizando algoritmos inteligentes en solo dos pasadas (por ejemplo, Rosenfeld y Pfaltz 1968)".

Buscando alrededor, me encontré: "Rosenfeld, A y Pfaltz, J L. 1968. Funciones de distancia en Imágenes Digitales Reconocimiento de Patrones, 1, 33-61.".

¿Pero creo que deberíamos tener un algoritmo mejor y más rápido que el de 1968? De hecho, no pude encontrar la fuente desde 1968, por lo que cualquier ayuda es muy apreciada.

Respuesta

7

Hay toneladas de trabajo más reciente en computar las funciones de distancia.

Por cierto, usted realmente desea utilizar estos en lugar de la obra de Rosenfeld, específicamente cuando se desea calcular las distancias en la presencia de obstáculos.

10

La biblioteca OpenCV utiliza para su función aproximada cv::distanceTransform un algoritmo que pasa la imagen de arriba a la izquierda a la parte inferior derecha y atrás. El algoritmo se describe en el documento "Transformaciones de distancia en imágenes digitales" de Gunilla Borgefors (Comput. Vision Graph. Image Process., 34 3, pp 344-371, 1986).

El algoritmo calcula la distancia mediante una combinación de algunos saltos básicos (horizontal, vertical, diagonal y el movimiento del caballero). Cada salto incurre en costos. La siguiente tabla muestra los costos de los diferentes saltos.

+------+------+------+------+------+ 
| 2.8 |2.1969| 2 |2.1969| 2.8 | 
+------+------+------+------+------+ 
|2.1969| 1.4 | 1 | 1.4 |2.1969| 
+------+------+------+------+------+ 
| 2 | 1 | 0 | 1 | 2 | 
+------+------+------+------+------+ 
|2.1969| 1.4 | 1 | 1.4 |2.1969| 
+------+------+------+------+------+ 
| 2.8 |2.1969| 2 |2.1969| 2.8 | 
+------+------+------+------+------+ 

La distancia de un píxel a otro es la suma de los costes de los saltos necesarios. La siguiente imagen muestra la distancia desde las 0 celdas a cada celda. Las flechas están mostrando el camino a algunas celdas. Los números coloreados reflejan la distancia exacta (euclidiana).

enter image description here

El algoritmo funciona así: Tras la máscara

+------+------+------+ 
| 0 | 1 | 2 | 
+------+------+------+ 
| 1 | 1.4 |2.1969| 
+------+------+------+ 
| 2 |2.1969| 2.8 | 
+------+------+------+ 

se mueve desde la parte superior izquierda de la imagen de abajo a la derecha. Durante este pase, las celdas que se encuentran dentro de los límites de la máscara conservan su valor (si se conoce y es más pequeño) o obtienen el valor calculado sumando el valor de máscara y el valor de celda (si se conoce) de la celda debajo de la máscara-0-celda. Después de eso, se realiza un segundo pase desde la parte inferior derecha a la parte superior izquierda (con una máscara volteada vertical y horizontal). Después del segundo pase, se calculan las distancias.

+0

Este método es considerablemente más lento que las técnicas modernas (la más notable es la de A. Meijster). –

12

Este artículo revisa la distancia exacta conocida transformar algoritmos:

"2D distancia euclídea transformar algoritmos: un estudio comparativo"
http://liu.diva-portal.org/smash/get/diva2:23335/FULLTEXT01

La transformada de distancia exacta más rápido es de Meijster:

" Un algoritmo general para computar transformaciones de distancia en tiempo lineal. "
http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

El diseño del algoritmo es especialmente adecuado para el cálculo en paralelo.

Esto se implementa en mi biblioteca de código abierto que trata de emular "Estilo de capa" de Photoshop

https://github.com/vinniefalco/LayerEffects

3

Felzenszwalb y Huttenlocher presenta un algoritmo elegante que es exacta y O (N) en su documento " Transformaciones de distancia de funciones muestreadas "disponible here. Explotan el hecho de que el cuadrado de la transformada de distancia euclidiana es una parábola que se puede evaluar independientemente en cada dimensión.

El código fuente es también available.

1

He implementado el método O (N) de Meijster citado en la respuesta de Vinnie. "Algoritmo general para computar transformaciones de distancia en tiempo lineal". http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

Lo bueno es que se puede paralelizar muy eficientemente, calculando cada línea de píxeles de forma independiente (es un método separable). Al funcionar con 12 núcleos de CPU, el campo de distancia de una imagen volumétrica de 1000^3 se computa en unos pocos segundos.

La solución de Felzenszwalb y Huttenlocher "Transformaciones a distancia de funciones muestreadas" que data de 2012 (citada en la respuesta de bw1024) se basa exactamente en la misma idea. Curiosamente, no citan el trabajo de Meijster hecho 12 años antes.

Cuestiones relacionadas