Co oznacza „częstotliwość” na obrazie?

30

Nie rozumiem, jak częstotliwości są zdefiniowane na zdjęciach / fotografiach. O ile rozumiem teraz, wysokie częstotliwości są jak ostre obrazy na obrazach, takie jak krawędzie lub coś podobnego, a niskie częstotliwości są swego rodzaju przeciwieństwem?

Chciałbym również zrozumieć wynik Dyskretnych Transformacji Fouriera, na przykład, jak je poprawnie odczytać.

Byłoby fajnie, gdyby ktoś mógł mi wyjaśnić następujące kwestie:

  1. Jakie są częstotliwości na zdjęciach i jak są zdefiniowane?

  2. Jak oceniasz wynik dyskretnej transformacji Fouriera?

Jakob Abfalter
źródło
dzięki, już to przeczytałem, pomogło mi to, ale wciąż jestem trochę nieświadomy.
Jakob Abfalter,

Odpowiedzi:

44

Odpowiem tylko na pierwsze pytanie: jakie są częstotliwości w obrazach?

Transformacja Fouriera to technika matematyczna, w której ta sama informacja o obrazie jest reprezentowana nie dla każdego piksela osobno, ale raczej dla każdej częstotliwości. Pomyśl o tym w ten sposób. Morze ma fale, z których niektóre poruszają się bardzo wolno (jak pływy), inne są średniej wielkości, a jeszcze inne są małe jak fale powstałe w wyniku podmuchu. Możesz myśleć o nich jak o trzech osobnych falach, ale w każdym punkcie na powierzchni morza i przez chwilę dostajesz tylko jedną wysokość wody.

To samo dotyczy zdjęć. Możesz pomyśleć o tym, że obraz składa się z różnych fal lub częstotliwości. Aby stworzyć obraz, zacznij od przeciętnego koloru (tak naprawdę myślenie o obrazach w skali szarości jest łatwiejsze). Następnie dodaj fale o różnych długościach i sile, aby powoli tworzyć szczegóły na zdjęciu.

Obraz źródłowy:

Obraz źródłowy

Pierwsza częstotliwość (średnia):

Średni

Druga częstotliwość wzdłuż wymiaru pionowego jest falą rozpoczynającą się od zera u dołu obrazu, rosnącą, stając się ponownie zerową wzdłuż wyśrodkowanego horyzontu i spadającą poniżej zera, aby ostatecznie stać się zerową u góry obrazu. (Opisałem serię Fouriera bez przesunięcia fazowego, ale analogia nadal obowiązuje.)

Tutaj możesz zobaczyć drugą częstotliwość wzdłuż poziomej i pionowej. Zauważ, że możesz dowiedzieć się, gdzie będzie góra (ciemność), a gdzie niebo i jezioro (jaśniej).

Druga częstotliwość:

Pierwszy składnik

Każda dodatkowa fala lub częstotliwość przynosi więcej fal i jako taka, więcej szczegółów. Aby uzyskać różne obrazy, można zmienić wysokość / amplitudę fali, a także punkt początkowy fali, zwany także fazą.

Trzecia częstotliwość:

Trzeci

Co ciekawe, ilość informacji jest taka sama w tej reprezentacji i można przechodzić między normalnymi obrazami (dziedzina przestrzenna) a obrazami z transformacją Fouriera (dziedzina częstotliwości). W dziedzinie częstotliwości musimy przechowywać informacje o wszystkich częstotliwościach wraz z informacją o amplitudzie i fazie.

Tutaj wykorzystuje 50% częstotliwości:

50%

Istnieją warianty tego wszystkiego, z wyróżnieniem między seriami Fouriera, transformatą Fouriera i dyskretną transformatą Fouriera i dyskretną transformatą kosinusową (DCT).

Jedną z interesujących aplikacji jest wykorzystanie algorytmów kompresji, takich jak JPEG. Tutaj DCT służy do zapisywania większej liczby ważnych części obrazu (niskich częstotliwości) i mniejszych wysokich częstotliwości.

Napisałem to z nadzieją, że początkujący czytelnicy mogą zrozumieć podstawy transformacji Fouriera. W tym celu wprowadziłem pewne uproszczenia, które mam nadzieję, że bardziej zaawansowani czytelnicy mi wybaczą.

Ożywiony

Wideo wygenerowane przez Thomasa Devoogdta można obejrzeć na Vimeo .

ożywiony


Częstotliwości w przetwarzaniu końcowym

Istnieje wiele metod, które opierają się na częstotliwościach przetwarzania końcowego, głównie dlatego, że nigdy nie patrzymy pojedynczo na pojedyncze piksele. Wiele algorytmów działa na częstotliwości, ponieważ myślenie o nich w ten sposób jest bardziej naturalne. Ale także dlatego, że Transformacja Fouriera zawiera te same informacje, które możemy wyrazić dowolną operacją matematyczną (lub etapem przetwarzania końcowego) w dziedzinie częstotliwości i przestrzeni! Czasami opis pikselowy jest lepszy, ale często opis częstotliwości jest lepszy. (Lepszy oznacza przede wszystkim szybszy w tym kontekście).

Jedną technikę, na którą chciałbym wskazać bez konkretnego powodu, z wyjątkiem tego, że są to artyści pracujący bezpośrednio na częstotliwościach, a mianowicie * separacja częstotliwości *. Nie zamierzam tego opisywać, ale można zobaczyć, jak to działa w YouTube zarówno w Photoshopie, jak i GIMP.

Tworzysz dwie warstwy, jedną z niskimi częstotliwościami i jedną z wysokimi częstotliwościami. W przypadku portretów można wygładzać skórę na wysokich częstotliwościach bez wpływu na odcienie skóry na niskich częstotliwościach.

Kod

To jest kod do wygenerowania powyższych przykładów. Może być uruchamiany jako prosty program w języku 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()
Unapiedra
źródło
Należy wyjaśnić, że chociaż teoretycznie moglibyśmy, zakładając, że mieliśmy nieskończoną wiedzę o dostępnym obrazie, rozkładamy go na częstotliwości składowe i ponownie komponujemy bez strat ... w prawdziwym świecie nie możemy. Przekształcanie obrazu świata rzeczywistego, które zachodzi na każdym „interfejsie” wzdłuż rurociągu optycznego, jest w rzeczywistości procesem nieodwracalnym. Nie możemy nigdy poznać wszystkich czynników splotu, dlatego też rekonstrukcja FFT z powrotem w obraz jest trudna, a ekstremalne modyfikacje zwykle powodują artefakty i utratę danych.
jrista
@ jrista Myślę, że Unapiedra miał na myśli kwestię odwracalności, że kiedy pracujesz z obrazem cyfrowym (matrycą pikseli na komputerze), możesz przejść do przestrzeni częstotliwości iz powrotem i uzyskać ten sam obraz, od którego zacząłeś. Patrzysz na większy obraz systemu obrazowania fizycznego (soczewki i tym podobne), w którym wkraczają ograniczenia w świecie rzeczywistym.
coneslayer
3
komentarz jristy wprowadza w błąd, ponieważ FT ponosi winę za utratę informacji. Oczywiście fotografia jest procesem stratnym, podobnie jak przetwarzanie końcowe. Jeśli przekonwertuję dyskretny obraz do przestrzeni Fouriera, dokonam tam stratnego przetwarzania, a następnie dokonam konwersji, oczywiście tracę informacje. Ale dzieje się tak na etapie przetwarzania, a nie na etapie konwersji. To prawda, że ​​z powodu precyzji maszyny każda operacja matematyczna traci informacje, ale jeśli mówimy o obrazach 8-bitowych na kanał, nie zauważymy błędów precyzji maszyny.
Unapiedra
1
@ Turkeyphant, nie pamiętam, dlaczego wspominam o przekątnej w tym kontekście. Widać, że główny kierunek drugiej częstotliwości wydaje się być tą szczególną przekątną. Może to dlatego. Aby odpowiedzieć na twoje pytanie, potrzebujesz tylko dwóch osi do przedstawienia obrazu 2D. Ważne jest, aby dwie osie były ortogonalne. Oś pozioma i pionowa spełniają to kryterium. (Też są praktyczne.) Przy dyskretnych obrazach (tj. Złożonych z pikseli), aliasing pogorszy wszystkie inne kąty.
Unapiedra
1
@ Korekcja Turkeyphanta, Unapiedra opisał drugą częstotliwość , a nie pierwszą, jako 0, -1, 0, +1, 0. Akapity opisujące drugą częstotliwość znajdują się bezpośrednio za obrazem pierwszej częstotliwości (jednolity szary obraz) i mogę zobacz, jak kuszące może być czytanie tego akapitu jako opisu poprzedniego obrazu (artykuły często pokazują obraz, a następnie opisują go w tekście po obrazie), ale nie w tym przypadku. =)
scottbb,
9

Spróbuję wyjaśnić najprostszymi możliwymi terminami matematycznymi. Jeśli chcesz pominąć matematykę, przejdź do części II, jeśli chcesz uzyskać krótką odpowiedź, przejdź do części III

Część I

Częstotliwość sygnału oznacza liczbę wystąpień powtarzającego się zdarzenia na jednostkę czasu. Więc jeśli jednostką czasu są sekundy, to częstotliwość jest mierzona za pomocą Herza: 1 Hz = 1 / s. Zatem sygnał o częstotliwości 100 Hz ma wzór powtarzający się 100 razy na sekundę.

Najbardziej podstawowym sygnałem (z punktu widzenia przetwarzania sygnału) jest sygnał zatokowy.

y (t) = sin (2πft)

gdzie f jest częstotliwością tego sygnału sinusoidalnego, a t jest czasem. Jeśli ten sygnał był dźwiękowy, a f był około 50 Hz, usłyszysz jeden bardzo niski ton basowy. przy wyższej częstotliwości, takiej jak 15 kHz, będzie to wyższy ton.

Teraz, aby uogólnić koncepcję, sygnał może być sygnałem przestrzennym, zamiast sygnału czasowego ... tak jakbyś narysował falę sinusoidalną na kawałku papieru, z osią zwaną x skierowaną w prawo, a oś y prostopadłą do osi x.

y (x) = sin (2πfx)

gdzie f jest częstotliwością sygnału, a x jest zmienną przestrzenną. f nie jest już mierzone 1 / s, ale 1 / (jednostka przestrzeni).

Fourier francuski matematyk wykazał, że można wygenerować dowolny sygnał, dodając szereg sygnałów sinusoidalnych i cosinusoidalnych o różnych amplitudach i częstotliwościach. To się nazywa Analiza Fouriera.

Za pomocą analizy Fouriera można zapisać dowolną funkcję y (x) jako sumę sygnałów sinusoidalnych i cosinusowych o różnych częstotliwościach, więc funkcję y (x) można przepisać pod względem kilku funkcji związanych z częstotliwością Y (f). Można powiedzieć, że y (x) = Some_Function (Y (f)). lub Y (f) = Reverse_of_Some_Function (y (x))

Transformacja Fouriera jest funkcją F, która przekształca sygnał z dziedziny x do dziedziny częstotliwości.

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

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

F jest funkcją analogową, dyskretna transformacja Fouriera DFT jest przybliżeniem liczbowym F. Szybka transformacja Fouriera FFT to sposób na zoptymalizowanie DFT pod kątem prędkości.

Dobrze...

część druga

Teraz obrazy komputerowe składają się z pikseli, a każdy piksel ma wartość intensywności dla wartości RGB, czerwonej, zielonej i niebieskiej. Na obrazach w skali szarości intensywność dla R, G, B dowolnego piksela jest równa, R = G = B = I, abyśmy mogli mówić o I dla obrazów w skali szarości.

Poniższy obraz w skali szarości 800px X 100px został wygenerowany przy użyciu I (x) = sin (2πfx), gdzie f = 1 powtórzenie / 800px = 0,00125 powtórzenia / px

wprowadź opis zdjęcia tutaj

Możesz go wygenerować samodzielnie za pomocą 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()

Poniższy obraz w skali szarości 800px X 100px został wygenerowany przy użyciu I (x) = sin (2πfx), gdzie f = 10 powtórzeń / 800px = 0,0125 powtórzeń / px

wprowadź opis zdjęcia tutaj

Teraz łatwo zauważyć, że ten obraz ma częstotliwość poziomą 10. Zwiększmy częstotliwość o współczynnik 10, tak aby n = 100. f = 100/800 = 1/8 = 0,125 powtórzeń / px:

wprowadź opis zdjęcia tutaj

Jak wspomniano wcześniej, dowolny sygnał (obraz 1D w skali szarości) można przedstawić jako sumę serii sygnałów sinusoidalnych (obrazy sinusoidalne w skali 1D) o różnych częstotliwościach.

Część III

Tak więc obraz 1D w skali szarości A ma wyższe częstotliwości niż inny obraz w skali szarości B, jeśli A ma „drobniejsze” szczegóły.

Możesz uogólnić tę zasadę na kolorowe obrazy 2D, a nawet 3D. Im drobniejsze są „szczegóły” obrazu, tym wyższa jest częstotliwość tego obrazu.

Zatem błękitne niebo ma niską częstotliwość w porównaniu z obrazem kwiatu.

Możesz dowiedzieć się więcej na ten temat, czytając o analizie Fouriera i cyfrowym przetwarzaniu obrazu.

Ouss
źródło
4

W skrócie, częstotliwość odnosi się do tempa zmian. Mówiąc dokładniej, częstotliwość jest odwrotnością okresu zmiany - to znaczy czasu potrzebnego do przejścia z jednej jasności (lub cokolwiek innego) do innej jasności iz powrotem. Im szybsza niż zmiana (np. Z jasnego na ciemny), tym wyższa „częstotliwość” wizualna wymagana do przedstawienia tej części obrazu.

Innymi słowy, częstotliwość obrazu można postrzegać jako szybkość zmian. Części obrazu, które szybko zmieniają się z jednego koloru na drugi (np. Ostre krawędzie) zawierają wysokie częstotliwości, a części, które zmieniają się stopniowo (np. Duże powierzchnie o jednolitych kolorach) zawierają tylko niskie częstotliwości.

Kiedy mówimy o DCT i FFT i innych podobnych transformacjach, zwykle robimy to na części obrazu (np. W celu kompresji JPEG, wykrywania krawędzi itp.). Najbardziej sensowne jest mówienie o transformacjach w kontekście bloku transformacji o danym rozmiarze.

Wyobraź sobie, jeśli chcesz, blok danych obrazu 32 piksele x 32 piksele. (Ta liczba jest dowolna.) Załóżmy, że obraz jest prostym gradientem, który jest biały po lewej stronie, czarny po środku i biały po prawej stronie. Powiedzielibyśmy, że ten sygnał ma okres około jednej długości fali na 32 piksele szerokości, ponieważ przechodzi on przez cały cykl od bieli do czerni do bieli co 32 piksele.

Możemy dowolnie nazwać tę częstotliwość „1” - to znaczy 1 cykl na 32 piksele. Nieco pamiętam, że jest to powszechnie nazywane θ w podręcznikach transformacji, a może θ / 2, ale mogę źle pamiętać. Tak czy inaczej, nazwiemy to na razie 1, ponieważ to naprawdę jest arbitralne w absolutnym sensie; liczy się relacja między częstotliwościami w sensie względnym. :-)

Załóżmy, że masz drugi obraz, który jest biały na jednej krawędzi, a następnie wyblakł dwa razy szybciej, tak że zmienił się z białego na czarny, na biały, na czarny i ponownie na biały na drugiej krawędzi. Nazwalibyśmy wtedy tę częstotliwość „2”, ponieważ zmienia się ona dwa razy częściej na szerokości tego bloku 32 pikseli.

Gdybyśmy chcieli odtworzyć te proste obrazy, moglibyśmy dosłownie powiedzieć, że każdy rząd składa się z sygnału o częstotliwości 1 lub 2, a ty wiesz, jak wyglądają obrazy. Gdyby obrazy zmieniły kolor z czarnego na 50% szary, możesz zrobić to samo, ale musisz powiedzieć, że miały częstotliwość 1 lub 2 z intensywnością 50%.

Rzeczywiste obrazy oczywiście nie są zwykłym gradientem. Obraz zmienia się często, a nie okresowo, podczas skanowania od lewej do prawej. Jednak w wystarczająco małym bloku (np. 8 pikseli, 16 pikseli) można przybliżyć ten rząd pikseli jako sumę serii sygnałów, zaczynając od średniej wartości pikseli w rzędzie, a następnie częstotliwość 0,5 cala (czarny z jednej strony, blaknięcie do bieli) w celu wtopienia się (lub z wartością ujemną, ilość tego sygnału do odjęcia), a następnie ilość częstotliwości 1, częstotliwość 2, częstotliwość 4 itd. .

Teraz obraz jest wyjątkowy, ponieważ ma częstotliwość w obu kierunkach; może stać się jaśniejszy i ciemniejszy podczas poruszania się zarówno w poziomie, jak i w pionie. Z tego powodu używamy transformacji 2D DCT lub FFT zamiast 1D. Ale zasada jest w zasadzie taka sama. Możesz dokładnie przedstawić obraz 8x8 z siatką 8x8 wiader o podobnych rozmiarach.

Obrazy są również bardziej złożone ze względu na kolory, ale na razie je zignorujemy i założymy, że patrzymy tylko na pojedynczy obraz w skali szarości, jak można to zrobić, patrząc na czerwony kanał fotografii w izolacji.

To, jak odczytać wyniki transformacji, zależy od tego, czy patrzysz na transformację 1D, czy transformację 2D. Dla transformacji 1D masz szereg pojemników. Pierwszy to średnia wszystkich wartości wejściowych. Drugi to ilość sygnału o częstotliwości 1 do dodania, trzeci to ilość sygnału o częstotliwości 2 do dodania itp.

W przypadku transformacji 2D masz siatkę wartości n x n . Lewy górny róg jest zwykle taki średni, a gdy idziesz w kierunku poziomym, każde wiadro zawiera ilość sygnału do zmieszania z częstotliwością poziomą 1, 2, 4 itd., A gdy idziesz w kierunku pionowym, to to ilość sygnału do zmiksowania z częstotliwością pionową 1, 2, 4 itd.

To oczywiście pełna historia, jeśli mówisz o DCT; dla kontrastu, każdy pojemnik na FFT zawiera prawdziwe i urojone części. FFT nadal opiera się na tej samej podstawowej idei (z tym, że), z tym wyjątkiem, że sposób mapowania częstotliwości na przedziały jest inny, a matematyka jest bardziej włochata. :-)

Oczywiście najczęstszym powodem generowania tego rodzaju transformacji jest pójście o krok dalej i wyrzucenie części danych. Na przykład DCT jest używany do kompresji JPEG. Po odczytaniu wartości w zygzakowatym wzorze, zaczynając od lewego górnego rogu (średnia) i przechodząc w dolnym prawym rogu, najpierw rejestrowane są najważniejsze dane (informacje o średniej i niskiej częstotliwości), a następnie dane o stopniowo wyższej częstotliwości. W pewnym momencie w zasadzie mówisz „to wystarczy” i wyrzucasz dane o najwyższej częstotliwości. To zasadniczo wygładza obraz, odrzucając jego drobne szczegóły, ale nadal daje w przybliżeniu prawidłowy obraz.

I IIRC, FFT są również czasami używane do wykrywania krawędzi, gdzie wyrzucasz wszystkie elementy oprócz wysokiej częstotliwości jako środek do wykrywania obszarów o wysokim kontraście na ostrych krawędziach.

National Instruments ma fajny artykuł, który wyjaśnia to zdjęciami. :-)

dgatwood
źródło
0

Wyobraź sobie skanowanie obrazu linia po linii za pomocą fotokomórki i podawanie wyników do plotera (te płaskie maszyny, które wytwarzają czarne fale na papierze), oscyloskopu (te pola, które migoczą zielone fale na ekranie) lub analizatora widma (większe pola, które zrobić zielone lub wielokolorowe płoty). Lub nawet głośnik. Im drobniejsze struktury obrazu, tym wyższe będą częstotliwości (wysokość w głośniku) pokazywanego / słyszanego sygnału. Im większy kontrast występuje w drobnych strukturach, tym wyższa będzie amplituda części sygnału o wysokiej częstotliwości.

rackandboneman
źródło