Transformada de Radon per a Java

Pots llegir la teoria d'aquesta transformada a aquest enllaç a la wikipedia.

Descripció

Vaig sentir per primera vegada el nom d'aquesta transformada en llegir l'article que vaig comprar a l'IEEE amb l'objectiu d'obtenir la reixeta d'un tauler d'escacs per a programar una funció de l'aplicació ChessPdfBrowser. Article de l'IEEE.


Aquesta és una llibreria amb la meva implementació d'aquesta transformada per a Java.


El codi de la llibreria també està compartit a GitHub Enllaç a GitHub.

Descripció del codi

Com que el processament és costós en temps, la llibreria ofereix un executor que torna un Future, per a evitar bloquejar l'excecució del que invoca mentres dura el processament.

És possible configurar fàcilment parel.lelisme per al càlcul mitjançant l'ús de multiples fils.


A la classe RadonTransformCalculator es calculen els valors de la transformada y es guarden a un array bidimensional.


Després del processament, es poden analitzar els valors de la transformació, utilitzant els índex de l'array per a accedir als valors

Aquests índex poden traduir-se fàcilment a un element (Rho, Theta) (ρ, θ) mitjançant la invocació a una funció de l'objecte resultat, que és de tipus RadonTransformResult.


També s'ofereix la possibilitat d'obtenir els N valors màxims, donant l'opció de descartar duplicats (diferents (ρ, θ) que són molt propers) assignant una tolerància, i també es pot aplicar a l'hora un filtre a (ρ, θ) per a descartar prèviament els que no compleixin amb les nostres condicions.

Per example, si estàs buscant línies gairebé horitzontals o verticals, i hi ha una diagonal amb un valor molt alt, doncs es podría descartar aquest valor.

Pantalles

Transformada de Radon per a Java (2026)

Descarregar

Exemples

image
image

Al zip amb el codi de la llibreria s'adjunta un exemple que explicarem a continuació.

En aquest exemple, es tracta d'obtenir els costats del quadrat que defineix el tauler d'escacs a la imatge objectiu.

La imatge d'entrada al càlcul de la transformada de Radon és una detecció de vores (tipus Canny) de la imatge objectiu.


Es calcula la transformada per a aquesta imatge tipus Canny, i després s'obtenen les quatre línies principals.

Això s'aconsegueix invocant a la funció per a obtenir els valors més grans de la transformada, passant-li quatre com a número d'elemets buscats

A més, també se li passa una tolerància adient de (ρ, θ) per a descartar duplicats, i un filtre per a descartar valors de θ que no siguin gairebé horitzontals o verticals.


A l'exemple s'aconsegueix obtenir amb èxit aquestes quatre línies que defineixen els costats del tauler amb aquestes eines.

Amb la llibreria també es poden calcular les interseccions d'aquestes línies, obtenint així els vèrtex.

Addicionalment s'aplica un ordenador de vèrtex, per a que al pintar les línies de manera correlativa no es produeixi l'efecte corbata.


Aquesta ordenació de vèrtex es fa recorrent les permutacions de l'ordenació d'aquests vèrtex, fins a trobar la primera que compleixi amb el criteri d'idoneïtat.

El criteri escollit, és que els vèrtex en aquest ordre defineixin un polígon convex (com és el quedrat que volem detectar).

Per a això s'ha de comprovar que el gir dels vèrtex és sempre en el mateix sentit (horari o antihorari).

Per a obtenir el sentit del gir de tres vèrtex consecutius, val amb calcular el signe del producte vectorial dels dos vectors definits per aquests tres vèrtex.

Llavors, la condició necessària i suficient per a que els vèrtex en aquest ordre defineixin un polígon convex és que tots el subconjuntos ordenats de tres vèrtex consecutius (suposant la llista circular), tinguin el mateix signe al producte vectorial calculat d'aquesta manera.


Després d'aquests càlculs, pintem les línies que uneixen els vértex, i obtenim l'última imatge.

Missió complerta!


image
image

Descàrregues