Cosa significa "frequenza" in un'immagine?


29

Non capisco come siano definite le frequenze in immagini / fotografie. Per quanto ne capisco ora, le alte frequenze sono come cose nitide nelle immagini, come bordi o così, e le basse frequenze sono un po 'l'opposto?

Vorrei anche capire il risultato di trasformazioni discrete di Fourier, come leggere correttamente.

Sarebbe bello se qualcuno potesse spiegarmi quanto segue:

  1. Quali sono le frequenze nelle immagini e come sono definite?

  2. Come leggi il risultato di una trasformazione di Fourier discreta?



grazie, l'ho già letto, mi ha aiutato, ma sono ancora un po 'all'oscuro.
Jakob Abfalter,

Risposte:


44

Risponderò solo alla prima domanda: quali sono le frequenze nelle immagini?

La trasformata di Fourier è una tecnica matematica in cui le stesse informazioni dell'immagine sono rappresentate non per ciascun pixel separatamente ma piuttosto per ciascuna frequenza. Pensaci in questo modo. Il mare ha onde alcune delle quali si muovono molto lentamente (come le maree), altre sono di medie dimensioni e altre ancora piccole come le increspature formate da una raffica. Puoi pensarli come tre onde separate ma in ogni punto della superficie del mare e in un momento nel tempo, ottieni solo un'altezza d'acqua.

Lo stesso vale per le immagini. Puoi pensare all'immagine composta da varie onde o frequenze. Per creare la tua immagine, inizia con il colore medio (in realtà è più semplice pensare alle immagini in scala di grigi). Quindi aggiungi onde di diverse lunghezze d'onda e forza per costruire lentamente i dettagli nella foto.

Immagine sorgente:

Immagine sorgente

Prima frequenza (media):

Media

La seconda frequenza lungo la dimensione verticale è un'onda che inizia da zero nella parte inferiore dell'immagine, in aumento, tornando a zero lungo l'orizzonte centrato e scendendo sotto lo zero per diventare infine zero nella parte superiore dell'immagine. (Ho descritto una serie di Fourier senza sfasamento, ma l'analogia vale ancora.)

Qui puoi vedere la seconda frequenza lungo l'orizzontale e la verticale. Nota che puoi capire dove sarà la montagna (scura) e dove saranno il cielo e il lago (più chiari).

Seconda frequenza:

Primo componente

Ogni onda o frequenza aggiuntiva porta più increspature e, come tale, più dettagli. Per ottenere immagini diverse, è possibile modificare l'altezza / ampiezza dell'onda e il punto iniziale dell'onda, chiamato anche Fase.

Terza frequenza:

Terzo

È interessante notare che la quantità di informazioni è la stessa in questa rappresentazione e si può andare avanti e indietro tra le immagini normali (dominio spaziale) e le immagini trasformate di Fourier (dominio della frequenza). Nel dominio delle frequenze dobbiamo conservare le informazioni di tutte le frequenze insieme all'ampiezza e alle informazioni sulla fase.

Qui utilizza il 50% delle frequenze:

50%

Esistono varianti di tutto ciò, con distinzioni da fare tra la serie di Fourier, la trasformata di Fourier e la trasformata discreta di Fourier e la trasformazione discreta del coseno (DCT).

Un'applicazione interessante è l'uso di algoritmi di compressione come JPEG. Qui il DCT viene utilizzato per salvare più parti importanti dell'immagine (le basse frequenze) e meno delle alte frequenze.

Ho scritto questo nella speranza che i lettori principianti possano ottenere una comprensione di base dell'idea delle trasformazioni di Fourier. Per questo ho fatto alcune semplificazioni che spero che i lettori più avanzati mi perdoneranno.

Animato

I video generati da Thomas Devoogdt possono essere visualizzati su Vimeo .

animato


Frequenze nella post-elaborazione

Esistono numerosi metodi che si basano sulle frequenze per l'elaborazione post, soprattutto perché non guardiamo mai singoli pixel singolarmente. Molti algoritmi funzionano sulla frequenza perché è più naturale pensarli in questo modo. Ma anche perché la trasformata di Fourier contiene le stesse informazioni possiamo esprimere qualsiasi operazione matematica (o fase di post-elaborazione) nella frequenza e nei domini spaziali! A volte la descrizione in pixel è migliore, ma spesso la descrizione in frequenza è migliore. (Meglio significa principalmente più veloce in questo contesto.)

Una tecnica che vorrei sottolineare senza una ragione particolare, tranne che sono gli artisti che lavorano direttamente con le frequenze e che è la * separazione delle frequenze *. Non lo descriverò, ma puoi vedere come funziona su YouTube sia per Photoshop che per GIMP.

Si creano due livelli uno con le basse frequenze e uno con le alte frequenze. Per i ritratti è possibile eseguire la levigatura della pelle sulle alte frequenze senza influire sui toni della pelle nelle basse frequenze.

Codice

Questo è un codice per generare gli esempi sopra. Può essere eseguito come un semplice programma Python.

from PIL import Image
from numpy.fft import rfft2, irfft2
import numpy as np

def save_dims(ft, low, high, name):
    ft2 = np.zeros_like(ft)
    # copy the frequencies from low to high but all others stay zero.
    ft2[low:high, low:high] = ft[low:high, low:high]
    save(ft2, name)

def save(ft, name):
    rft = irfft2(ft)
    img = Image.fromarray(rft)
    img = img.convert('L')
    img.save(name)

def main():
    # Convert input into grayscale and save.
    img = Image.open("input.jpg")
    img = img.convert('L')
    img.save('input_gray.png')
    # Do Fourier Transform on image.
    ft = rfft2(img)
    # Take only zeroth frequency and do Inverse FT and save.
    save_dims(ft, 0, 1, 'output_0.png')
    # Take first two frequencies in both directions.
    save_dims(ft, 0, 2, 'output_1.png')
    save_dims(ft, 0, 3, 'output_2.png')
    # Take first 50% of frequencies.
    x = min(ft.shape)
    save_dims(ft, 0, x/2, 'output_50p.png')

def generateGif():
    ''' Generates images to be later converted to a gif.
    This requires ImageMagick:
    convert -delay 100 -loop 0 output_*.png animation.gif
    '''
    # Requires images2gif from code.google.com/p/visvis/source/browse/vvmovie/images2gif.py 
    # from images2gif import writeGif

    img = Image.open('input.jpg')
    img = img.convert('L')
    # Resize image before any calculation.
    size = (640,480)
    img.thumbnail(size, Image.ANTIALIAS)
    ft = rfft2(img)

    images = []
    for x in range(0, max(ft.shape)):
        ft2 = np.zeros_like(ft)
        ft2[0:x, 0:x] = ft[0:x,0:x]
        rft = irfft2(ft2)
        img_out = Image.fromarray(rft).convert('L')
        fname = 'animation/output_%05d.jpg' %(x, )
        img_out.save(fname, quality=60, optimize=True)

    #writeGif('animation.gif', images, duration=0.2)


if __name__=='__main__':
    main()
    #generateGif()

Dovrebbe essere chiarito che, sebbene teoricamente potremmo, supponendo che avessimo una conoscenza infinita dell'immagine a portata di mano, scomporla in frequenze componenti e ricomporla senza perdita ... nel mondo reale non possiamo. La convoluzione di un'immagine del mondo reale, che si verifica in ogni "interfaccia" lungo la pipeline ottica, è effettivamente un processo irreversibile. Non possiamo mai conoscere tutti i fattori di convoluzione, e quindi la ricostruzione di una FFT in un'immagine è difficile e modifiche estreme di solito comportano artefatti e perdita di dati.
jrista

@jrista Penso che il punto che Unapiedra stava facendo riguardo alla reversibilità fosse che una volta che lavori con un'immagine digitale (una matrice di pixel su un computer), puoi andare nello spazio di frequenza e viceversa e ottenere la stessa immagine con cui hai iniziato. Stai guardando un'immagine più ampia del sistema di imaging fisico (obiettivi e simili), in cui si intromettono le limitazioni del mondo reale.
Coneslayer il

3
Il commento di jrista è fuorviante in quanto FT è accusato di perdita di informazioni. Naturalmente, la fotografia è un processo con perdita di dati e lo è anche la post-elaborazione. Se converto un'immagine discreta in Fourier Space, eseguo alcune elaborazioni con perdita di dati, quindi riconvertisco, ovviamente perdo le informazioni. Ma succede nella fase di elaborazione e non nella fase di conversione. È vero, a causa della precisione della macchina ogni operazione matematica perde informazioni ma se parliamo di immagini a 8 bit per canale, non noteremo errori di precisione della macchina.
Unapiedra,

1
@Turkeyphant, non ricordo perché cito la diagonale in quel contesto. Puoi vedere che la direzione principale della seconda frequenza sembra essere quella diagonale particolare. Forse è per questo. Per rispondere alla tua domanda, hai sempre e solo bisogno di due assi per rappresentare un'immagine 2D. È importante che i due assi siano ortogonali. L'asse orizzontale e verticale soddisfano tale criterio. (Inoltre sono pratici.) Con immagini discrete (cioè composte da pixel), l'aliasing peggiorerà tutti gli altri angoli.
Unapiedra,

1
@Corretta correzione turca, Unapiedra ha descritto la seconda frequenza , non la prima, come 0, -1, 0, +1, 0. I paragrafi che descrivono la seconda frequenza sono immediatamente dopo l'immagine della 1a frequenza (l'immagine grigia uniforme), e posso guarda come potrebbe essere allettante leggere quel paragrafo come una descrizione dell'immagine precedente (gli articoli spesso mostrano un'immagine, quindi descriverla nel testo che segue l'immagine), ma non in questo caso. =)
scottbb,

8

Proverò a spiegare con i termini matematici più semplici possibili. Se si desidera saltare la matematica, passare alla parte II, se si desidera ottenere la risposta breve, passare alla parte III

Parte I.

La frequenza di un segnale indica il numero di occorrenze di un evento ricorrente per unità di tempo. Quindi, se l'unità di tempo è secondi, la frequenza viene misurata con Herz: 1Hz = 1 / s. Quindi un segnale con 100Hz, ha un modello che si ripete 100 volte al secondo.

Il segnale più elementare (dal punto di vista dell'elaborazione del segnale) è un segnale sinusale.

y (t) = sin (2πft)

dove f è la frequenza di questo segnale sinusale e t è il tempo. Se questo segnale era suono e f era di circa 50Hz, sentirai un tono di basso molto basso. con una frequenza più alta come 15kHz sarà un tono più alto.

Ora per generalizzare il concetto, il segnale potrebbe essere un segnale spaziale, anziché un segnale temporale ... come se si disegnasse l'onda del seno su un pezzo di carta, con un asse chiamato x che punta verso destra e l'asse y perpendicolare all'asse x.

y (x) = sin (2πfx)

dove f è la frequenza del segnale e x è la variabile spaziale. f qui non viene più misurato con 1 / s, ma 1 / (unità di spazio).

Fourier, un matematico francese, ha dimostrato che è possibile generare qualsiasi segnale aggiungendo un numero di segnali seno e coseno con ampiezze e frequenze diverse. Questo si chiama analisi di Fourier.

Usando l'analisi di Fourier è possibile scrivere qualsiasi funzione y (x) come una somma di segnali seno e coseno con frequenze diverse, quindi una funzione y (x) può essere riscritta in termini di diverse funzioni correlate alla frequenza Y (f). Si può dire che y (x) = Some_Function (Y (f)). oppure Y (f) = Reverse_of_Some_Function (y (x))

La trasformata di Fourier è la funzione F che trasforma un segnale dal dominio x al dominio della frequenza.

Y(f) = F( y(x) )

y(x) = F_inv(Y(f))

F è una funzione analogica, Trasformata discreta di Fourier DFT è l'approssimazione numerica di F. Trasformata veloce di Fourier FFT è un modo per fare DFT ottimizzato per la velocità.

Ok...

Seconda parte

Ora le immagini dei computer sono composte da pixel e ogni pixel ha un valore di intensità per i valori RGB rosso, verde e blu. Nelle immagini in scala di grigi l'intensità per R, G, B di qualsiasi pixel è uguale, R = G = B = I in modo da poter parlare di I per le immagini in scala di grigio.

L'immagine in scala di grigi 800px X 100px in basso è stata generata usando I (x) = sin (2πfx) dove f = 1 ripetizione / 800px = 0,00125 ripetizione / px

inserisci qui la descrizione dell'immagine

Puoi generarlo tu stesso con Python3

from PIL import Image, ImageDraw
from math import sin, pi

img = Image.new('RGB', (800,100), color='black')
draw = ImageDraw.draw(img)

#cacluate the frequency
n = 10 #repetitions
f = n/img.width #

#iterate of the width pixels
for x in range(img.width):
 #calculate the intensity i in that pixel x
 y = sin(2*pi*f*x - pi/2) #this will generate values between -1 and +1, -pi/2 is to make sure that i starts with value 0 in the next line.
 i = (255+255*y)/2 #shifting and scaling y so that the values are between 0 and 255
 draw.line((i,0,i,img.height), fill=(int(i),int(i),int(i)))

img.show()

L'immagine in scala di grigi 800px X 100px in basso è stata generata usando I (x) = sin (2πfx) dove f = 10repetitions / 800px = 0.0125 ripetizioni / px

inserisci qui la descrizione dell'immagine

Ora è facile vedere che questa immagine ha una frequenza orizzontale di 10. Aumentiamo la frequenza di un fattore 10, in modo che n = 100. f = 100/800 = 1/8 = 0.125 ripetizioni / px:

inserisci qui la descrizione dell'immagine

Come accennato in precedenza, è possibile rappresentare qualsiasi segnale (immagine in scala di grigi 1D) come una somma di segnali sinusoidali (immagini seno in scala di grigi 1D) con frequenze diverse.

Parte III

Quindi un'immagine in scala di grigi 1D A ha frequenze più alte rispetto a un'altra immagine in scala di grigi B se A ha dettagli "più fini".

È possibile generalizzare tale principio a immagini 2D colorate e persino 3D. Più fini sono i "dettagli" di un'immagine, maggiore è il contenuto di frequenza di quell'immagine.

Quindi un cielo blu è a bassa frequenza rispetto all'immagine di un fiore.

Puoi saperne di più leggendo sull'analisi di Fourier e sull'elaborazione delle immagini digitali.


4

In breve, la frequenza si riferisce al tasso di variazione. Più precisamente, la frequenza è l'inverso del periodo del cambiamento, ovvero la quantità di tempo necessaria per passare da una luminosità (o qualsiasi altra cosa) a una luminosità diversa e viceversa. Più velocemente cambia (ad esempio da chiaro a scuro), maggiore è la "frequenza" visiva richiesta per rappresentare quella parte dell'immagine.

In altre parole, puoi considerare la frequenza in un'immagine come il tasso di cambiamento. Parti dell'immagine che cambiano rapidamente da un colore a un altro (ad es. Spigoli vivi) contengono alte frequenze e parti che cambiano gradualmente (ad es. Grandi superfici con colori solidi) contengono solo frequenze basse.

Quando parliamo di DCT e FFT e altre trasformazioni simili, di solito le stiamo eseguendo su una porzione di un'immagine (ad esempio per la compressione JPEG, il rilevamento dei bordi e così via). Ha più senso parlare delle trasformazioni, quindi, nel contesto di un blocco di trasformazione di una determinata dimensione.

Immagina, se vuoi, un blocco di dati immagine di 32 pixel x 32 pixel. (Questo numero è arbitrario.) Supponi che l'immagine sia una semplice sfumatura bianca sul lato sinistro, nera al centro e bianca sul lato destro. Vorremmo dire che questo segnale ha un periodo che è all'incirca una lunghezza d'onda per 32 pixel di larghezza, perché passa di nuovo un ciclo completo dal bianco al nero al bianco ogni 32 pixel.

Potremmo chiamare arbitrariamente questa frequenza "1" - 1 ciclo per 32 pixel, cioè. Ricordo vagamente che questo è comunemente chiamato θ nei libri di testo trasformati, o forse θ / 2, ma potrei ricordare di aver sbagliato. Ad ogni modo, lo chiameremo 1 per ora, perché questo è veramente arbitrario in senso assoluto; ciò che conta è la relazione tra le frequenze in senso relativo. :-)

Supponiamo di avere una seconda immagine che è bianca su un bordo, quindi sbiadita due volte più rapidamente in modo da passare dal bianco al nero, al bianco, al nero e di nuovo al bianco sull'altro bordo. Vorremmo quindi chiamare quella frequenza "2" perché cambia due volte più spesso sulla larghezza di quel blocco di 32 pixel.

Se volessimo riprodurre quelle immagini semplici, potremmo letteralmente dire che ogni riga è costituita da un segnale con una frequenza di 1 o 2 e sapresti come appaiono le immagini. Se le immagini passassero dal nero al grigio al 50%, potresti fare la stessa cosa, ma dovresti dire che avevano una frequenza di 1 o 2 con un'intensità del 50%.

Le immagini del mondo reale, ovviamente, non sono solo una semplice sfumatura. L'immagine cambia frequentemente e non periodicamente durante la scansione da sinistra a destra. Tuttavia, all'interno di un blocco abbastanza piccolo (ad esempio 8 pixel, 16 pixel) è possibile approssimare quella riga di pixel come la somma di una serie di segnali, a partire dalla media dei valori dei pixel nella riga, seguita dalla quantità di " frequenza 0,5 "segnale (nero su un lato, dissolvenza in bianco) per fondersi (o con una quantità negativa, la quantità di quel segnale da sottrarre), seguita dalla quantità di frequenza 1, frequenza 2, frequenza 4 e così via .

Ora un'immagine è unica in quanto ha frequenza in entrambe le direzioni; può diventare più chiaro e più scuro quando si sposta sia in orizzontale che in verticale. Per questo motivo, utilizziamo trasformazioni 2D DCT o FFT anziché 1D. Ma il principio è sostanzialmente lo stesso. Puoi rappresentare con precisione un'immagine 8x8 con una griglia 8x8 di secchi di dimensioni simili.

Le immagini sono anche più complesse a causa dei colori, ma per ora lo ignoreremo e supponiamo che stiamo guardando solo una singola immagine in scala di grigi come potresti vedere guardando il canale rosso di una fotografia in isolamento.

Per quanto riguarda come leggere i risultati di una trasformazione, dipende dal fatto che tu stia guardando una trasformazione 1D o una trasformazione 2D. Per una trasformazione 1D, hai una serie di bin. Il primo è la media di tutti i valori di input. Il secondo è la quantità del segnale di frequenza 1 da aggiungere, il terzo è la quantità del segnale di frequenza 2 da aggiungere, ecc.

Per una trasformazione 2D, hai una griglia di valori n x n . La parte superiore sinistra è in genere quella media e, man mano che si procede in direzione orizzontale, ogni bucket contiene la quantità di segnale da miscelare con una frequenza orizzontale di 1, 2, 4, ecc. E mentre si procede in direzione verticale, essa è la quantità di segnale da miscelare con una frequenza verticale di 1, 2, 4, ecc.

Questa è, ovviamente, la storia completa se stai parlando di un DCT; al contrario, ogni cestino per una FFT contiene parti reali e immaginarie. La FFT si basa ancora sulla stessa idea di base (una sorta di), tranne per il fatto che il modo in cui le frequenze sono mappate sui bin è diverso e la matematica è più pelosa. :-)

Naturalmente, il motivo più comune per generare questo tipo di trasformazioni è quindi fare un passo avanti e gettare via alcuni dei dati. Ad esempio, il DCT viene utilizzato nella compressione JPEG. Leggendo i valori in un modello a zig-zag che inizia con la parte in alto a sinistra (la media) e si sposta verso la parte in basso a destra, i dati più importanti (le informazioni su media e bassa frequenza) vengono registrati per primi, seguiti da dati di frequenza progressivamente più alti. Ad un certo punto, in pratica dici "questo è abbastanza buono" e butti via i dati con la più alta frequenza. Questo essenzialmente leviga l'immagine eliminando i suoi dettagli precisi, ma ti dà ancora approssimativamente l'immagine corretta.

E IIRC, gli FFT vengono talvolta utilizzati anche per il rilevamento dei bordi, in cui si eliminano tutti i componenti ad alta frequenza tranne quelli per rilevare le aree ad alto contrasto con bordi taglienti.

National Instruments ha un bell'articolo che lo spiega con le immagini. :-)


0

Immagina di scansionare l'immagine riga per riga con una fotocellula e di fornire i risultati a un plotter (queste macchine piatte che creano onde nere su carta), oscilloscopio (queste scatole che creano onde verdi tremolanti su uno schermo) o analizzatore di spettro (scatole più grandi che fare steccati verdi o multicolori). O anche un altoparlante. Quanto più fini sono le strutture in un'immagine, tanto più alte saranno le frequenze (intonazione nell'altoparlante) del segnale mostrato / ascoltato. Maggiore è il contrasto tra le strutture fini, maggiore sarà l'ampiezza delle parti ad alta frequenza del segnale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.