El artículo presenta los cuatro algoritmos de detección de bucle más comunes.
Los dos primeros, a saber, el algoritmo para trazar cuadrados y trazar los alrededores de Moore, son fáciles de implementar y, por lo tanto, a menudo se usan para determinar el contorno de un patrón dado. Desafortunadamente, ambos algoritmos tienen varias debilidades, lo que hace que sea
imposible detectar el contorno de una gran clase de patrones debido a su tipo especial de adyacencia.
Estos algoritmos ignorarán todos los
"agujeros" en el patrón. Por ejemplo, si tenemos un patrón similar al que se muestra en la
Figura 1 , entonces el circuito detectado por los algoritmos será similar al que se muestra en la
Figura 2 (el contorno se indica mediante píxeles azules). En algunas áreas de aplicación, esto es bastante aceptable, pero en otras áreas, por ejemplo, en el reconocimiento de caracteres, se requiere la detección de las partes internas de un patrón para encontrar todos los espacios que distinguen un carácter específico. (La
Figura 3 muestra el esquema "completo" del patrón).
Por lo tanto, para obtener un contorno completo, primero es necesario usar el algoritmo de
"búsqueda de agujeros" que determina los agujeros en un patrón dado, y luego aplicar el algoritmo de detección de contorno a cada agujero.
¿Qué es la conectividad?
En imágenes digitales con valores binarios, un píxel puede tener uno de los siguientes valores: 1: cuando forma parte del patrón o 0: cuando forma parte del fondo, es decir, sin gradación de gris. (Asumiremos que los píxeles con un valor de 1 son negros y con un valor de 0 son blancos).
Para identificar
objetos en un patrón digital, necesitamos encontrar grupos de píxeles negros que estén "conectados" entre sí. En otras palabras, los
objetos en un patrón digital dado son los
componentes conectados de este patrón.
En el caso general, un
componente conectado es un conjunto de píxeles negros
P , de modo que para cada par de píxeles
p i y
p j en
P hay una secuencia de píxeles
p i , ..., p j tal que:
a) todos los píxeles en la secuencia están en el conjunto
P , es decir son negros y
b) cada 2 píxeles
en la secuencia uno
al lado del otro son "vecinos".
Surge una pregunta importante: ¿
cuándo podemos decir que 2 píxeles son "vecinos"? Dado que usamos píxeles cuadrados, la respuesta a la pregunta anterior no es trivial por la siguiente razón: en la
teselación cuadrada, los píxeles tienen un borde común o un vértice, o no tienen nada en común. Cada píxel tiene 8 píxeles en común con él; tales píxeles forman el "vecindario de Moore" de ese píxel. ¿Deberíamos considerar que los píxeles "vecinos" tienen un solo vértice común? ¿O para ser considerados "vecinos", dos píxeles deben tener un borde común?
Entonces, hay dos tipos de conectividad, a saber: 4-conectividad y 8-conectividad.
4 conexiones
¿Cuándo podemos decir que un conjunto dado de píxeles negros está
4-conectado? Primero, debe definir el concepto de un
vecino de 4 (también llamado
vecino directo ):
Definición de 4 vecinos : un píxel
Q es un
4 vecino de un píxel
P dado si
Q y
P tienen un borde común. Los 4 vecinos del píxel
P (designado como
P2, P4, P6 y
P8 ) se muestran en la
Figura 2 a continuación.
Definición de un componente conectado a 4 : el conjunto de píxeles negros
P es un
componente conectado a 4 si para cada par de píxeles
p i y
p j en
P hay una secuencia de píxeles
p i , ..., p j tal que:
a) todos los píxeles en la secuencia están en el conjunto
P , es decir son negros y
b) cada dos píxeles
adyacentes en la secuencia son
4 vecinosEjemplos de patrones 4 conectados
Los siguientes diagramas muestran ejemplos de patrones conectados a 4:
8 conexiones
¿Cuándo puedo decir que un conjunto dado de píxeles negros está
conectado a 8 ? Primero, necesitamos definir el concepto de un
vecino de 8 (también llamado
vecino indirecto ):
Definición de 8 vecinos : un píxel
Q es un
8 vecino (o simplemente un
vecino ) de un píxel
P dado si
Q y
P tienen un borde o vértice común. Los 8 vecinos de un píxel
P conforman el vecindario de Moore de este píxel.
Definición de un componente conectado a 8 : el conjunto de píxeles negros
P es un
componente conectado a 8 (o simplemente un
componente conectado ) si para cada par de píxeles
p i y
p j en
P hay una secuencia de píxeles
p i , ..., p j tal que :
a) todos los píxeles en la secuencia están en el conjunto
P , es decir son negros y
b) cada dos píxeles
adyacentes en esta secuencia son
8 vecinosNota : todos los patrones conectados a 4 están conectados a 8, es decir Los patrones de 4 conectados son un subconjunto de los muchos patrones de 8 conectados. Por otro lado, un patrón conectado a 8 puede no estar conectado a 4.
Ejemplo de patrón de 8 enlaces
El siguiente diagrama muestra un patrón que está conectado a 8 pero no a 4:
Un ejemplo de un patrón no conectado a 8:
El siguiente diagrama muestra un ejemplo de un patrón que no está conectado a 8, es decir compuesto de más de un componente conectado (el diagrama muestra tres componentes conectados):
Algoritmo de traza cuadrada
Idea
La idea detrás del algoritmo de trazado cuadrado es muy simple; Esto puede atribuirse al hecho de que el algoritmo fue uno de los primeros intentos de detectar el contorno de un patrón binario.
Para entender cómo funciona, necesitas un poco de imaginación ...
Supongamos que tenemos un patrón digital, por ejemplo, un grupo de píxeles negros sobre un fondo de píxeles blancos, es decir, en la cuadrícula; encontrar el píxel negro y declararlo como nuestro píxel "
inicial ". (Encontrar el píxel "
inicial " se puede implementar de muchas maneras diferentes; comenzaremos desde la esquina inferior izquierda de la cuadrícula, escanearemos cada columna de píxeles de abajo hacia arriba, desde la columna más a la izquierda hasta la derecha, hasta encontrar un píxel negro. Lo declararemos "
inicial " ".)
Ahora imagine que es una mariquita parada en el píxel
inicial , como se muestra en la
Figura 1 a continuación. Para obtener el esquema de un patrón, debe hacer lo siguiente:
, , ,
, , ,
.
Los píxeles negros que rodeaste serán el contorno del patrón.
Un aspecto importante del algoritmo de traza cuadrada es el "sentido de dirección". Los giros hacia la izquierda y hacia la derecha se realizan en relación con la ubicación actual, que depende de cómo llegó al píxel actual. Por lo tanto, para realizar los movimientos correctos, debe seguir su dirección.
Algoritmo
La siguiente es una descripción formal del algoritmo de rastreo cuadrado:
Entrada:
teselación cuadrada,
T , que contiene el componente conectado
P de las células negras.
Salida: fila
B (b 1 , b 2 , ..., b k ) de píxeles de borde, es decir contorno
Inicio
- Defina B como un conjunto vacío.
- Escanee las celdas T de abajo hacia arriba y de izquierda a derecha hasta encontrar un píxel negro s de P.
- Inserte s en B.
- Convierta el píxel actual p en el píxel inicial s .
- Gire a la izquierda, es decir ir al píxel vecino a la izquierda de p .
- Actualización p , es decir se convierte en el píxel actual.
- Mientras p no es igual a s , ejecute
Si el píxel actual p es negro
- inserte p en B y gire a la izquierda (vaya al píxel vecino a la izquierda de p ).
- Actualización p , es decir se convierte en el píxel actual.
de lo contrario
- gire a la derecha (vaya al siguiente píxel a la derecha de p ).
- Actualización p , es decir se convierte en el píxel actual.
Fin del ciclo "Bye"
El final
Nota: los conceptos de "izquierda" y "derecha" deben considerarse no con respecto a la página o al lector, sino con respecto a la dirección de entrada en el píxel "actual" durante el escaneo.
Demostración
La siguiente es una demostración animada de cómo el algoritmo de rastreo cuadrado detecta el contorno de un patrón. No olvides que la mariquita se mueve en píxeles; observe cómo cambia su dirección al girar a la izquierda y a la derecha. Los giros hacia la izquierda y hacia la derecha se realizan en relación con la dirección actual en un píxel, es decir Orientación de mariquita.
Análisis
Resulta que las capacidades del algoritmo de rastreo cuadrado son muy limitadas. No puede detectar los contornos de una gran familia de patrones que a menudo surgen en aplicaciones del mundo real.
Esto se debe principalmente al hecho de que las rotaciones izquierda y derecha no tienen en cuenta los píxeles ubicados "a lo largo de
diagonales "del píxel actual.
Veamos los diferentes patrones con diferente conectividad y veamos por qué falla el algoritmo de rastreo cuadrado. Además, estudiaremos formas de mejorar las capacidades del algoritmo y hacerlo funcionar incluso con patrones que tienen un tipo especial de conectividad.
Criterio de parada
Una de las debilidades del algoritmo es la elección del criterio de detención. En otras palabras, ¿cuándo deja de ejecutarse un algoritmo?
En la descripción original del algoritmo de rastreo cuadrado, la condición de finalización es alcanzar el píxel
inicial por segunda vez. Resulta que si el algoritmo depende de tal criterio, entonces no podrá detectar los contornos de una gran familia de patrones.
La siguiente es una demostración animada que explica cómo el algoritmo no puede detectar el contorno exacto del patrón debido a la selección de un criterio de detención incorrecto:
Como puede ver, mejorar el criterio de detención puede ser un buen comienzo para mejorar el rendimiento general del algoritmo. Hay dos alternativas efectivas para un criterio de apagado existente:
a) Pare solo visitando el píxel
inicial n veces, donde n es al menos 2, O
b) Deténgase después de golpear el píxel de
inicio por segunda vez, tal como lo golpeamos inicialmente.
Este criterio fue propuesto por
Jacob Eliosoff , por lo que lo llamaremos el
criterio para detener a Jacob .
Cambiar el criterio de detención en el caso general mejora la efectividad del algoritmo de rastreo cuadrado, pero no supera otras debilidades que tiene en el caso de patrones con tipos especiales de conectividad.
El algoritmo de rastreo cuadrado no puede detectar el contorno de una familia de patrones con una conectividad de 8 que NO tiene una conectividad de 4.
La siguiente es una demostración animada de cómo el algoritmo de rastreo cuadrado (con el criterio de detención de Jacob) no puede detectar el esquema correcto de un patrón con conectividad 8 sin conectividad 4:
¿Es este algoritmo completamente inútil?
Si lee el análisis anterior, probablemente piense que el algoritmo de rastreo cuadrado no puede detectar los contornos de la mayoría de los patrones. Pero resulta que que existe una familia especial de patrones en los que el algoritmo de rastreo cuadrado detecta completamente la ruta.
Sea
P el conjunto de píxeles negros con conectividad 4 en la cuadrícula. Deje que los píxeles blancos de la cuadrícula, es decir los píxeles de fondo
W también tienen una conectividad de 4. Resulta que bajo tales condiciones del patrón y su fondo, se puede demostrar que el algoritmo de traza cuadrada (con el criterio de detención de Jacob) siempre se ocupará con éxito de la determinación del contorno.
A continuación se muestra la prueba de que, en el caso de que tanto el patrón como los píxeles de fondo estén conectados, el algoritmo de traza cuadrada determinará correctamente el contorno cuando se utilice el criterio de detención de Jacob.
Prueba
Dado : el patrón
P es tal que todos los píxeles del patrón (es decir, negro) y los píxeles de fondo (es decir, blanco) W tienen una conectividad de 4.
Primera observaciónDado que el conjunto de píxeles blancos W tiene una conectividad de 4, esto significa que no puede haber "
agujeros " en el patrón (en términos informales, "
agujeros " nos referimos a grupos de píxeles blancos completamente rodeados por píxeles negros del patrón).
La presencia de cualquier "
agujero " en el patrón conducirá a la separación del grupo de píxeles blancos de los píxeles blancos restantes; sin embargo, muchos píxeles blancos pierden conectividad 4.
La Figura 2 y la
Figura 3 a continuación muestran dos tipos de "
agujeros " que pueden ocurrir en un patrón con conectividad 4:
Segunda observaciónCualquiera de los dos píxeles negros de un patrón DEBE tener un lado común.
Supongamos que dos píxeles negros tienen solo un vértice común. Luego, para satisfacer la propiedad de 4-conectividad del patrón, debe haber una ruta que conecte estos dos píxeles para que cada dos píxeles adyacentes en esta ruta tengan una conectividad de 4. Pero esto nos dará un patrón similar a la
Figura 3 . En otras palabras, esto dará como resultado una separación de píxeles blancos.
La Figura 4 a continuación muestra un patrón típico que satisface la suposición de que los píxeles en el patrón y el fondo están conectados a 4, es decir no tienen "
agujeros ", y cada dos píxeles negros tienen un lado común:
Es útil representar tales patrones de la siguiente manera:
Primero consideramos los píxeles del límite, es decir esquema del patrón. Luego, si consideramos que cada píxel límite tiene 4 bordes de unidad de longitud, veremos que algunos de estos bordes son comunes con los píxeles blancos vecinos. Llamaremos a estos bordes bordes
límite .
Tales bordes límite pueden considerarse como bordes de un polígono. En la
foto
5 a continuación, esta idea se demuestra con el ejemplo de un polígono correspondiente al patrón de la
Figura 4 anterior:
Si consideramos todas las "configuraciones" posibles de píxeles límite que pueden ocurrir en dichos patrones, veremos que hay dos casos simples, que se muestran en la
Figura 6 y la
Figura 7 a continuación.
Los píxeles de límite pueden ser múltiplos de estos casos u otros arreglos, es decir los giros y vueltas de estos dos casos. Las costillas límite están marcadas en azul como
E1, E2, E3 y
E4 .
Tercera observaciónEn el caso de los dos casos anteriores, sin importar el píxel inicial que elijamos, y en cualquier dirección en la que
caiga , el algoritmo de traza cuadrada nunca
"retrocederá" (retroceso) , nunca
"atravesará" el borde del límite dos veces ( solo si no traza el borde por segunda vez) y nunca pierde el
borde del límite . ¡Compruébalo!
Aquí hay que aclarar dos conceptos:
a) el algoritmo
"retrocede" , cuando antes de trazar todo el borde vuelve a visitar un píxel ya visitado, y
b) para cada
costilla límite, hay dos formas de
"pasar a través de ella" , a saber, "hacia adentro" y "hacia afuera" (donde "hacia adentro" significa el movimiento hacia adentro del polígono correspondiente, y "hacia afuera" - hacia afuera del polígono).
Además, cuando el algoritmo pasa "hacia adentro" a través de uno de los bordes del límite, pasará "hacia afuera" a través del siguiente borde del límite, es decir el algoritmo de traza cuadrada no debería poder pasar a través de dos bordes consecutivos de la misma manera.
Última observaciónCada patrón tiene un
número par de bordes límite .
Si observa el polígono de la
Figura 5 , puede ver que:
Si queremos comenzar desde el vértice
S marcado en el diagrama y seguir los bordes límite hasta que alcancemos
S nuevamente, entonces notamos que en el proceso cruzamos un número par de bordes límite. Podemos considerar cada borde límite como un "paso" en una dirección separada. Luego, para cada "paso" a la derecha debe haber un "paso" correspondiente a la izquierda, si queremos volver a la posición inicial. Lo mismo se aplica a los "pasos" verticales. Por lo tanto, los "pasos" deben tener pares correspondientes, y esto explica por qué cada uno de estos patrones tendrá un número par de bordes de límite.
Por lo tanto, cuando el algoritmo para trazar cuadrados ingresa por el
borde límite inicial (del píxel inicial) por segunda vez, lo hará en
la misma dirección que la primera vez.
La razón de esto es que, dado que hay dos formas de atravesar el borde límite, y el algoritmo se mueve alternativamente hacia adentro y hacia afuera, y hay un número par de bordes límite, el algoritmo pasará por el borde límite inicial por segunda vez de la misma manera que en el primero
Conclusión
En el caso de un patrón y un fondo 4 conectados, el algoritmo de rastreo cuadrado detectará todo el borde, es decir contorno, patrón y dejará de funcionar después de una sola traza, es decir no lo rastreará nuevamente, porque cuando alcanza el
borde límite inicial por segunda vez, lo ingresará de la misma manera que la primera vez. En consecuencia, el algoritmo de traza cuadrada con el criterio de detención de Jacob determinará correctamente el contador de cualquier patrón, siempre que tanto el patrón como el fondo estén 4 conectados.
Rastreando los alrededores de Moore
Idea
La idea detrás del rastreo de Moore-Neighbour es simple; pero antes de explicarlo, necesitamos explicar un concepto importante:
el vecindario Moore de un píxel.
El barrio de Moore
El vecindario de Moore de un píxel
P es un conjunto de 8 píxeles que tienen un vértice o borde común con ese píxel. Dichos píxeles, a saber,
P1, P2, P3, P4, P5, P6, P7 y P8 , se muestran en la
Figura 1 .
El vecindario de Moore (también llamado
8-vecinos o
vecinos indirectos ) es un concepto importante al que a menudo se hace referencia en la literatura.
Ahora estamos listos para familiarizarnos con la idea subyacente en el rastro de los alrededores de Moore.
Que haya un patrón digital, es decir un grupo de píxeles negros, sobre un fondo de píxeles blancos, es decir en la cuadrícula; encuentre el píxel negro y declare el píxel "
inicial ". (Hay varias formas de encontrar el píxel "
inicial ", pero, como antes, comenzaremos desde la esquina inferior izquierda y escanearemos todas las columnas de píxeles en orden, hasta que encontremos el primer píxel negro, que declararemos "
inicial ").
Ahora, de nuevo, imagine que es una mariquita parada en el píxel
inicial , como se muestra en la
Figura 2 a continuación. Sin pérdida de generalización, detectaremos el contorno moviéndonos alrededor del patrón en el sentido de las agujas del reloj. (No importa qué dirección elijamos, lo principal es usarla constantemente en el algoritmo).
La idea general es esta: cada vez que llegamos al píxel negro
P , volvemos, es decir, al píxel blanco en el que nos encontramos antes. Luego
damos la vuelta al píxel
P en el sentido de las agujas del reloj, visitando cada píxel en su vecindad de Moore, hasta llegar al píxel negro. El algoritmo termina cuando el píxel de inicio alcanza el píxel de inicio por segunda vez.
Esos píxeles negros que visitó el algoritmo serán el contorno del patrón.
Algoritmo
La siguiente es una descripción formal del algoritmo de rastreo de vecindario de Moore:
Entrada:
teselación cuadrada
T que contiene un componente conectado
P de celdas negras.
Salida: fila
B (b 1 , b 2 , ..., b k ) de píxeles límite, es decir contorno
Denote por
M (a) el vecindario de Moore del píxel
a .
Deje que
p sea el píxel del borde actual.
Sea
c el píxel actual en consideración, es decir.
c está en
M (p) .
Inicio
- Defina B como un conjunto vacío.
- De abajo hacia arriba y de izquierda a derecha, escanee las celdas T hasta encontrar un píxel negro s de P.
- Inserte s en B.
- Establecemos el punto s como el punto límite actual p , es decir p = s
- Volvamos, es decir pasemos al píxel desde el que llegamos al s .
- Sea c el siguiente píxel en sentido horario en M (p) .
- Mientras c no es igual a s , ejecute
- si c es negro
- Insertar c en B
- establecemos p = c
- volver atrás (mover el píxel actual c al píxel desde el que llegamos a p )
de lo contrario
- mueve el píxel actual c al siguiente píxel en sentido horario en M (p)
Fin del ciclo Bye
El final
Demostración
La siguiente es una demostración animada de cómo la traza de vecindario de Moore realiza la detección de patrones. (Decidimos trazar el contorno en sentido horario).
Análisis
La principal debilidad en el rastreo de los alrededores de Moore radica en la elección de los criterios de detención.
En la descripción original del algoritmo para rastrear los alrededores de Moore, el criterio de detención es golpear el píxel
inicial por segunda vez. Similar al algoritmo de trazado cuadrado, resulta que el rastreo de los alrededores de Moore usando este criterio no puede detectar los contornos de una gran familia de patrones.
La siguiente es una demostración animada que explica por qué el algoritmo no puede encontrar el esquema exacto del patrón debido a la selección de un criterio de detención incorrecto:
Como puede ver, mejorar el criterio de detención puede ser un buen comienzo para mejorar el rendimiento general de la traza. Hay dos alternativas efectivas para el criterio de apagado, similar al criterio de apagado de Jacob.
El uso del criterio de Jacob mejora significativamente la efectividad del trazado de los alrededores de Moore, lo que lo convierte en el mejor algoritmo para determinar el contorno de cualquier patrón, independientemente de su conectividad.
La razón de esto es principalmente porque el algoritmo verifica todo el vecindario de Moore del píxel límite para buscar el siguiente píxel límite. A diferencia del algoritmo de traza cuadrada, que solo gira a izquierda y derecha y pierde los píxeles "en diagonal", la traza de vecindario de Moore siempre podrá detectar el límite exterior de cualquier componente conectado. La razón es esta: para cualquier patrón de
8 conectados (o simplemente
conectados ), el
siguiente píxel del borde se encuentra dentro del vecindario de Moore del píxel del borde actual. Debido a que el rastreo de vecindad de Moore verifica cada uno de los píxeles en la vecindad de Moore del píxel límite actual, debe detectar el siguiente píxel límite.
Cuando el trazado del vecindario de Moore alcanza el píxel inicial por segunda vez de la misma manera que lo hizo la primera vez, esto significa que se ha detectado un
contorno externo completo del patrón, y si el algoritmo no se detiene, detectará nuevamente el mismo contorno.
Exploración radial
El algoritmo de barrido radial es un algoritmo de detección de contornos discutido en algunos libros. A pesar del nombre complejo, la idea subyacente es muy simple. De hecho, resulta que el algoritmo de barrido radial
es idéntico al rastro del entorno de Moore. Uno puede preguntar: "¿Por qué lo mencionamos en absoluto?"
El rastreo de los alrededores de Moore busca en las proximidades de Moore el píxel límite actual en una determinada dirección (elegimos la dirección de las agujas del reloj) hasta que encuentre un píxel negro. Luego declara ese píxel como el píxel límite actual y continúa.
El algoritmo de exploración radial hace lo mismo. Por otro lado, proporciona una forma interesante de encontrar el siguiente píxel negro en el vecindario de Moore de un píxel límite determinado.
El método se basa en la siguiente idea:
cada vez que encontremos un nuevo píxel límite, conviértalo en el píxel actual
P y dibuje
un segmento de línea imaginario que conecte
P con el píxel límite
anterior . Luego
giramos el segmento con respecto a
P en el sentido de las agujas del reloj hasta que se encuentra con un píxel negro en el vecindario de Moore del píxel
P. La rotación de la línea es idéntica a la comprobación de cada píxel en las proximidades de Moore
P.Creamos una demostración animada de cómo funciona el algoritmo de exploración radial y cómo se ve el trazado de los alrededores de Moore.¿Y cuándo se detiene el algoritmo de barrido radial?Vamos a explicar el comportamiento del algoritmo usando los siguientes criterios de detención ...Criterio de parada 1
Deje que el algoritmo de exploración radial se complete cuando visite el píxel inicial por segunda vez.A continuación se muestra una demostración animada, a partir de la cual está claro por qué el criterio de interrupción se cambiará correctamente.También vale la pena mencionar que cuando se utiliza este criterio de detención en ambos algoritmos, la efectividad del algoritmo de exploración radial es idéntica al rastreo del entorno de Moore.En el algoritmo de rastreo cuadrado y en el rastreo de vecindario de Moore, encontramos que el uso del criterio de detención de Jacob mejora significativamente el rendimiento de ambos algoritmos.El criterio de detención de Jacob requiere que el algoritmo deje de ejecutarse cuando visita el píxel inicial por segunda vez en la misma dirección que la primera vez.Desafortunadamente, no podemos usar el criterio de detención de Jacob en el algoritmo de barrido radial. La razón es que el algoritmo de exploración radial no define el conceptoLa "dirección" en la que golpea el píxel límite . En otras palabras, no está clara la "dirección" en la que el algoritmo cayó en el píxel límite (y su definición no es trivial).Por lo tanto, debemos proponer otro criterio de detención, que no dependa de la dirección de golpear un píxel determinado, que puede mejorar la efectividad del algoritmo de exploración radial ...Criterio de parada 2
Suponga que cada vez que el algoritmo detecta un nuevo píxel límite P i , se inserta en una serie de píxeles límite: P 1 , P 2 , P 3 , ..., P i ; y declarado como el píxel del borde actual. ( P 1 consideraremos el píxel inicial ). Esto significa que conocemos el píxel de borde anterior P i-1 de cada píxel de borde actual P i . (En cuanto al píxel inicial , asumiremos que P 0es un píxel imaginario que no es equivalente a ninguno de los píxeles en la cuadrícula que se enfrenta al píxel inicial en la fila de píxeles de límite).Según los supuestos anteriores, podemos determinar el criterio de detención de la siguiente manera:El algoritmo detiene la ejecución cuando:a) el píxel límite actual P i se ha encontrado previamente como un píxel P j (donde j <i ) en una serie de píxeles límite, yb) P i- 1 = P j-1 .En otras palabras, el algoritmo completa la ejecución cuando visita el píxel límite P en el segundoveces si el píxel límite antes de P (en la fila de píxeles límite) por segunda vez es el mismo píxel que estaba antes de P cuando se visitó P por primera vez.Si se cumple la condición del criterio de detención y el algoritmo no se apaga, entonces el algoritmo de exploración radial continuará detectando el mismo límite por segunda vez.El rendimiento del algoritmo de barrido radial con este criterio de detención es similar al rendimiento del rastreo del vecindario de Moore con el criterio de detención de Jacob.Algoritmo Theo Pavlidis
Idea
Este algoritmo es uno de los últimos algoritmos de detección de bucles propuestos por Theo Pavlidis . Lo citó en su libro de 1982 Algorithms for Graphics and Image Processing (capítulo 7, sección 5). No es tan simple como el algoritmo para trazar cuadrados o trazar los alrededores de Moore, pero no es tan complicado (esto es típico para la mayoría de los algoritmos de detección de bordes).No explicaremos este algoritmo de la misma manera que se hizo en su libro. Nuestro enfoque es más fácil de entender y da una idea de la idea general subyacente al algoritmo.Sin pérdida de generalización, decidimos dar la vuelta al bucle en el sentido de las agujas del reloj para que coincida con el orden de todos los demás algoritmos presentados en el artículo. Por otro lado, Pavlidis eligió la dirección en sentido antihorario. Esto no afectará el rendimiento del algoritmo. La única diferencia es la dirección relativa de los movimientos que haremos cuando rodeamos el contorno.Ahora pasemos a la idea ...Digamos que tenemos un patrón digital, es decir un grupo de píxeles negros sobre un fondo de píxeles blancos, es decir en la cuadrícula; encuentre el píxel negro y declare el píxel " inicial ". Puede buscar el píxel " inicial " de varias maneras, por ejemplo, como se describió anteriormente.Para encontrar la inicialpíxeles para usar este método es opcional. En su lugar, elegiremos un píxel inicial que satisfaga las siguientes restricciones impuestas por el algoritmo Pavlidis para seleccionar un píxel inicial:Una limitación importante de la dirección en la que ingresamos el píxel inicial.De hecho, puede elegir CUALQUIER píxel de borde negro como píxel inicial bajo esta condición: si inicialmente se para. en él, el píxel vecino izquierdo NO es negro. En otras palabras, debe ingresar el píxel inicial en una dirección tal que el píxel vecino izquierdo sea blanco (la "izquierda" aquí se toma en relación con la dirección en la que ingresamos el píxel inicial ).Ahora imagina que eres una mariquita paradapíxel inicial , como se muestra en la Figura 1 a continuación. Durante la ejecución del algoritmo, solo nos interesarán tres píxeles delante de usted, es decir, P1, P2 y P3 se muestran en la Figura 1 . (Designaremos P2 como el píxel delante de usted, P1 es el píxel a la izquierda de P2 y P3 es el píxel a la derecha de P2 ).Al igual que con el algoritmo de traza cuadrada, lo más importante en el algoritmo de Pavlidis es el "sentido de la dirección". Los giros hacia la izquierda y hacia la derecha son relativos a la posición actual, que depende de cómo ingresó el píxel actual. Por lo tanto, para realizar los movimientos correctos, es importante realizar un seguimiento de su orientación actual. Pero no importa cómo se encuentre, los píxeles P1, P2 y P3 se determinan como se describe anteriormente.Con esta información, estamos listos para explicar el algoritmo ...Cada vez que se encuentre en el píxel límite actual (que es primero el píxel inicial ), hacemos lo siguiente:Primero , verifique el píxel P1 . Si P1 es negro, declare P1el píxel límite actual y avance un paso hacia adelante, y luego dé un paso hacia la izquierda para estar en P1 (el orden de los movimientos es muy importante).En la Figura 2 a continuación ilustra este caso. El camino para llegar a P1 se muestra en azul.Y solo si P1 es blanco, procedemos a verificar P2 ...Si P2 es negro, declare P2 como el píxel límite actual y avance un paso para estar en P2 . Este caso se muestra en la Figura 3 a continuación. La ruta que debe seguir en P2 se muestra en azul.Solo si P1 y P2 son blancos, vaya a verificar P3 ...Si P3 es negro, declare P3 como el píxel del borde actual y muévase un paso hacia la derecha y luego un paso hacia la izquierda , como se muestra en la Figura 4 a continuación.Eso es todo! Tres reglas simples para tres casos simples. Como puede ver, es importante hacer un seguimiento de su dirección en las curvas, ya que todos los movimientos se realizan en relación con la orientación actual. Pero parece que olvidamos algo? ¿Qué pasa si los tres píxeles son blancos frente a nosotros? Luego giramos (de pie en el píxel límite actual) 90 grados en el sentido de las agujas del reloj para ver un nuevo conjunto de tres píxeles frente a nosotros. Luego hacemos la misma verificación para estos nuevos píxeles. Todavía puede tener una pregunta: ¿qué pasa si todos estos tres píxeles son blancos? Luego, nuevamente giramos 90 grados en el sentido de las agujas del reloj, de pie en el mismo píxel. Antes de verificar todo el vecindario del píxel de Moore, puede rotar tres veces (cada 90 grados en el sentido de las agujas del reloj).Si giramos tres veces sin encontrar píxeles negros, significa que estamos parados en un píxel aislado , no conectado a ningún otro píxel negro. Es por eso que el algoritmo le permite rotar tres veces y luego completa su ejecución.Otro aspecto: ¿ cuándo completa la ejecución el algoritmo?El algoritmo termina en dos casos:a) como se mencionó anteriormente. el algoritmo le permite rotar tres veces (90 grados en el sentido de las agujas del reloj cada vez), después de completar la ejecución y declarar el píxel aislado Ob) cuando el píxel límite actual es el píxel inicial , el algoritmo completa la ejecución al "declarar" que detectó el contorno del patrón.Algoritmo
La siguiente es una descripción formal del algoritmo de Pavlidis:Entrada: teselación cuadrada T que contiene un componente conectado P de células negras.Salida: fila B (b 1 , b 2 , ..., b k ) de píxeles límite, es decir contornoDefiniciones:- Denote por p el píxel límite actual, es decir El píxel en el que nos encontramos.
- Defina P1, P2 y P3 de la siguiente manera: (vea también la Figura 1 arriba)
- P2 es el píxel frente a usted, adyacente al que está parado, es decir, con pixel p .
- P1 — , P2 .
- P3 — , P2 .
- «» .
Inicio
- B .
- T , s P (. , )
- s B .
- p s .
- :
P1
P2
P3
90 , p
- terminar el programa y declarar p un píxel aislado
de lo contrario
- girar 90 grados en el sentido de las agujas del reloj, de pie en el píxel actual p
Hasta ahora p = s (Fin del ciclo de repetición)
El finalDemostración
La siguiente es una demostración animada de cómo el algoritmo Pavlidis detecta el contorno de un patrón dado. No olvides que caminamos en píxeles; observe cómo cambia la orientación al girar a la izquierda o derecha. Para explicar el algoritmo con el mayor detalle posible, incluimos todos los casos posibles en él.Análisis
Si cree que el algoritmo de Pavlidis es ideal para detectar esquemas de patrones, entonces debería cambiar de opinión ...Este algoritmo es realmente un poco más complicado que, por ejemplo, rastrear los alrededores de Moore, en el que no hay casos especiales que requieran un procesamiento separado, pero no podrá determinar los contornos de un gran Una familia de patrones que tiene un cierto tipo de conectividad.El algoritmo funciona muy bien en patrones 4 conectados. Su problema ocurre al rastrear algunos patrones conectados a 8 que no están conectados a 4. La siguiente es una demostración animada de cómo el algoritmo Pavlidis no puede detectar el contorno correcto de un patrón conectado a 8 (no uno conectado a 4): omite la mayor parte del borde.Hay dos formas simples de modificar un algoritmo para mejorar significativamente su rendimiento.a) Reemplace el criterio de detenciónEn lugar de completar el algoritmo cuando visita el píxel de inicio por segunda vez, puede finalizarlo cuando visita el píxel de inicio por tercera o incluso cuarta vez. Esto mejorará el rendimiento general del algoritmo.Ob) Llegue a la fuente del problema, es decir, antes de seleccionar el píxel inicial.Existe una limitación importante con respecto a la dirección en la que se realiza la entrada al píxel inicial. Esencialmente, debe ingresar el píxel de inicio para que cuando se pare sobre él, el píxel a su izquierda sea blanco. La razón para introducir esta restricción es la siguiente: ya que siempre miramos los tres píxeles que tenemos delante enen cierto orden , en algunos patrones omitiremos el píxel límite que se encuentra directamente a la izquierda del píxel inicial.Nos arriesgamos a perder no solo el píxel vecino izquierdo del píxel inicial, sino también el píxel directamente debajo de él (como se demostró en el análisis). Además, en algunos patrones, se omitirá un píxel correspondiente al píxel R en la Figura 5 a continuación. Por lo tanto, suponemos que el píxel inicial debe golpearse en una dirección tal que los píxeles correspondientes a los píxeles L, W y R que se muestran en la Figura 5 a continuación sean blancos.En este caso, los patrones como el que se muestra en la demostración se detectarán correctamente y la eficacia del algoritmo de Pavlidis mejorará significativamente. Por otro lado, encontrar un píxel inicial que satisfaga estos requisitos puede ser un desafío, y en muchos casos será imposible encontrar dicho píxel. En este caso, debe utilizar una forma alternativa para mejorar el algoritmo de Pavlidis, es decir, la finalización del algoritmo después de visitar el punto de partida por tercera vez.