immagine filtro passa-banda di FFT applicato. (Algoritmo di filtro passa-banda come ImageJ)

StackOverflow https://stackoverflow.com/questions/2579444

Domanda

C'è una funzione di bene che ho bisogno, che viene realizzato nel programma Java: ImageJ. Ho bisogno di capire l'algoritmo utilizzato lì. La funzione ha diversi parametri: link testuale

E prima di utilizzare FFT converte un'immagine per uno speciale: Il filtro passa-banda utilizza un algoritmo speciale per ridurre l'effetto dei bordi (prima della trasformata di Fourier, l'immagine viene estesa in dimensioni allegando copie specchiate di parti dell'immagine all'esterno dell'immagine originale, quindi non si verificano salti ai bordi)

Mi puoi dire di più su questo speciale trasformare? immagine speculare in realtà piastrelle.

Le scrivo su C ++ e desiderio di riscrivere quella parte del programma C ++.

Edit1: Ho bisogno di capire come si fa che piastrelle operazione di immagine speculare, può essere che è uno speciale. In realtà in un primo momento si trasforma un'immagine in una nuova immagine di dimensioni, così per le mie immagini sarà: conversione da 600x480 a 1024x1024 immagine dimensioni. Come le piastrelle si usa qui?

EDIT2: Inoltre è difficile capire questa descrizione della funzione tileMirrored:

put ImageProcessor (ROI) in un nuovo ImageProcessor di dimensioni larghezza x altezza y alla posizione (x, y). L'immagine viene specchiata lungo i margini per avvolgere attorno evitare effetti della FFT. Cosa si intende per "... dalle dimensioni larghezza x altezza y alla posizione (x, y)."?

Edit3: Ho implementato che filtro passa-banda, e dà gli stessi risultati del programma originale. Ma, lo stesso algoritmo in programma originale (anche nel mio programma) è molto lenta Voglio usare questo filtro non una volta nel mio programma, ma si calcola circa 0,5 a 2 secondi ogni chiamata (a seconda del valore del parametro). Viene utilizzato un FHT trasformare (non FFT), è più rapidamente di FFT? Credo che il filtro stesso non è ottimizzato, vedere implementazione funzione filterLargeSmall:

È stato utile?

Soluzione

Non so esattamente come funziona la funzione, ma ecco l'algoritmo di base per una funzione simile:

  1. Determinare la più piccola potenza di due (chiamare newSize) che è maggiore della più grande delle due dimensioni dell'immagine (chiamarli XSize e YSize).

  2. Creare una nuova immagine di piazza del formato newSize da newSize e copiare il contenuto dell'immagine al centro della nuova immagine (es. In alto a sinistra dell'immagine dovrebbe iniziare a (newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)).

  3. Completare i rimanenti pixel come segue, per ciascun pixel in (x, y):

    • se x < (newSize / 2 - xSize / 2), copiare il pixel a colonna e la riga (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x y.
    • se y < (newSize / 2 - ySize / 2), copiare il pixel alla riga (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y e colonna x.
    • se sia di quanto sopra sono vere, copiare il pixel in colonna (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x, fila (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y.
    • se x > (newSize / 2 + xSize / 2), copiare il pixel a colonna e la riga (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x y.
    • se y > (newSize / 2 + ySize / 2), copiare il pixel alla riga (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y e colonna x.
    • se sia di quanto sopra sono vere, copiare il pixel a colonna e la riga (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y.

Probabilmente ci sono le librerie che renderanno questo più facile (es. Flipping e copiare i dati delle immagini), ma non sono familiarità con C ++, e questo dovrebbe essere abbastanza facile da codice da soli finché le prestazioni non è un problema enorme. Fare attenzione di arrotondamento problemi per le immagini con dimensioni dispari: assicurarsi che siano coerenti

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top