Trasformazione Radon per Java

Potete leggere la teoria di questa trasformazione a questo link di Wikipedia.

Descrizione

Ho sentito per la prima volta il nome di questa trasformazione mentre leggevo l'articolo che ho acquistato da IEEE per ottenere una griglia di scacchiera per la programmazione di una funzione nell'applicazione ChessPdfBrowser.

Articolo IEEE .


Questa è una libreria con la mia implementazione di quella trasformazione per Java.


Il codice della libreria è condiviso anche su GitHub. Link a GitHub .

Descrizione del codice

Poiché l'elaborazione richiede molto tempo, la libreria fornisce un executor che restituisce un futuro, per evitare di bloccare l'esecuzione del chiamante mentre l'elaborazione è in corso.

I calcoli paralleli sono facilmente supportati per l'utilizzo di più thread.


La classe RadonTransformCalculator calcola i valori di trasformazione e li memorizza in un array bidimensionale.


Dopo l'elaborazione, i valori di trasformazione possono essere analizzati utilizzando gli indici array per accedervi.

Questi indici possono essere facilmente tradotti in un elemento (Rho, Theta) (, ) chiamando la funzione sull'oggetto risultato, che è di tipo RadonTransformResult.


È anche possibile ottenere i valori massimi N, dando la possibilità di scartare i duplicati (diversi (, ) che sono molto vicini) attraverso una tolleranza, e un filtro può anche essere applicato contemporaneamente su (, ) per scartare in anticipo quelli che non soddisfano le nostre condizioni.

Ad esempio, se stai cercando linee quasi orizzontali o verticali, e c'è una diagonale con un valore molto alto, allora quel valore potrebbe essere scartato.

Finestre

Trasformazione Radon per Java (2026)

Scarica

Esempi

image
image

Un esempio è incluso nel file zip contenente il codice della libreria, che spiegheremo di seguito.

Questo esempio mira ad ottenere i lati della piazza che definisce la scacchiera nell'immagine di destinazione.

L'immagine di input per il calcolo della trasformazione Radon è un rilevamento del bordo (tipo Canny) dell'immagine di destinazione.


La trasformazione viene calcolata per questa immagine di tipo Canny, e quindi si ottengono le quattro linee principali.

Questo si ottiene chiamando la funzione per ottenere i valori più alti della trasformazione, passandola quattro come il numero di elementi da cercare.

Inoltre, una tolleranza appropriata di (, ) viene passata anche per scartare i duplicati e un filtro per scartare i valori che non sono quasi orizzontali o verticali.


Nell'esempio, queste quattro linee che definiscono i lati della scacchiera sono ottenute con successo con questi strumenti.

Con la libreria, le intersezioni di queste linee possono essere calcolate, ottenendo così i vertici.

Viene anche invocato un selezionatore di vertici in modo che quando le linee vengono disegnate in sequenza, non si verifichi l'effetto "bowtie".


Questo ordine di vertice viene eseguito iterando attraverso le permutazioni dell'ordine di vertice fino a trovare il primo che soddisfa il criterio di idoneità.

Il criterio scelto è che i vertici in quell'ordine definiscano un poligono convesso (come il quadrato che vogliamo rilevare).

Per fare questo, è necessario verificare che la rotazione dei vertici sia sempre nella stessa direzione (in senso orario o antiorario).

Per ottenere la direzione di rotazione di tre vertici consecutivi, è sufficiente calcolare il segno del prodotto incrociato dei due vettori definiti da questi tre vertici.

Pertanto, la condizione necessaria e sufficiente per i vertici al fine di definire un poligono convesso è che tutti i sottoinsiemi ordinati di tre vertici consecutivi (supponendo l'elenco circolare) hanno lo stesso segno nel prodotto incrociato calcolato in questo modo.


Dopo questi calcoli, disegniamo i bordi che collegano i vertici e otteniamo l'immagine finale.

Missione compiuta!


image
image

Scaricamenti