¿Cómo hacer el deshuesado de una imagen transformada de Hough?

9

Estoy trabajando con el código que se encuentra en Rosetta Code para crear una transformación Hough. Ahora quiero encontrar todas las líneas en una imagen. Para hacerlo, necesito los valores ρ y θ de cada uno de los picos en el espacio de Hough. Una salida de muestra para un pentágono se ve así:

Espacio hough

¿Cómo puedo encontrar una sola coordenada [θ, ρ] para cada uno de los 'puntos calientes' visibles en el espacio de Hough?

Waspinator
fuente

Respuestas:

9

Está encontrando las coordenadas de los picos y luego usa el eje para escalarlas en coordenadas [θ, ρ].

Dependiendo de cuán ruidosos sean los datos, cuántos picos falsos espere y cuánto tiempo tenga, hay algunas maneras de hacerlo. Lo más fácil es elegir un nivel que sea un pico real, cortar todos los datos debajo de eso y luego hacer un centro de gravedad en cada pico para obtener su centro.

También puede erosionar / marcar la imagen hasta que cada pico sea un solo píxel.

Martin Beckett
fuente
1
+1 para una respuesta precisa. ¿Cómo define / calcula center of gravity?
Dipan Mehta
Para mayor precisión, encuentre el máximo, luego ajuste un paraboloide a ese punto y sus puntos vecinos, luego encuentre el pico del paraboloide, que generalmente estará entre píxeles.
endolito
2
@endolith: generalmente con las transformaciones de Hough, la precisión está limitada por la identificación de los bordes en la imagen inicial y la 'discretización' del resultado en el espacio de Hough. Si necesita un resultado más preciso, es normal regresar y rehacer la transformación para un rango más limitado de coordenadas [θ, ρ] para obtener una resolución más alta. Espacio suficiente alrededor de la solución del curso que encontró
Martin Beckett
@DipanMehta: simplemente suma ( valor x de cada píxel) e (y ..) y luego divide entre el ancho X, Y del cuadro que estás buscando, pero mira el comentario al endolito
Martin Beckett
2

3×3

El segundo paso podría ser refinar la posición máxima a una precisión de subpíxel. Esto se puede hacer mediante un ajuste de parábola.

f(x)xpf(x+p)

f(x+p)f(x)+pTf(x)+12pTf(x)+p

El vector de corrección es entonces

p=f(x)1f(x)

Las derivadas se pueden calcular a partir de la imagen de Hough por diferenciación finita .

Tenga en cuenta que es una matriz de Hesse y es un vector 2 (gradiente horizontal y vertical), por lo tanto, también es un vector 2 que especifica un desplazamiento de subpíxeles para obtener posición precisa del maximizador local.2 × 2 f ( x ) pf(x)2×2f(x)p

La ecuación anterior puede ocasionalmente producir desplazamientos de más de 1 píxel. En tal caso, el vecindario maximizador no tiene una forma parabólica y es posible que no desee hacer la corrección o incluso deba soltar el maximizador candidato.

Libor
fuente
0

Hay una muy buena técnica desarrollada a mediados de los 80 por Gerig y Klein. Es un procedimiento de backmapping que analiza el espacio de Hough para identificar el punto más probable asociado con cada punto de borde y luego construye un segundo espacio de Hough donde el mapeo de los puntos de borde a los parámetros es uno a uno en lugar de uno a muchos. Es la primera etapa habitual. No tengo la referencia a mano, pero mire en el documento de revisión seminal Hough de Illingworth y Kittler (¿alrededor de 1987?)

servicial
fuente