2012-11-15 19 views
6

FFT kullanarak frekans etki alanına dönüştürmek istediğim bir görüntü var, Java için bunun için kütüphane eksikliği var gibi görünüyor, ancak iki tane buldum. Biri JTransforms, diğeri daha az biliniyordu ve bir ismi yoktu.JTransforms FFT on Image

Daha az bilinen bir tanesine göre, 2D, iki iktidarın uzunluk değerlerini ancak FastFourierTransform.fastFT(real, imaginary, true); gibi basit kullanım yöntemlerine sahipti ve gerçek her bir piksel değeriyle dolu ikiye katlanmış bir çiftler dizisi ve sanal bölüm bir 2B'dir. aynı büyüklükte sıfırlar dizisi. Boole değeri, ileri veya ters dönüşüme bağlı olacaktır. Bu benim için mantıklıydı ve benim yaptığım herhangi bir dönüşümü mahveden iki gereksinimin gücü dışında çalıştı (başlangıçta ikiye en yakın güce uyacak şekilde resmin etrafına siyah boşluk ekledim). JTransforms için eşdeğer yöntemleri kullanmak ve bunu yaparken herhangi bir rehberlik takdir edecektir. Şu anda ne yaptığımı anlatacağım.

İlgili sınıfın DoubleFFT_2D olması gerektiğine inanıyorum, yapıcım görüntünün genişliği ve yüksekliğini alacağımı düşündüğüm bir dizi satır ve sütun alır. Görüntünün hiçbir hayali parçası olmadığından, sanırım hayali parçaları sıfır olarak ele alan ve gerçek 2D dizisini piksel dolu geçiren doubleFFT.realForwardFull(real);'u kullanabilirim. Ne yazık ki bu hiç işe yaramıyor. JavaDoc, the input array must be of size rows*2*columns, with only the first rows*columns elements filled with real data numaralı durumu belirtir. Ancak bunun görüntü ile nasıl bağlantılı olduğunu ve bu gereksinimi karşılamak için ne yapmam gerektiğini göremiyorum.

Herhangi bir ek bilgi gerekiyorsa, uzun ve kötü bir açıklama için özür dilerim Bunu sağlamaktan mutluluk duyarım.

JTransforms Kütüphane ve Dokümanlar burada bulabilirsiniz: https://sites.google.com/site/piotrwendykier/software/jtransforms

cevap

5

Bu JTransforms için dokümantasyon çok kötü sıkıştırılmış download dışındaki çevrimiçi kullanılamaz. Çok eksiksiz ve yardımsever, kontrol etmelisin!

Sorunuzu yanıtlamak için: DoubleFFT_2D.realForwardFull(double[][] a) bir dizi gerçek sayıyı (pikselleriniz) alır. Bununla birlikte, FFT'nin sonucu her bir giriş değeri için iki çıkış değerine sahip olacaktır - her bir frekans kutusunun gerçek ve hayali kısmı. Bu nedenle, giriş dizinizin gerçek resim dizisinin iki katı büyük olması gerekir, bunun yarısı boş/sıfır ile doldurulur.

Tüm FFT işlevlerinin yalnızca giriş için değil, aynı zamanda çıktı için de a kullandığını unutmayın - buradaki herhangi bir resim verisi kaybolur, bu nedenle zaten farklı/büyük bir diziye kopyalamak istenebilir!

Sizin senaryo için kolay ve açık düzeltme yerine DoubleFFT_2D.realForward(double[][] a) kullanmak olacaktır. Bu sadece pozitif spektrumu hesaplayacaktır, çünkü negatif taraf ona simetrik olacaktır. Bunun nedeni, giriş değerlerinin gerçek olmasıdır. Ayrıca

, bu sonradan dizide :) Aslında

+0

adresinin sonuçlarını almak için daha kolay bir sürü yapacak JTransforms içinde RealFFTUtils_2D sınıfı, kontrol, (yeni) docs github online artık görünür : http://wendykierp.github.io/JTransforms/apidocs/ –