Transformada de Radon para Java

Puedes leer la teoría de esta transformada en este enlace a la wikipedia.

Descripción

Oí por primera vez el nombre de esta transformada al leer el artículo que compré en IEEE con el objetivo de obtener la rejilla de un tablero de ajedrez para programar una función de la aplicación ChessPdfBrowser Artículo de IEEE.


Esta es una librería con mi implementación de esa transformada para Java.


El código de la librería también está compartido en GitHub Enlace a GitHub.

Descripción del código

Como el procesamiento es costoso en tiempo, la librería ofrece un ejecutor que devuelve un Future, para evitar bloquear la ejecución del llamante mientras dura el procesamiento.

Es posible configurar fácilmente el paralelismo para el cálculo de la transformada con el uso de multiples hilos.


En la clase RadonTransformCalculator se calculan los valores de la transformada y se almacenan en un array bidimensional.


Tras el procesamiento, se pueden analizar los valores de la transformación, usando los índices del array para acceder a los valores.

Esos índices pueden traducirse fácilmente a un elemento (Rho, Theta) (ρ, θ) mediante la llamada a la función del objeto resultado que es de tipo RadonTransformResult.


También se ofrece la posibilidad de obtener los N valores máximos, dando la opción de descartar duplicados (distintos (ρ, θ) que son muy cercanos) a través de una tolerancia, y también se puede aplicar al mismo tiempo un filtrado sobre (ρ, θ) para descartar previamente los que no cumplan con nuestras condiciones.

Por ejemplo, si estás buscando líneas casi horizontales o verticales, y hay una diagonal con un valor muy alto, pues se podría descartar ese valor.

Pantallas

Transformada de Radon para Java (2026)

Descargar

Ejemplos

image
image

En el zip con el código de la librería se adjunta un ejemplo que explicaremos a continuación.

En este ejemplo, se trata de obtener los lados del cuadrado que define el tablero de ajedrez en la imagen objetivo.

La imagen de entrada al cálculo de la transformada de Radon es una detección de bordes (tipo Canny) de la imagen objetivo.


Se calcula la transformada para esa imagen tipo Canny, y luego se obtienen las cuatro líneas principales.

Eso se consigue llamando a la función para obtener los valores más altos de la transformada, pasándole cuatro como número de elementos buscados.

Además, también se le pasa una tolerancia adecuada de (ρ, θ) para descartar duplicados, y un filtro para descartar valores de θ que no sean casi horizontales o verticales.


En el ejemplo se logra obtener con éxito esas cuatro líneas que definen los lados del tablero con estas herramientas.

Con la librería se pueden calcular las intersecciones de esas líneas, obteniendo así los vértices.

Además se invoca a un ordenador de vértices, para que al pintar las líneas de manera correlativa no se produzca el efecto pajarita.


Esa ordenación de vértices se hace recorriendo las permutaciones del orden de esos vértices, hasta encontrar la primera que cumpla con el criterio de idoneidad.

El criterio elegido, es que los vértices en ese orden definan un polígono convexo (como lo es el cuadrado que queremos detectar).

Para ello hay que comprobar que el giro de los vértices es siempre en el mismo sentido (horario o antihorario).

Para obtener el sentido del giro de tres vértices consecutivos, basta con calcular el signo del producto vectorial de los dos vectores definidos por esos tres vértices.

Entonces, la condición necesaria y suficiente para que los vértices en ese orden definan un polígono convexo es que todos los subconjuntos ordenados de tres vértices consecutivos (suponiendo la lista circular), tengan el mismo signo en el producto vectorial calculado de esa manera.


Tras estos cálculos, pintamos las aristas que unen los vértices, y obtenemos la última imagen.

Misión cumplida!


image
image

Descargas