Fast Hough Transform ( Fast Hough Transform , abbr . FHT) es una modificación de la transformada de Hough que le permite identificar paramétricamente líneas (así como, con modificaciones adicionales , segmentos y cuadriláteros ) con menos complejidad computacional debido al uso del hecho. de autointersección de las líneas discretas consideradas.
El algoritmo fue propuesto por primera vez por M. L. Brady en 1992, [1] posteriormente fue reinventado varias veces por varios autores. [2] [3]
Deje que se dé una imagen de tamaño . Considere líneas diádicas (líneas rectas de un tipo especial) que consisten en píxeles en la imagen cada una (un píxel por columna).
Sea la intensidad del enésimo píxel perteneciente a la recta diádica dada por los parámetros ; — La media imagen de esta línea diádica.
La imagen de la transformada discreta de Hough se define mediante la siguiente fórmula:
El cálculo directo de todos los valores requiere operaciones: enumeración sobre diferentes valores de los parámetros , enumeración para cada par de valores .
A su vez, el algoritmo FHT, basado en tener en cuenta las intersecciones de los segmentos entre sí, requiere acciones, las operaciones son necesarias para una línea recta (para imágenes cuadradas ). Según el teorema formulado por T. M. Khanipov [4] , es imposible sumar líneas diádicas con una complejidad computacional asintóticamente menor.
El algoritmo se basa en el principio de " divide y vencerás ". El problema es encontrar las sumas de los valores de píxeles a lo largo de los segmentos que conectan los bordes "izquierdo" y "derecho" de la imagen. La imagen se divide por la mitad, en cada parte el problema se resuelve de forma independiente. Para obtener la suma final de cada uno de los segmentos, se suman las respuestas de las mitades "izquierda" y "derecha".
En el algoritmo FHT, los píxeles de líneas arbitrarias se aproximan discretamente mediante líneas diádicas. Los píxeles de la aproximación diádica de una línea recta en la imagen de tamaño se eliminan de la línea recta original en no más de píxeles. [5]
Los segmentos están parametrizados por los centros de los píxeles conectados. Por lo tanto, la división de un segmento en subsegmentos solo constituye aproximadamente el segmento original. El error de aproximación con pasos de recursión es acumulativo, pero no más de píxeles. [5] La discretización del segmento a píxeles construido de esta manera se llama aproximación diádica .
Además , un patrón es un conjunto de píxeles que contienen un elemento en cada vertical de la imagen. La desviación del patrón será el valor y la coordenada será el valor . Un cambio de patrón se llamará un conjunto
pags ↗ ( a , b ) = { ( X i + a , y i + b ) | ( X i , y i ) ∈ pags } {\displaystyle p\narrow (a,b)=\lbrace \left(x_{i}+a,y_{i}+b\right)\ |\ (x_{i},y_{i})\in p \rbrace } Los patrones diádicos generativos de ancho y pendiente se definen recursivamente. Para , el patrón consta de un píxel y para , se expresa en términos de .
Las líneas diádicas ascendentes predominantemente horizontales se obtienen de todos los patrones generativos desplazados verticalmente , construidos con todas las coordenadas posibles en la imagen .
Para un cálculo aproximado de la transformada de Hough, se requiere encontrar las sumas de todas las líneas diádicas en la imagen. En esta suma de líneas, hay puntos cada una. Debido a la transición recursiva, esta suma se reduce a contar por separado las mitades izquierdas, por separado las mitades derechas, lo que nos permite reducir el cálculo al cálculo de sumas sobre puntos cada uno.
Considere las palabras binarias que consisten en los números 0 y 1. El conjunto de palabras diádicas se define recursivamente. se llamará palabra diádica si tiene la forma o , donde es palabra vacía o diádica. Todas las palabras diádicas de longitud no superior a tres: 0, 1, 000, 010, 101, 111.
Para cada palabra diádica , se considera la suma acumulada . Diremos que la secuencia de píxeles es una línea recta diádica que conecta los centros de píxeles y .
Hay exactamente líneas diádicas de longitud . Uno para cada par de y .
El algoritmo FHT está estructurado de la siguiente manera: [6]
El estado inicial de la matriz es la imagen original de tamaño . Luego, el cálculo se lleva a cabo en los niveles -th a su vez, comenzando desde el primero: en el nivel -th, la matriz en el estado actual se divide en grupos de acuerdo con el principio de igualdad de la parte entera de la coordenada del segundo eje después de la división por ; se obtienen submatrices ; unir los adyacentes en pares (sin intersecciones, esto es posible, ya que el tamaño de la matriz es una potencia de dos) y en este par llamamos a la primera submatriz que se encuentra en coordenadas más pequeñas a lo largo de la segunda coordenada en la matriz , y el otro - el segundo; en lugar del primero en cada par, su suma se escribe con el segundo correspondiente, y en lugar del segundo, la suma del primero y el segundo con un desplazamiento cíclico de uno a la izquierda. Por lo tanto, la imagen de Hough de tales líneas se considera tal que para cualquier par de puntos con coordenadas de esta línea, se satisface utilizando la aproximación por líneas diádicas. Para calcular la imagen para el resto de las líneas, basta con girar la imagen y realizar la misma operación, y sumar los resultados.
Las matrices así obtenidas en cada nivel son elementos de la pirámide FHT. Descripción formal de la pirámide FHT : El nivel cero de la pirámide FHT es la imagen original (de tamaño , y la última es la imagen de Hough que contiene sumas a lo largo de líneas rectas diádicas de longitud . Para describir el nivel th de la pirámide , la imagen original se divide en franjas horizontales , donde es el número de franja, Para cada franja, el nivel th de la pirámide FHT almacena sumas de todos los patrones de franja posibles con longitud y parámetros . El número de tales patrones para una franja es , por lo que el nivel th de la pirámide ocupa tanta memoria como la imagen original.
La invariancia de la cantidad de memoria gastada y la capacidad de almacenar cada nivel en una matriz del mismo tamaño que la imagen original, sin pérdida de interpretabilidad, otorga la siguiente propiedad: es posible almacenar la pirámide FHT en forma de matriz con una dimensión mayor que la dimensión de la imagen original (a lo largo de un eje - el número de niveles, ), para el resto - el tamaño de la imagen). [7]
Un ejemplo de implementación en python:
importar numpy como np W = 2 ** 5 H = 2 ** 5 img = np . al azar aleatorio ([ alto , ancho ]) def calc_sums ( img , xmin , xmax ): res = np . ceros ([ W , xmax - xmin ]) if xmax - xmin == 1 : res [:, 0 ] = img [:, xmin ] else : mid = ( xmin + xmax ) // 2 ans1 = calc_sums ( img , xmin , mid ) ans2 = calc_sums ( img , mid , xmax ) for x in range ( W ): for shift in range ( xmax - xmin ): res [ x , shift ] = ans1 [ x , shift // 2 ] + ans2 [ ( x + shift // 2 + shift % 2 ) % W , shift // 2 ] return res res = calc_sums ( img , 0 , W )
El algoritmo está implementado en la biblioteca opencv [8] y se puede utilizar, por ejemplo, para encontrar rápidamente el punto de fuga . [9]
La solución de este problema implica el uso de un algoritmo para el caso bidimensional.
La semiimagen de los planos también será tridimensional (el plano se especifica mediante tres coordenadas del vector perpendicular a él). Sea dado por la parametrización , donde es la coordenada de la intersección del plano con el límite de la imagen en el rayo , es la coordenada del punto de intersección con el límite de la imagen paralelo al rayo en el plano , y es la diferencia entre las coordenadas del segundo y primer punto de intersección del plano con los límites de la imagen. El primer punto está en la intersección de los planos que contienen el límite de la imagen y el plano paralelo a . El segundo punto está en la intersección de los planos que contienen el límite de la imagen, paralelo a y .
Llamaremos a un plano predominantemente perpendicular al eje de coordenadas si la normal a él forma un ángulo menor con este eje que con los otros dos. Consideraremos solo planos que son predominantemente perpendiculares al eje y. Se dividen en 4 tipos de pendientes, como se muestra en la Figura 4. Sin pérdida de generalidad, supondremos que los planos considerados son del tipo I.
La construcción de una imagen de Hough por enumeración de planos tiene una complejidad asintótica (la cantidad de planos multiplicada por la cantidad de operaciones para sumar un plano), donde m, n, k son las dimensiones de la imagen en cada dimensión.
La transformada rápida de Hough en este caso será el siguiente algoritmo:
La complejidad de tal transformación es la suma de la complejidad del primer paso ( ) y la complejidad del segundo paso ( ), que se calculan como el producto del número de planos considerados y el número de operaciones por plano. Total, , en términos de un plano .
La semiimagen de una recta tridimensional será tetradimensional (dos parámetros para cada uno de los dos puntos de la recta). Sea dado por parametrización . son las coordenadas x, y del punto en el plano , son las coordenadas x, y del punto de intersección de la línea con el límite de la imagen paralela al plano .
La construcción de la imagen de Hough por enumeración de líneas tridimensionales tiene una complejidad asintótica (el número de líneas multiplicado por el número de operaciones para sumar una línea), donde m, n, k son las dimensiones de la imagen en cada dimensión.
La transformada rápida de Hough para tal caso se formula de manera similar a la definición para el caso bidimensional. En el caso bidimensional, la posibilidad de desplazamiento era solo a lo largo de un eje, pero ahora el desplazamiento será a lo largo de un eje, a lo largo del segundo eje y a lo largo de dos ejes al mismo tiempo.
Contar patrones de longitud dos requiere (número de grupos de planos sumables) multiplicado por (complejidad de adiciones para cada grupo) operaciones. Contar patrones de longitud 4 requiere operaciones. Longitudes de patrón — , donde se define como , es decir, el número de la longitud de patrón considerada. Sumando los términos (el número de longitudes de patrón posibles para la imagen en cuestión) usando la fórmula para la suma de una progresión geométrica, obtenemos la complejidad del algoritmo y la complejidad en una línea recta . Para , la complejidad será constante.
Combinación de BPH y el principio de los cuatro rusosA pesar de que el número de operaciones por línea es constante para el mismo tamaño de imagen en cada dimensión, para todas las líneas es necesario gastar . Pero si no se necesitan todas las líneas, sino solo una parte de ellas, entonces uno puede precalcular los primeros pasos [10] , almacenarlos en la memoria y luego calcular las sumas solo para aquellas líneas que se necesitan.
Este concepto fue consagrado en el método de cuatro rusos. El método lleva el nombre de los descubridores V. Arlazarov , M. Kronrod, E. Dinits, I. Faradzhev.
En el algoritmo FHT original para líneas tridimensionales, se realiza un cálculo en cada nivel para líneas de cierta longitud. Por otro lado, puede hacer un cálculo previo solo para los primeros pasos y luego calcular para las líneas necesarias.
Para determinar el número óptimo de pasos de precálculo, es necesario resolver la siguiente ecuación ( es el número de líneas que necesita encontrar el algoritmo):
A la izquierda está el número de operaciones para realizar el precálculo. A la derecha está el número de operaciones para encontrar sumas a lo largo de las líneas solicitadas. Sea necesario encontrar todas las rectas, entonces , entonces la solución de la ecuación será , y los lados izquierdo y derecho son iguales , que es menor que sin precálculo. Sin embargo, para reducir el número de operaciones, es necesario pagar con memoria en la misma cantidad que ocupa la imagen de Hough (propiedad de invariancia de la memoria ocupada en cada nivel de conteo por el algoritmo FHT).
El principio de cálculo se basa en el uso de valores no solo del último nivel de la pirámide FHT (es decir, la propia imagen de Hough), sino también de otros niveles de la pirámide FHT.
La tarea se divide en dos subtareas:
Suponemos sin pérdida de generalidad que . Aquí consideraremos solo patrones predominantemente verticales con una inclinación a la derecha, es decir, y . También se utiliza la parametrización y el valor es igual a , donde es el tamaño de la imagen a lo largo del eje .
Deje que la expansión binaria del parámetro de línea recta diádica se vea como Entonces, el patrón se puede escribir de la siguiente manera ( - redondeando al entero más cercano):
calculado a partir de los datos de la tarea. es el número de cambios del patrón considerado en la banda , que también se conoce. Así, solo es necesario restaurar los bits .
Se utiliza un algoritmo codicioso para la recuperación: todos los bits son cero primero. Dado que , por lo tanto, la enumeración se realiza desde un mayor número de turnos a uno menor, desde el nivel hasta el nivel 0. Si , entonces el bit correspondiente a este nivel se establece en 1 y disminuye en . El paso se repite hasta que llega a 0.
El valor del parámetro se calcula mediante . A través de este parámetro, el parámetro se calcula de acuerdo con la siguiente fórmula:
, por lo que la complejidad del algoritmo . [7]
Con referencia a la figura, se puede ver que un segmento arbitrario en una línea recta se calcula encontrando el número mínimo de patrones diádicos que contienen partes desde el comienzo de la línea hasta el final del segmento dado, inclusive, y el número mínimo de patrones que contienen el segmento desde el comienzo de la línea recta hasta el comienzo del segmento dado, excluyendo el primer píxel del segmento original. Es decir, debe encontrar las sumas de dos segmentos con el comienzo en el borde de la imagen y diferentes coordenadas finales.
Para calcular la suma sobre este tipo de segmento de longitud (su expansión binaria ) , donde es la suma sobre el patrón en la -ésima banda del -ésimo nivel de FHT=pirámide para una línea recta con parámetros .
La suma interna no requiere un cálculo completo en cada paso, ya que se obtiene del anterior en tiempo constante. Así, la complejidad del algoritmo es proporcional al número de términos de la suma externa, es decir, es . Dado que el resultado se calcula para dos segmentos de este tipo, la complejidad resultante del algoritmo también es . Además, vale la pena señalar que un píxel puede ser multicanal. [7]
Método 2El segmento puede estar compuesto por el número mínimo de patrones dentro del segmento. Para buscar dichos patrones, debe observar los niveles de la pirámide FHT, comenzando con los últimos y terminando con los primeros. Puede filtrar inmediatamente aquellos patrones que no están incluidos en el segmento. Si se encuentra un patrón que se encuentra completamente dentro del segmento, su suma se incluye en la suma requerida y no se consideran sus divisiones en los siguientes niveles. Este método es computacionalmente más complejo que el primero, ya que requiere la enumeración de todos los patrones que son más de .
Similar a calcular la suma sobre un segmento para calcular la suma sobre un cuadrilátero a partir de los cálculos intermedios de la imagen de Hough para planos, es decir, la pirámide FHT para el caso de planos.
Suponiendo que se conocen los parámetros del plano en el que se encuentra el cuadrilátero dado, la suma deseada se calcula mediante la fórmula de inclusión-exclusión tomando la suma de cuatro rectángulos, uno de los cuales es el vértice de la esquina del plano diádico (nosotros señálelo con la letra , y los segmentos con este vértice con los segmentos de esquina ). Denotemos las coordenadas de los puntos más cercanos y más lejanos de los vértices del cuadrilátero dado por y respectivamente. Las sumas de los segmentos de esquina marcados con vértices en y se toman con un signo más, y las sumas de aquellos con vértices en y se toman con un signo menos.
Para encontrar la suma sobre un segmento angular arbitrario, es necesario dividirlo en segmentos que están presentes en la pirámide FHT. Es necesario considerar expansiones binarias del ancho y alto del segmento. De manera similar al caso unidimensional, el segmento se divide horizontalmente en franjas verticales y verticalmente en no más que franjas horizontales. Su intersección no dará más que los segmentos presentes en una pirámide FPH tridimensional. Así, la complejidad de calcular la suma sobre un segmento arbitrario equivale a operaciones. [7]
Aunque hay algún error en la aproximación de una línea recta por un patrón diádico, los experimentos muestran que este error es lo suficientemente pequeño como para que en la resolución de problemas sea posible reemplazar el algoritmo tradicional de transformada de Hough con el algoritmo FHT. [once]
Al aplicar estimaciones M al problema de regresión lineal , se pueden obtener funciones de base radial . Forman una imagen "continua", que a su vez se muestrea en un histograma 2D.
A continuación, se realiza la convolución de la imagen con un núcleo discretizado correspondiente al estimador M seleccionado. En función de la imagen de Hough recibida, se calcula utilizando FHT. La coordenada del máximo en el espacio de parámetros - y será la estimación M deseada.
La tarea se formula de la siguiente manera: es necesario encontrar un hiperplano que divida la imagen en 2 clases. La imagen se representa como un histograma de imagen normalizado .
es el hiperplano deseado que divide las imágenes en dos clases , es la clase de todos los elementos del histograma.
Estadísticas aditivas usadas ( --ésima coordenada ):
Hay una serie de funcionales adecuados para problemas de separación de conglomerados con diferentes propiedades conocidas a priori, y al mismo tiempo computables en términos de estadística aditiva. Vale la pena mencionar una vez más que estos funcionales generalmente no son convexos y la única forma confiable de encontrar su valor óptimo es la enumeración exhaustiva en la cuadrícula en el espacio de parámetros de las superficies de separación.
Algoritmo ingenuo: hay líneas discretas que se cruzan con el histograma con un tamaño lineal . Para cada uno de ellos se requiere realizar operaciones para calcular los pesos, las matrices de covarianza y, finalmente, los valores de los criterios. Por lo tanto, la complejidad computacional del algoritmo ingenuo son las operaciones. De manera similar, se puede demostrar que para el caso tridimensional, la complejidad computacional del algoritmo será .
En esta etapa, se aplica la suma acumulativa: la suma de los elementos correspondientes de todas las capas de la imagen de entrada con un índice que no exceda se escribe en el elemento de capa con el número de la imagen de salida .
La suma de los valores de píxeles de cualquier línea de la imagen de salida es igual a la suma de la parte de la imagen original que no está debajo de esta línea. Además, la suma a lo largo de cualquier línea recta predominantemente horizontal en la imagen de salida es igual a la suma a lo largo del semiplano superior delimitado por ella en la imagen original. Para una expresión similar de las sumas sobre los semiplanos izquierdos a través de rectas predominantemente verticales, en lugar de la vertical, es necesario realizar la suma acumulativa horizontal de la imagen.
Algoritmo:
Si simplemente sumamos todos los hiperplanos, entonces en el caso bidimensional la complejidad es , en el caso tridimensional . (En -dimensional )
La suma sobre hiperplanos (líneas rectas en 2D, planos en 3D...) se puede realizar mediante FHT. Esto ayuda a reducir la complejidad de a para cada una de las imágenes. Es decir, ahora la complejidad está en el caso bidimensional , en el tridimensional .
Entonces el algoritmo final es:
Complejidad: tiempo , memoria .
En el caso bidimensional con más detalle:
Dificultad final:
En el caso 3D con más detalle:
Dificultad final:
Los siguientes son solo algunos de los problemas que se pueden resolver usando la transformada de Hough.