2014-09-13 21 views
7

kullanarak bir görüntü kaydırılması. Ben:Matlab'ı - ki burada X, yer değiştirme onun <code>fft</code> exp (j * 2 * pi * x * K), çarpma kullanılarak (2D matrisi ile temsil edilir), bir geçiş yapmasını isteyen FFT

input=peaks(200); 
H=fftshift(fft2(fftshift(input))); 
x=19; 
H=H*exp(-1i*x*2*pi*F); 
IF_image=fftshift(ifft2(fftshift(H))); 
imshow(IF_image) 

Ama sorunlar, benim giriş yana H F [F] temsil eden/tanımlama having 2 boyutlu bir dizidir. Bunu nasıl yapabilirim? İstenilen çıktı, orijinal çerçevemde yatay eksende (x birimlerle) aynı çerçevede kaydırılarak x + 1 ile başlayacaktır. Örnek olarak:

1 2 3 4 5 
6 7 8 9 0 

x = 2 input=, ben istiyorum:

4 5 1 2 3 
9 0 6 7 8 
+0

sadece "circshift" kullanmak daha kolay değil mi? – bla

+0

Evet, öyle. Ama prensipte, bu, ilgilendiğim açıklanan yöntemi kullanarak yapılabilir. (: – Pythonice

+0

@CeciliaGuerra - "circshift" ile katılıyorum, ama bunu Fourier Transform'in çeviri/vardiya mülkünün bir gösterimi olarak yaptığınızı farz ediyorum. Her iki durumda da bir cevap yazdım. – rayryeng

cevap

11

Sen 1D değişen/çeviri için özellik belirledi. 2D için, biraz farklı ama aynı prensibe dayanıyor.

enter image description here

x0,y0 sen tanıtmak istiyorum kayması olacaktır: 2D çevirisini elde etmek için, bu gibi tanımlanır çeviri/vardiya tesistir. Bu şekilde, x0'un pozitif değeri 2D sinyalinizi sağa kaydırırken, negatif bir değer sola kayar. Benzer şekilde, y0'un pozitif değeri, 2B görüntünüzü aşağı doğru kaydırırken, negatif bir değer yukarı doğru kayardı.

nedenle, 2D olarak Transform senin Fourier göz önüne alındığında, üs için ek bir terim eklemeniz gerekir. Ayrıca, numaralı telefonun N tarafından normalleştirilmesi veya 2B sinyalinizin boyutu. Bu, 2D sinyalinizin aynı sayıda satır ve sütuna sahip olduğunu varsayar. Bu durumda, o zaman u*x0 almak zorunda kalacaksınız ve sütun sayısına göre bölünecek ve v*y0 satırların sayısına bölünecektir. 2 boyutta bu nasıl tanımlanacağı emin olmadıklarından
Şimdi, yukarıdaki kodda F kafası karıştı nedeni budur. 2D ızgarası'daki her nokta için frekans değerini tanımlamanız gerekir. 2D sinyal büyüklüğü 200 x 200 ve bu ortasında olmak bizim 2D sinyalini ortalamak gibi Çünkü senin fftshift aramanın, biz, -100 ile 99 arasında x ve y değerleri tanımlamak olacaktır. Bu aslında fftshift'un yapmasıdır. Benzer şekilde, ifftshift, fftshift tarafından yapılan merkezlemeyi kaldırır. Bu noktaları 2D olarak tanımlamak için meshgrid kullanıyorum. Bu noktaları tanımladıktan sonra, her bir çift (x,y) koordinatını alırsınız, daha sonra yukarıdaki özellikte gördüğünüz gibi karmaşık üsteli yaratırsınız.

Aynı şekilde, kod, bu şekilde modifiye edilmesi gerekir. Orijinal kodunuzda gereksiz fftshift ve ifftshift çağrılarından kurtuldum. fft'u arayarak spektrumu ortalamak için fftshift'u kullanırsınız. Ben de input MATLAB'da bir fonksiyondur olarak, in için değişken input değişti ve biz istemeden bir değişkenle işlevi gölge istemiyoruz.

Ayrıca, x geçişini -35 olarak tanımladım ve y geçişi -50 olarak değişti. Bu, elde edilen sinyalin sola 35 ve 50'ye kalacağı anlamına gelir.Bu nedenle

: Ben sonuçta resmin gerçek bileşeni görüntülenen

in=peaks(200); %// Define input signal 
H=fftshift(fft2(in)); %// Compute 2D Fourier Transform 
x0=-35; %// Define shifts 
y0=-50; 

%// Define shift in frequency domain 
[xF,yF] = meshgrid(-100:99,-100:99); 

%// Perform the shift 
H=H.*exp(-1i*2*pi.*(xF*x0+yF*y0)/200); 

%// Find the inverse Fourier Transform 
IF_image=ifft2(ifftshift(H)); 

%// Show the images 
figure; 
subplot(1,2,1); 
imshow(in); 
subplot(1,2,2); 
imshow(real(IF_image)); 

dikkate alın. Bunun nedeni, ters Fourier Dönüşümü'nü aldıktan sonra, bazı sayısal belirsizlikler olabilir ve sinyalin karmaşık kısmı aslında oldukça küçüktür. Sinyalin gerçek bileşenini kullanarak bunu görmezden gelebiliriz. Yukarıda görülen özelliği tarafından doğrulanmadı olarak

enter image description here

Gördüğünüz gibi, görüntü, düzgün vardiya vermedi:

Bu

alıyorum resimdir. Farklı vardiyaları belirtmek isterseniz, zevkinize uyacak şekilde x0 ve y0'u değiştirmeniz gerekir. Sizin durumunuzda, y0 = 0 belirtecektiniz, daha sonra x0 yatay çeviri yapmak istediğiniz her şey olabilir.

+0

@Sandino - Can ' Bu yazım hatası fark etmediğime inanıyorum.Bu soruyu çok uzun zaman önce cevaplandırdım. – rayryeng

İlgili konular