stringtranslate.com

Algoritmo de Ramer-Douglas-Peucker

El algoritmo de Ramer–Douglas–Peucker , también conocido como algoritmo de Douglas–Peucker y algoritmo iterativo de ajuste de punto final , es un algoritmo que diezma una curva compuesta de segmentos de línea a una curva similar con menos puntos. Fue uno de los primeros algoritmos exitosos desarrollados para la generalización cartográfica . Produce la generalización más precisa, pero también requiere más tiempo. [1]

Algoritmo

Simplificación de una curva lineal por partes con el algoritmo de Douglas-Peucker.

La curva inicial es un conjunto ordenado de puntos o líneas y la dimensión de la distancia ε > 0 .

El algoritmo divide la línea recursivamente . Inicialmente, se le dan todos los puntos entre el primer y el último punto. Marca automáticamente el primer y el último punto que se deben conservar. A continuación, encuentra el punto que está más alejado del segmento de línea con el primer y el último punto como puntos finales; este punto siempre está más alejado en la curva del segmento de línea que se aproxima entre los puntos finales. Si el punto está más cerca que ε del segmento de línea, entonces cualquier punto que no esté marcado actualmente para conservar se puede descartar sin que la curva simplificada sea peor que ε .

Si el punto más alejado del segmento de línea es mayor que ε de la aproximación, entonces ese punto debe conservarse. El algoritmo se llama recursivamente a sí mismo con el primer punto y el punto más alejado y luego con el punto más alejado y el último punto, lo que incluye el punto más alejado marcado como conservado.

Cuando se completa la recursión, se puede generar una nueva curva de salida que consta solo de todos los puntos que se han marcado como conservados.

El efecto de variar épsilon en una implementación paramétrica de RDP

Ramer-Douglas-Peucker no paramétrico

La elección de ε suele estar definida por el usuario. Como la mayoría de los métodos de ajuste de líneas, aproximación poligonal o detección de puntos dominantes, se puede hacer no paramétrica utilizando el límite de error debido a la digitalización y cuantificación como condición de terminación. [2]

Pseudocódigo

Suponiendo que la entrada es una matriz basada en uno:

 # fuente: https://karthaus.nl/rdp/ function  DouglasPeucker ( PointList [],  epsilon )  # Encuentra el punto con la distancia máxima  dmax  =  0  index  =  0  end  =  length ( PointList )  for  i  =  2  to  ( end  -  1 )  {  d  =  perpendicularDistance ( PointList [ i ],  Line ( PointList [ 1 ],  PointList [ end ]))  if  ( d  >  dmax )  {  index  =  i  dmax  =  d  }  } ResultList []  =  vacío ; # Si la distancia máxima es mayor que epsilon, simplificar recursivamente  if  ( dmax  >  epsilon )  {  # Llamada recursiva  recResults1 []  =  DouglasPeucker ( PointList [ 1. .. index ],  epsilon )  recResults2 []  =  DouglasPeucker ( PointList [ index ... end ],  epsilon ) # Construye la lista de resultados  ResultList []  =  { recResults1 [ 1. .. length ( recResults1 )  -  1 ],  recResults2 [ 1. .. length ( recResults2 )]}  }  else  {  ResultList []  =  { PointList [ 1 ],  PointList [ end ]}  }  # Devuelve el resultado  return  ResultList []

Solicitud

El algoritmo se utiliza para el procesamiento de gráficos vectoriales y generalización cartográfica . Se reconoce como el que ofrece las mejores representaciones perceptuales de las líneas originales. Pero podría producirse una autointersección si la aproximación aceptada no es lo suficientemente fina, lo que llevó al desarrollo de algoritmos variantes. [3]

El algoritmo se utiliza ampliamente en robótica [4] para realizar la simplificación y eliminación de ruido de los datos de rango adquiridos por un escáner de rango giratorio ; en este campo se lo conoce como algoritmo de división y fusión y se atribuye a Duda y Hart . [5]

Complejidad

El tiempo de ejecución de este algoritmo cuando se ejecuta en una polilínea que consta de n – 1 segmentos y n vértices está dado por la recurrencia T ( n ) = T ( i + 1) + T ( ni ) + O ( n ) donde i = 1, 2,..., n − 2 es el valor de indexen el pseudocódigo. En el peor de los casos, i = 1 o i = n − 2 en cada invocación recursiva produce un tiempo de ejecución de O ( n 2 ) . En el mejor caso, i = norte/2 o yo = n ± 1/2 en cada invocación recursiva se obtiene un tiempo de ejecución de O ( n log n ) .

Utilizando estructuras de datos de envoltura convexa (totalmente o semi) dinámicas , la simplificación realizada por el algoritmo se puede lograr en tiempo O ( n log n ) . [6]

Dadas condiciones específicas relacionadas con la métrica de delimitación, es posible disminuir la complejidad computacional a un rango entre O ( n ) y O ( 2n ) mediante la aplicación de un método iterativo. [7]

El tiempo de ejecución para la generalización del modelo de elevación digital utilizando la variante tridimensional del algoritmo es O ( n 3 ) , pero se han desarrollado técnicas para reducir el tiempo de ejecución para datos más grandes en la práctica. [8]

Algoritmos similares

Comparación con el algoritmo de Visvalingam-Whyatt

Los algoritmos alternativos para la simplificación de líneas incluyen:

Véase también

Lectura adicional

Referencias

  1. ^ Shi, Wenzhong; Cheung, ChuiKwan (2006). "Evaluación del rendimiento de algoritmos de simplificación de líneas para generalización de vectores". The Cartographic Journal . 43 (1): 27–44. doi :10.1179/000870406x93490.
  2. ^ Prasad, Dilip K.; Leung, Maylor KH; Quek, Chai; Cho, Siu-Yeung (2012). "Un nuevo marco para hacer que los métodos de detección de puntos dominantes sean no paramétricos". Image and Vision Computing . 30 (11): 843–859. doi :10.1016/j.imavis.2012.06.010.
  3. ^ Wu, Shin-Ting; Marquez, Mercedes (2003). "Un algoritmo Douglas-Peucker sin autointersección". 16.° Simposio Brasileño sobre Procesamiento de Imágenes y Gráficos por Computadora (SIBGRAPI 2003) . Sao Carlos, Brasil: IEEE. pp. 60–66. CiteSeerX 10.1.1.73.5773 . doi :10.1109/SIBGRA.2003.1240992. ISBN .  978-0-7695-2032-2. Número de identificación del sujeto  10163908.
  4. ^ Nguyen, Viet; Gächter, Stefan; Martinelli, Agostino; Tomatis, Nicola; Siegwart, Roland (2007). "Una comparación de algoritmos de extracción de línea utilizando datos de rango 2D para robótica móvil en interiores" (PDF) . Robots autónomos . 23 (2): 97–111. doi :10.1007/s10514-007-9034-y. hdl : 20.500.11850/9089 . S2CID  35663952.
  5. ^ Duda, Richard O .; Hart, Peter E. (1973). Clasificación de patrones y análisis de escenas . Nueva York: Wiley. ISBN 0-471-22361-1.
  6. ^ Hershberger, John; Snoeyink, Jack (1992). Aceleración del algoritmo de simplificación de línea Douglas-Peucker (PDF) (informe técnico).
  7. ^ "ramer_douglas_peucker_funneling.py". Síntesis .
  8. ^ Fei, Lifan; He, Jin (2009). "Un algoritmo tridimensional de Douglas-Peucker y su aplicación a la generalización automatizada de DEM". Revista Internacional de Ciencias de la Información Geográfica . 23 (6): 703–718. doi :10.1080/13658810701703001.

Enlaces externos