Apa arti "frekuensi" dalam suatu gambar?

29

Saya tidak mengerti bagaimana frekuensi didefinisikan dalam gambar / foto. Sejauh yang saya mengerti sekarang, frekuensi tinggi seperti benda tajam dalam gambar, seperti tepi atau lebih, dan frekuensi rendah adalah jenis yang sebaliknya?

Saya juga ingin memahami hasil dari Transformasi Fourier Diskrit, seperti cara membacanya dengan benar.

Akan keren jika seseorang bisa menjelaskan kepada saya hal berikut:

  1. Berapa frekuensi dalam gambar dan bagaimana mereka didefinisikan?

  2. Bagaimana Anda membaca hasil dari Transformasi Fourier Diskrit?

Jakob Abfalter
sumber
terima kasih, saya sudah membaca ini, itu membantu saya, tetapi saya masih sedikit mengerti.
Jakob Abfalter

Jawaban:

44

Saya hanya akan menjawab pertanyaan pertama: Berapa frekuensi dalam gambar?

Fourier Transform adalah teknik matematika di mana informasi gambar yang sama diwakili bukan untuk setiap piksel secara terpisah tetapi untuk setiap frekuensi. Pikirkan seperti ini. Laut memiliki ombak yang beberapa di antaranya bergerak sangat lambat (seperti pasang-surut), lainnya berukuran sedang dan masih ada yang kecil seperti riak yang terbentuk dari hembusan. Anda dapat menganggap mereka sebagai tiga gelombang terpisah tetapi pada setiap titik di permukaan laut dan sesaat, Anda hanya mendapatkan satu ketinggian air.

Hal yang sama berlaku untuk gambar. Anda dapat memikirkan gambar yang terdiri dari berbagai gelombang atau frekuensi. Untuk membuat gambar Anda, mulailah dengan warna rata-rata (sebenarnya berpikir gambar skala abu-abu lebih mudah). Kemudian tambahkan gelombang dengan panjang dan kekuatan gelombang berbeda untuk secara perlahan membangun detail dalam gambar.

Gambar Sumber:

Gambar Sumber

Frekuensi Pertama (Rata-Rata):

Rata-rata

Frekuensi kedua sepanjang dimensi vertikal adalah gelombang yang dimulai dari nol di bagian bawah gambar, naik, menjadi nol lagi di sepanjang cakrawala tengah dan jatuh di bawah nol hingga akhirnya menjadi nol di bagian atas gambar. (Saya menggambarkan Seri Fourier tanpa pergeseran fasa, tetapi analoginya masih berlaku.)

Di sini Anda dapat melihat frekuensi kedua sepanjang horisontal dan vertikal. Perhatikan bahwa Anda bisa melihat di mana gunung itu akan (gelap) dan di mana langit dan danau akan berada (lebih terang).

Frekuensi kedua:

Komponen Pertama

Setiap gelombang atau frekuensi tambahan membawa lebih banyak riak dan karenanya, lebih detail. Untuk mendapatkan gambar yang berbeda, tinggi / amplitudo gelombang dapat diubah serta titik awal gelombang, juga disebut Fase.

Frekuensi ketiga:

Ketiga

Yang menarik, jumlah informasinya sama dalam representasi ini dan seseorang dapat bolak-balik antara gambar normal (domain spasial) dan gambar Fourier Transformed (domain frekuensi). Dalam domain frekuensi kita perlu menyimpan informasi semua frekuensi bersama dengan amplitudo dan informasi fase.

Ini dia menggunakan 50% frekuensi:

50%

Ada varian dari semua ini, dengan perbedaan yang harus dibuat antara Fourier Series, Fourier Transform dan Discrete Fourier Transform dan Discrete Cosine Transform (DCT).

Salah satu aplikasi yang menarik adalah dalam penggunaan algoritma kompresi seperti JPEG. Di sini DCT digunakan untuk menyimpan lebih banyak bagian penting dari gambar (frekuensi rendah) dan lebih sedikit dari frekuensi tinggi.

Saya menulis ini dengan harapan agar pembaca pemula bisa mendapatkan pemahaman dasar tentang gagasan Fourier Transforms. Untuk itu saya membuat beberapa penyederhanaan yang saya harap pembaca yang lebih maju akan memaafkan saya.

Animasi

Video yang dihasilkan oleh Thomas Devoogdt dapat dilihat di Vimeo .

animasi


Frekuensi dalam Pasca Pemrosesan

Ada banyak metode yang mengandalkan frekuensi untuk pemrosesan pasca, sebagian besar karena kita tidak pernah melihat piksel tunggal secara individual. Banyak algoritma bekerja pada frekuensi karena lebih alami untuk memikirkannya dengan cara ini. Tetapi juga karena Transformasi Fourier berisi informasi yang sama kita dapat mengekspresikan operasi matematika apa pun (atau langkah pasca pemrosesan) dalam frekuensi dan domain spasial! Kadang-kadang deskripsi pixel-bijaksana lebih baik tetapi sering deskripsi frekuensi lebih baik. (Lebih baik terutama berarti lebih cepat dalam konteks ini.)

Salah satu teknik yang saya ingin tunjukkan tanpa alasan tertentu kecuali bahwa itu adalah seniman yang bekerja secara langsung dengan frekuensi dan itu adalah * pemisahan frekuensi *. Saya tidak akan menjelaskannya tetapi Anda dapat melihat cara kerjanya di YouTube untuk Photoshop dan GIMP.

Anda membuat dua lapisan satu dengan frekuensi rendah dan satu dengan frekuensi tinggi. Untuk potret, Anda dapat menghaluskan kulit pada frekuensi tinggi tanpa memengaruhi nada kulit pada frekuensi rendah.

Kode

Ini adalah beberapa kode untuk menghasilkan contoh-contoh di atas. Itu dapat dijalankan sebagai program Python sederhana.

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
sumber
Harus diklarifikasi bahwa, sementara secara teoritis kita bisa, dengan asumsi kita memiliki pengetahuan tak terbatas tentang gambar yang ada, menguraikannya menjadi frekuensi komponen dan mengomposisi ulang tanpa kehilangan ... di dunia nyata kita tidak bisa. Konvolusi citra dunia nyata, yang terjadi pada setiap "antarmuka" di sepanjang pipa optik, secara efektif merupakan proses yang tidak dapat diubah. Kita tidak pernah tahu semua faktor konvolusi, dan karenanya rekonstruksi FFT kembali menjadi gambar sulit, dan modifikasi ekstrem biasanya menghasilkan artefak dan kehilangan data.
jrista
@jrista Saya pikir poin yang dibuat Unapiedra tentang reversabilitas adalah bahwa begitu Anda bekerja dengan gambar digital (array piksel pada komputer), Anda dapat pergi ke ruang frekuensi dan kembali, dan mendapatkan gambar yang sama dengan yang Anda mulai. Anda sedang melihat gambaran yang lebih besar dari sistem pencitraan fisik (lensa dan semacamnya), di mana keterbatasan dunia nyata mengganggu.
pemain coneslayer
3
Komentar jrista menyesatkan karena FT disalahkan atas kehilangan informasi. Tentu saja, fotografi adalah proses yang hilang dan begitu juga pasca-pemrosesan. Jika saya mengonversi gambar diskrit ke Fourier Space, lakukan beberapa pemrosesan lossy di sana, dan kemudian mengonversi kembali, tentu saja saya kehilangan informasi. Tetapi itu terjadi pada langkah pemrosesan dan bukan pada langkah konversi. Benar, karena presisi mesin, setiap operasi matematika kehilangan informasi, tetapi jika kita berbicara tentang 8 bit per saluran gambar, kita tidak akan melihat kesalahan presisi mesin.
Unapiedra
1
@ Turnkeyphant, saya tidak ingat mengapa saya menyebutkan diagonal dalam konteks itu. Anda dapat melihat bahwa arah utama dari frekuensi kedua tampaknya diagonal tertentu. Mungkin itu sebabnya. Untuk menjawab pertanyaan Anda, Anda hanya perlu dua sumbu untuk mewakili gambar 2D. Penting bahwa kedua sumbu itu ortogonal. Sumbu horizontal dan vertikal memenuhi kriteria tersebut. (Juga mereka praktis.) Dengan gambar diskrit (yaitu terdiri dari piksel), aliasing akan membuat semua sudut lainnya lebih buruk.
Unapiedra
1
@Turkeyphant koreksi, Unapiedra menggambarkan frekuensi kedua , bukan yang pertama, sebagai 0, -1, 0, +1, 0. Paragraf yang menggambarkan frekuensi 2 segera setelah gambar frekuensi 1 (gambar abu-abu seragam), dan aku bisa lihat bagaimana tergoda untuk membaca paragraf itu sebagai deskripsi gambar sebelumnya (artikel sering menunjukkan gambar, kemudian menggambarkannya dalam teks mengikuti gambar), tetapi tidak dalam kasus ini. =)
scottbb
8

Saya akan mencoba menjelaskan dengan istilah matematika sesederhana mungkin. Jika Anda ingin melewatkan matematika, lompat ke bagian II, jika Anda ingin mendapatkan jawaban singkat, lewati ke Bagian III

Bagian I

Frekuensi sinyal berarti jumlah kemunculan peristiwa berulang per unit waktu. Jadi jika satuan waktu adalah detik maka frekuensi diukur dengan Herz: 1Hz = 1 / s. Jadi sinyal dengan 100Hz, memiliki pola yang berulang 100 kali per detik.

Sinyal yang paling mendasar (dari sudut pandang pemrosesan sinyal) adalah sinyal sinus.

y (t) = dosa (2πft)

di mana f adalah frekuensi dari sinyal sinus ini, dan t adalah waktu. Jika sinyal ini baik dan f sekitar 50Hz, Anda akan mendengar nada bass yang sangat rendah. dengan frekuensi yang lebih tinggi seperti 15kHz itu akan menjadi nada yang lebih tinggi.

Sekarang untuk menggeneralisasi konsep, sinyal bisa menjadi sinyal spasial, bukan sinyal temporal ... seolah-olah Anda menggambar gelombang sinus pada selembar kertas, dengan sumbu yang disebut x menunjuk ke kanan, dan sumbu y tegak lurus ke sumbu x.

y (x) = sin (2πfx)

di mana f adalah frekuensi sinyal, dan x adalah variabel spasial. f di sini tidak diukur dengan 1 / s lagi, tetapi 1 / (unit ruang).

Fourier, seorang ahli matematika Prancis, menunjukkan bahwa Anda dapat menghasilkan sinyal apa pun dengan menambahkan sejumlah sinyal sinus dan kosinus dengan berbagai amplitudo dan frekuensi. Itu disebut Analisis Fourier.

Dengan menggunakan analisis Fourier, dimungkinkan untuk menulis fungsi apa saja y (x) sebagai jumlah sinyal sinus dan kosinus dengan frekuensi yang berbeda, sehingga fungsi y (x) dapat ditulis ulang dalam beberapa fungsi terkait dengan frekuensi Y (f). Seseorang dapat mengatakan bahwa y (x) = Some_Function (Y (f)). atau Y (f) = Reverse_of_Some_Function (y (x))

Transformasi Fourier adalah fungsi F yang mengubah sinyal dari domain x, ke domain frekuensi.

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

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

F adalah fungsi analog, Discrete Fourier Transformation DFT adalah pendekatan numerik dari F. Fast Fourier Transformation FFT adalah cara untuk melakukan DFT yang dioptimalkan untuk kecepatan.

Baik...

Bagian II

Sekarang gambar komputer terdiri dari piksel, dan setiap piksel memiliki nilai intensitas untuk nilai Merah, Hijau, Biru alias RGB. Dalam gambar skala abu-abu intensitas untuk R, G, B dari setiap piksel adalah sama, R = G = B = I sehingga kita dapat berbicara tentang I untuk gambar skala abu-abu.

Gambar skala abu-abu 800px X 100px di bawah ini dihasilkan menggunakan I (x) = sin (2πfx) di mana f = 1 pengulangan / 800px = 0,00125 pengulangan / px

masukkan deskripsi gambar di sini

Anda bisa membuatnya sendiri dengan 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()

Gambar skala abu-abu 800px X 100px di bawah ini dihasilkan menggunakan I (x) = sin (2πfx) di mana f = 10 repetisi / 800px = 0,0125 repetisi / px

masukkan deskripsi gambar di sini

Sekarang mudah untuk melihat bahwa gambar ini memiliki frekuensi horizontal 10. Mari kita meningkatkan frekuensi dengan faktor 10, sehingga n = 100. f = 100/800 = 1/8 = 0,125 repetisi / px:

masukkan deskripsi gambar di sini

Seperti disebutkan sebelumnya, Anda dapat mewakili sinyal apa pun (gambar skala abu-abu 1D) sebagai rangkaian jumlah sinyal sinus (gambar skala abu-abu 1D) dengan frekuensi yang berbeda.

Bagian III

Jadi gambar grayscale 1D A memiliki frekuensi yang lebih tinggi daripada gambar grayscale B lainnya jika A memiliki detail "lebih halus".

Anda dapat menggeneralisasi prinsip tersebut menjadi gambar 2D dan bahkan 3D yang berwarna. Semakin halus "detail" suatu gambar, semakin tinggi pula frekuensi frekuensinya.

Jadi langit biru adalah frekuensi rendah dibandingkan dengan gambar bunga.

Anda dapat mempelajari lebih lanjut tentang ini dengan membaca tentang Analisis Fourier, dan tentang Pemrosesan Gambar Digital.

Ouss
sumber
4

Secara singkat, frekuensi mengacu pada tingkat perubahan. Lebih tepatnya, frekuensinya adalah kebalikan dari periode perubahan — yaitu, jumlah waktu yang dibutuhkan untuk berputar dari satu kecerahan (atau apa pun) ke kecerahan berbeda dan kembali lagi. Semakin cepat berubah (misalnya dari terang ke gelap), semakin tinggi "frekuensi" visual yang diperlukan untuk mewakili bagian gambar tersebut.

Dengan kata lain, Anda dapat menganggap frekuensi dalam suatu gambar sebagai tingkat perubahan. Bagian gambar yang berubah dengan cepat dari satu warna ke warna lain (misalnya tepi tajam) mengandung frekuensi tinggi, dan bagian yang berubah secara bertahap (misalnya permukaan besar dengan warna solid) hanya mengandung frekuensi rendah.

Ketika kita berbicara tentang DCT dan FFT dan transformasi serupa lainnya, kita biasanya melakukannya pada sebagian gambar (misalnya untuk kompresi JPEG, deteksi tepi, dan sebagainya). Maka, paling masuk akal untuk berbicara tentang transformasi, dalam konteks blok transformasi dengan ukuran tertentu.

Bayangkan, jika Anda mau, sebuah blok data gambar berukuran 32 piksel x 32 piksel. (Angka ini arbitrer.) Misalkan gambar adalah gradien sederhana yang berwarna putih di sisi kiri, hitam di tengah, dan putih di sisi kanan. Kita dapat mengatakan bahwa sinyal ini memiliki periode yang kira-kira satu panjang gelombang per 32 piksel lebar, karena ia melewati siklus lengkap dari putih ke hitam ke putih lagi setiap 32 piksel.

Kami dapat secara sewenang-wenang menyebut frekuensi ini "1" - 1 siklus per 32 piksel, yaitu. Samar-samar saya ingat bahwa ini biasa disebut θ dalam buku teks transformasi, atau mungkin θ / 2, tetapi saya bisa mengingat yang salah. Bagaimanapun, kita akan menyebutnya 1 untuk saat ini, karena ini benar-benar sewenang-wenang dalam arti absolut; yang penting adalah hubungan antara frekuensi dalam arti relatif. :-)

Misalkan Anda memiliki gambar kedua yang putih di satu sisi, lalu pudar dua kali lebih cepat sehingga berubah dari putih menjadi hitam, menjadi putih, menjadi hitam, dan menjadi putih lagi di tepi lainnya. Kami kemudian akan memanggil frekuensi itu "2" karena frekuensi itu berubah dua kali lebih sering dari lebar blok 32 piksel itu.

Jika kami ingin mereproduksi gambar sederhana itu, kami dapat mengatakan bahwa setiap baris terdiri dari sinyal dengan frekuensi 1 atau 2, dan Anda akan tahu seperti apa gambar itu. Jika gambar berubah dari hitam menjadi abu-abu 50%, Anda dapat melakukan hal yang sama, tetapi Anda harus mengatakan bahwa mereka memiliki frekuensi 1 atau 2 pada intensitas 50%.

Gambar dunia nyata, tentu saja, bukan hanya gradien sederhana. Gambar sering berubah dan tidak secara berkala saat Anda memindai dari kiri ke kanan. Namun, dalam blok yang cukup kecil (misalnya 8 piksel, 16 piksel), Anda dapat memperkirakan deretan piksel tersebut sebagai jumlah dari serangkaian sinyal, dimulai dengan rata-rata nilai piksel di baris tersebut, diikuti dengan jumlah " frekuensi 0,5 "sinyal (hitam di satu sisi, memudar menjadi putih) untuk berbaur (atau dengan jumlah negatif, jumlah sinyal yang dikurangi), diikuti oleh jumlah frekuensi 1, frekuensi 2, frekuensi 4, dan seterusnya .

Sekarang gambar unik karena memiliki frekuensi di kedua arah; itu bisa menjadi lebih terang dan lebih gelap ketika bergerak baik secara horizontal maupun vertikal. Untuk alasan ini, kami menggunakan transformasi DCT 2D atau FFT sebagai ganti 1D. Tetapi prinsip dasarnya masih sama. Anda dapat dengan tepat menampilkan gambar 8x8 dengan kisi 8x8 dengan ukuran ember yang sama.

Gambar juga lebih kompleks karena warna, tetapi kami akan mengabaikannya untuk saat ini, dan menganggap bahwa kami hanya melihat gambar skala abu-abu tunggal seperti yang mungkin Anda dapatkan dengan melihat saluran merah foto secara terpisah.

Adapun cara membaca hasil transformasi, itu tergantung pada apakah Anda melihat transformasi 1D atau transformasi 2D. Untuk transformasi 1D, Anda memiliki serangkaian nampan. Yang pertama adalah rata-rata dari semua nilai input. Yang kedua adalah jumlah sinyal frekuensi 1 yang akan ditambahkan, yang ketiga adalah jumlah sinyal frekuensi 2 yang akan ditambahkan, dll.

Untuk mengubah 2D, Anda memiliki n x n batas nilai. Kiri atas biasanya rata-rata itu, dan ketika Anda pergi ke arah horisontal, setiap ember berisi jumlah sinyal untuk bercampur dengan frekuensi horizontal 1, 2, 4, dll. Dan ketika Anda pergi ke arah vertikal, itu adalah jumlah sinyal untuk bercampur dengan frekuensi vertikal 1, 2, 4, dll.

Itu, tentu saja, cerita lengkap jika Anda berbicara tentang DCT; sebaliknya, setiap nampan untuk FFT berisi bagian nyata dan imajiner. FFT masih didasarkan pada ide dasar yang sama (semacam), kecuali bahwa cara frekuensi dipetakan ke tempat sampah berbeda dan matematika adalah hairier. :-)

Tentu saja, alasan paling umum untuk menghasilkan transformasi semacam ini adalah untuk kemudian melangkah lebih jauh dan membuang beberapa data. Misalnya, DCT digunakan dalam kompresi JPEG. Dengan membaca nilai-nilai dalam pola zig-zag dimulai dengan kiri atas (rata-rata) dan bergerak ke kanan bawah, data yang paling penting (informasi rata-rata dan frekuensi rendah) direkam terlebih dahulu, diikuti oleh data frekuensi yang semakin tinggi. Pada titik tertentu, Anda pada dasarnya mengatakan "ini cukup baik" dan membuang data frekuensi tertinggi. Ini pada dasarnya menghaluskan gambar dengan membuang detail halusnya, tetapi masih memberi Anda kira-kira gambar yang benar.

Dan IIRC, FFT juga kadang-kadang digunakan untuk deteksi tepi, di mana Anda membuang semua kecuali komponen frekuensi tinggi sebagai alat untuk mendeteksi area kontras tinggi di tepi yang tajam.

National Instruments memiliki artikel bagus yang menjelaskan hal ini dengan gambar. :-)

dgatwood
sumber
0

Bayangkan memindai gambar garis demi garis dengan fotosel, dan mengumpankan hasilnya ke plotter (mesin datar ini yang membuat gelombang hitam di atas kertas), osiloskop (kotak-kotak ini yang membuat gelombang hijau berkedip-kedip di layar) atau penganalisa spektrum (kotak besar yang membuat pagar piket berwarna hijau atau multi warna). Atau bahkan pengeras suara. Semakin halus struktur dalam gambar, semakin tinggi frekuensi (nada dalam loudspeaker) dari sinyal yang ditampilkan / didengar. Semakin banyak perbedaan dalam struktur halus, semakin tinggi amplitudo bagian frekuensi tinggi dari sinyal.

pemeras dan prajurit
sumber