Bir görüntüdeki “frekans” ne demektir?


30

Görüntülerde / fotoğraflarda frekansların nasıl tanımlandığını anlamıyorum. Şimdi anladığım kadarıyla, yüksek frekanslar görüntülerdeki keskin kenarlar gibi keskin kenarlar gibidir ve düşük frekanslar tam tersi midir?

Ayrık Fourier Dönüşümlerinin sonucunu, nasıl düzgün okunacakları gibi anlamak istiyorum.

Birisi bana aşağıdakileri açıklayabilirse çok iyi olurdu:

  1. Resimlerdeki frekanslar nedir ve nasıl tanımlanır?

  2. Ayrık Fourier Dönüşümünün sonucunu nasıl okuyorsunuz?



teşekkürler, bunu zaten okudum, bana yardımcı oldu, ama hala biraz clueless.
Jakob Abfalter

Yanıtlar:


44

Sadece ilk soruyu cevaplayacağım: Görüntülerdeki frekanslar nedir?

Fourier Dönüşümü, aynı görüntü bilgisinin her piksel için ayrı ayrı değil, her frekans için temsil edildiği matematiksel bir tekniktir. Bu şekilde düşünün. Denizde bazıları çok yavaş hareket eden (gelgitler gibi) dalgaları vardır, diğerleri orta büyüklükte ve bazıları da bir büstten oluşan dalgalanmalar gibi küçüktür. Onları üç ayrı dalga olarak düşünebilirsiniz, ancak denizin yüzeyindeki her noktada ve bir anda, sadece bir yükseklikte su elde edersiniz.

Aynısı görüntüler için de geçerlidir. Görüntünün çeşitli dalgalardan veya frekanslardan oluştuğunu düşünebilirsiniz. Görüntünüzü oluşturmak için ortalama renkle başlayın (aslında gri tonlamalı görüntüleri düşünmek daha kolaydır). Ardından, resimdeki ayrıntıları yavaşça oluşturmak için farklı dalga uzunluklarına ve mukavemete sahip dalgalar ekleyin.

Kaynak Resim:

Kaynak Resim

İlk Frekans (Ortalama):

Ortalama

Dikey boyut boyunca ikinci frekans, görüntünün alt kısmında sıfırdan başlayan, yükselen, ortalanmış ufuk boyunca tekrar sıfıra dönen ve nihayet görüntünün üstünde sıfıra dönüşen bir dalgadır. (Faz kayması olmayan bir Fourier Serisi tanımladım, ancak analoji hala geçerli.)

Burada yatay ve dikey boyunca ikinci frekansı görebilirsiniz. Dağın nerede (karanlık) ve gökyüzünün ve gölün (daha açık) nerede olacağına dikkat edin.

İkinci Frekans:

İlk Bileşen

Her ek dalga veya frekans daha fazla dalgalanma ve dolayısıyla daha fazla ayrıntı getirir. Farklı görüntüler elde etmek için, dalga yüksekliği / genliği ve dalganın Başlangıç ​​Noktası olarak da adlandırılan başlangıç ​​noktası değiştirilebilir.

Üçüncü Frekans:

Üçüncü

İlginç bir şekilde, bilgi gösterimi bu gösterimde aynıdır ve normal görüntüler (uzamsal alan) ve Fourier Dönüştürülmüş görüntüler (frekans alanı) arasında ileri geri gidilebilir. Frekans alanında, genlik ve faz bilgisi ile birlikte tüm frekansların bilgilerini tutmamız gerekir.

Burada frekansların% 50'sini kullanıyor:

% 50

Tüm bunların varyantları vardır, Fourier Serisi, Fourier Dönüşümü ve Ayrık Fourier Dönüşümü ve Ayrık Kosinüs Dönüşümü (DCT) arasında ayrımlar yapılacaktır.

İlginç bir uygulama JPEG gibi sıkıştırma algoritmalarının kullanımındadır. Burada DCT görüntünün önemli kısımlarından (düşük frekanslar) ve yüksek frekanslardan daha azını kaydetmek için kullanılır.

Bunu acemi okuyucuların Fourier Dönüşümleri fikri hakkında temel bir anlayış kazanmaları umuduyla yazdım. Bunun için daha basit okuyucuların beni affedeceğini umduğum bazı basitleştirmeler yaptım.

animasyon

Thomas Devoogdt tarafından oluşturulan video de görülebilir Vimeo .

animasyonlu


İşlem Sonrası Frekanslar

Çoğunlukla tek tek piksele tek başına bakmadığımız için, post işleme için frekanslara dayanan birçok yöntem vardır. Birçok algoritma frekans üzerinde çalışır, çünkü bu şekilde düşünmek daha doğaldır. Ancak Fourier Dönüşümü aynı bilgileri içerdiğinden, frekans ve uzamsal alanlarda herhangi bir matematiksel işlemi (veya işlem sonrası adımını) ifade edebiliriz! Bazen piksel bazlı açıklama daha iyidir, ancak sıklıkla frekans açıklaması daha iyidir. (Daha iyisi öncelikle bu bağlamda daha hızlı demektir.)

Belirli bir nedenden ötürü belirtmek istediğim tekniklerden biri, doğrudan frekanslarla çalışan sanatçılar ve * frekans ayrımı *. Bunu tarif etmeyeceğim, ancak hem Photoshop hem de GIMP için YouTube'da nasıl çalıştığını görebilirsiniz.

Biri düşük frekanslı, diğeri yüksek frekanslı iki katman oluşturursunuz. Portreler için, düşük frekanslardaki cilt tonlarını etkilemeden yüksek frekanslarda cilt yumuşatma yapabilirsiniz.

kod

Bu, yukarıdaki örnekleri oluşturmak için bazı kodlardır. Basit bir Python programı olarak çalıştırılabilir.

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()

Teorik olarak, eldeki görüntünün sonsuz bilgisine sahip olduğumuzu varsayarak, onu bileşen frekanslarına ayrıştırıp kayıp olmadan yeniden kompoze edebileceğimiz açıklığa kavuşturulmalıdır ... gerçek dünyada yapamayız. Optik boru hattı boyunca her bir "arayüz" de meydana gelen gerçek dünya görüntüsünün dönüşümü, etkin bir şekilde geri dönüşü olmayan bir süreçtir. Tüm evrişim faktörlerini hiçbir zaman bilemeyiz ve bu nedenle bir FFT'nin bir görüntüye yeniden inşası zordur ve aşırı değişiklikler genellikle artefaktlara ve veri kaybına neden olur.
jrista

@jrista Unapiedra'nın geri döndürülebilirlik hakkında yaptığı nokta , bir dijital görüntü (bir bilgisayardaki piksel dizisi) ile çalıştıktan sonra , frekans alanına ve geriye gidip başladığınız görüntünün aynısını alabilmenizdi. Gerçek dünya sınırlamalarının ortaya çıktığı fiziksel görüntüleme sisteminin (lensler ve benzeri) daha büyük bir resmine bakıyorsunuz.
coneslayer

3
FT'nin bilgi kaybı için suçlandığı jrista'nın yorumu yanıltıcıdır. Elbette fotoğrafçılık kayıplı bir süreçtir ve post-processing de öyle. Ayrık bir görüntüyü Fourier Space'e dönüştürürsem, orada bazı kayıplı işlemleri yapın ve sonra geri dönüştürürüm, elbette bilgileri kaybederim. Ancak, dönüştürme adımında değil, işleme adımında olur. Doğru, makine hassasiyeti nedeniyle her matematiksel işlem bilgi kaybeder, ancak kanal görüntüleri başına 8 bit hakkında konuşursak, makine hassas hatalarını fark etmeyiz.
Unapiedra

1
@ Türkiye, bu bağlamda neden diyagonalden bahsettiğimi hatırlamıyorum. İkinci frekansın ana yönünün belirli bir köşegen gibi göründüğünü görebilirsiniz. Belki de bu yüzdendir. Sorunuzu cevaplamak için, bir 2D görüntüyü temsil etmek için yalnızca iki eksene ihtiyacınız vardır. İki eksenin dikey olması önemlidir. Yatay ve dikey eksen bu kriteri karşılar. (Ayrıca pratiktirler.) Ayrık görüntülerle (yani piksellerden oluşur), diğer adlandırma diğer açıları daha da kötüleştirecektir.
Unapiedra

1
@Turkeyphant düzeltmesi, Unapiedra birinci frekansı değil , ikinci frekansı 0, -1, 0, +1, 0 olarak tanımladı. bu paragrafı önceki görüntünün açıklaması olarak okumanın cazip gelebileceğini görün (makaleler genellikle bir görüntüyü gösterir, ardından görüntüyü izleyen metinde açıklar), ancak bu durumda değil. =)
scottbb

9

Mümkün olan en basit matematik terimlerini açıklamaya çalışacağım. Eğer matematiği atlamak istiyorsanız, bölüm II'ye atlayın, kısa cevabı almak istiyorsanız Bölüm III'e geçin

Bölüm I

Bir sinyalin frekansı, birim zamanda tekrarlanan bir olayın meydana gelme sayısı anlamına gelir. Eğer zaman birimi saniye ise frekans Herz ile ölçülür: 1Hz = 1 / s. 100Hz'lik bir sinyalin saniyede 100 kez tekrar eden bir modeli vardır.

En temel sinyal (sinyal işleme açısından) bir sinüs sinyalidir.

y (t) = günah (2πft)

burada f, bu sinüs sinyalinin frekansıdır ve t, zamandır. Bu sinyal sesliyse ve f 50Hz civarındaysa, çok düşük bir bas tonu duyarsınız. 15kHz gibi daha yüksek bir frekansta daha yüksek bir ton olacaktır.

Şimdi konsepti genelleştirmek için, sinyal geçici bir sinyal yerine bir uzaysal sinyal olabilir ... sinüs dalgasını sanki x olarak adlandırılan bir eksen sağa ve y ekseni dikey olacak şekilde bir kağıda çiziyormuşsunuz gibi x eksenine.

y (x) = günah (2πfx)

burada f, sinyalin frekansıdır ve x, uzaysal değişkendir. Burada f artık 1 / s ile değil, 1 / (boşluk birimi) ile ölçülür.

Bir Fransız matematikçi Fourier, farklı genlik ve frekanslara sahip bir dizi sinüs ve kosinüs sinyali ekleyerek herhangi bir sinyal üretebileceğinizi gösterdi. Buna Fourier Analizi denir.

Fourier analizi kullanılarak, herhangi bir y (x) fonksiyonunu farklı frekanslara sahip sinüs ve kosinüs sinyallerinin bir toplamı olarak yazmak mümkündür, bu nedenle y (x) fonksiyonu, Y (f) frekansı ile ilgili çeşitli fonksiyonlar açısından yeniden yazılabilir. Y (x) = Some_Function (Y (f)) diyebiliriz. veya Y (f) = Ters_Çok_Fonksiyonu (y (x))

Fourier Dönüşümü, bir sinyali x alanından frekans alanına dönüştüren F fonksiyonudur.

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

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

F analog bir fonksiyon, Ayrık Fourier Dönüşümü DFT, F'nin sayısal yaklaşımıdır. Hızlı Fourier Dönüşümü FFT, hız için optimize edilmiş DFT yapmanın bir yoludur.

Tamam...

Bölüm II

Artık bilgisayar görüntüleri piksellerden oluşuyor ve her pikselin RGB, Kırmızı, Yeşil, Mavi için bir yoğunluk değeri var. Gri tonlamalı görüntülerde, herhangi bir pikselin R, G, B yoğunluğu eşittir, R = G = B = I, böylece gri tonlamalı görüntüler için I hakkında konuşabiliriz.

Aşağıdaki 800 piksel X 100 piksel gri tonlamalı resim, I (x) = sin (2πfx) kullanılarak oluşturuldu; burada f = 1 tekrar / 800 piksel = 0.00125 tekrar / px

resim açıklamasını buraya girin

Python3 ile kendiniz oluşturabilirsiniz

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()

Aşağıdaki 800 piksel X 100 piksel gri tonlamalı resim I (x) = sin (2πfx) kullanılarak oluşturuldu, burada f = 10 tekrarlama / 800 piksel = 0,0125 tekrar / piksel

resim açıklamasını buraya girin

Şimdi bu görüntünün yatay frekansının 10 olduğunu görmek kolaydır. Frekansı 10 kat arttıralım, böylece n = 100. f = 100/800 = 1/8 = 0.125 tekrar / piksel:

resim açıklamasını buraya girin

Daha önce de belirtildiği gibi, herhangi bir sinyali (1D gri tonlamalı görüntü) farklı frekanslara sahip bir dizi sinüs sinyali (1D gri tonlamalı sinüs görüntüsü) olarak temsil edebilirsiniz.

Bölüm III

Bu nedenle, A'nın daha ince ayrıntıları varsa, 1D gri tonlamalı görüntü A'nın diğer gri tonlamalı görüntü B'den daha yüksek frekansları vardır.

Bu prensibi renkli 2D ve hatta 3D görüntülere genelleştirebilirsiniz. Görüntünün "ayrıntıları" ne kadar ince olursa, görüntünün frekans içeriği de o kadar yüksek olur.

Yani mavi gökyüzü, bir çiçeğin görüntüsüne kıyasla düşük frekanslıdır.

Bu konuda Fourier Analizi ve Dijital Görüntü İşleme hakkında daha fazla bilgi edinebilirsiniz.


4

Kısaca, frekans değişim hızını ifade eder. Daha kesin olarak, frekans, değişim süresinin tersidir - yani bir parlaklıktan (veya herhangi bir şeyden) farklı bir parlaklığa ve tekrar geri dönüşe kadar geçen süre. Bu durumda ne kadar hızlı değişirse (örneğin ışıktan karanlığa), görüntünün o kısmını temsil etmek için gereken görsel "frekans" o kadar yüksek olur.

Başka bir deyişle, bir görüntüdeki frekansı değişim oranı olarak düşünebilirsiniz. Görüntünün bir renkten diğerine hızla değişen kısımları (örneğin keskin kenarlar) yüksek frekanslar içerir ve yavaş yavaş değişen kısımlar (örneğin düz renklerle büyük yüzeyler) yalnızca düşük frekanslar içerir.

DCT ve FFT ve diğer benzer dönüşümler hakkında konuştuğumuzda, bunları genellikle görüntünün bir bölümünde yapıyoruz (ör. JPEG sıkıştırma, kenar algılama vb. İçin). Dönüşümler hakkında, o zaman, belirli bir büyüklükteki bir dönüşüm bloğu bağlamında konuşmak en mantıklıdır .

İsterseniz, 32 piksel x 32 piksel görüntü verisi bloğunu hayal edin. (Bu sayı isteğe bağlıdır.) Görüntünün sol tarafta beyaz, ortada siyah ve sağ tarafta beyaz olan basit bir gradyan olduğunu varsayalım. Bu sinyalin, 32 piksel genişlik başına kabaca bir dalga boyu olan bir süreye sahip olduğunu söyleyebiliriz, çünkü her 32 pikselde bir beyazdan siyaha beyaza tam bir döngüden geçer.

Bu frekansı keyfi olarak 32 piksel başına "1" - 1 döngü olarak adlandırabiliriz. Belli ki hatırlıyorum, bu genellikle dönüşüm kitaplarında θ veya belki θ / 2 olarak adlandırılır, ancak yanlış hatırlıyorum. Her iki durumda da, şimdilik 1 diyeceğiz, çünkü bu gerçekten mutlak anlamda keyfi; önemli olan, göreli anlamda frekanslar arasındaki ilişkidir. :-)

Bir kenarda beyaz olan, sonra beyazdan siyaha, beyaza, siyaha ve tekrar diğer kenarda beyaza gidecek şekilde iki kat daha hızlı solmuş ikinci bir görüntünüz olduğunu varsayalım. Daha sonra bu frekansı "2" olarak adlandırırız çünkü 32 piksel bloğun genişliği üzerinde iki kat daha sık değişir.

Bu basit görüntüleri çoğaltmak istiyorsak, kelimenin tam anlamıyla her satırın 1 veya 2 frekanslı bir sinyalden oluştuğunu söyleyebiliriz ve görüntülerin nasıl göründüğünü bilirsiniz. Görüntüler siyahtan% 50 griye giderse, aynı şeyi yapabilirsiniz, ancak% 50 yoğunlukta 1 veya 2 frekansa sahip olduklarını söylemelisiniz.

Gerçek dünya görüntüleri, elbette, sadece basit bir eğim değildir. Soldan sağa tarama yaparken görüntü sık sık değişir ve periyodik olarak değişmez. Ancak, yeterince küçük bir blokta (ör. 8 piksel, 16 piksel) bu piksel sırasını, satırdaki piksel değerlerinin ortalamasıyla başlayıp ardından " frekansı 0.5 "sinyali (bir tarafta siyah, beyaza doğru solma) karıştırmak (veya negatif bir miktar, çıkarmak için bu sinyalin miktarı), ardından frekans 1, frekans 2, frekans 4 vb. .

Artık bir görüntü her iki yönde de frekansa sahip olması bakımından benzersizdir; hem yatay hem de dikey olarak hareket ederken daha açık ve koyu hale gelebilir. Bu nedenle, 1D yerine 2D DCT veya FFT dönüşümleri kullanıyoruz. Ancak ilke hala aynı. Benzer boyuttaki kovaların 8x8 ızgarasıyla 8x8 görüntüyü tam olarak temsil edebilirsiniz.

Görüntüler ayrıca renkler nedeniyle daha karmaşıktır, ancak şimdilik bunu görmezden geleceğiz ve bir fotoğrafın kırmızı kanalına ayrı ayrı bakarak alabileceğiniz gibi yalnızca tek bir gri tonlamalı görüntüye baktığımızı varsayalım.

Bir dönüşümün sonuçlarını nasıl okuyacağınıza gelince, bu, 1D dönüştürmesine mi yoksa 2D dönüştürmesine mi baktığınıza bağlıdır. 1D dönüşümü için bir dizi bölmeniz var. Birincisi, tüm giriş değerlerinin ortalamasıdır. İkincisi, eklenecek frekans 1 sinyalinin miktarıdır, üçüncüsü eklenecek frekans 2 sinyalinin miktarıdır, vb.

2B dönüştürme için n x n değer ızgarasına sahipsiniz . Sol üst tipik olarak ortalamadır ve yatay yönde ilerledikçe, her kova 1, 2, 4 vb. Yatay frekansla karıştırılacak sinyal miktarını içerir ve dikey yönde ilerledikçe, 1, 2, 4 vb. dikey frekansla karıştırılacak sinyal miktarıdır.

Bir DCT hakkında konuşuyorsanız, elbette ki tam hikaye; aksine, bir FFT'nin her bölmesi gerçek ve hayali parçalar içerir. FFT hala aynı temel düşünceye (bir çeşit) dayanmaktadır, ancak frekansların kutulara eşlenme şekli farklıdır ve matematik daha kıllıdır. :-)

Tabii ki, bu tür dönüşümleri üretmenin en yaygın nedeni, bir adım daha ileri gitmek ve bazı verileri atmaktır. Örneğin, DCT JPEG sıkıştırmasında kullanılır. Sol üst kısımdan (ortalama) başlayıp sağ alt tarafa doğru hareket eden bir zikzak desenindeki değerleri okuyarak, en önemli veriler (ortalama ve düşük frekans bilgileri) önce kaydedilir, ardından giderek daha yüksek frekans verileri kaydedilir. Bir noktada, "bu yeterince iyi" diyorsunuz ve en yüksek frekanslı verileri atıyorsunuz. Bu, aslında ince detaylarını atarak görüntüyü pürüzsüzleştirir, ancak yine de size yaklaşık doğru görüntüyü verir.

Ve IIRC, FFT'ler bazen keskin kenarlardaki yüksek kontrast alanlarını tespit etmenin bir yolu olarak yüksek frekans bileşenleri hariç hepsini attığınız kenar tespiti için de kullanılır.

National Instruments'ın bunu resimlerle açıklayan güzel bir makalesi var. :-)


0

Görüntüyü bir fotosel ile satır satır taradığınızı ve sonuçları bir çiziciye (kağıt üzerinde siyah dalgalar yapan bu düz makineler), osiloskop (bir ekranda titrek yeşil dalgalar yapan bu kutular) veya spektrum analizörüne (spektrum analizörüne) yeşil veya çok renkli çitler yapın). Ya da bir hoparlör bile. Bir görüntüdeki yapılar ne kadar ince olursa, gösterilen / duyulan sinyalin frekansları (hoparlördeki perde) o kadar yüksek olacaktır. İnce yapılarda ne kadar kontrast varsa, sinyalin yüksek frekanslı kısımlarının genliği o kadar yüksek olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.