2014-09-13 2 views
7

Я хочу сместить изображение (представленное 2D-матрицей), используя умножение его fft на exp (-j * 2 * pi * x * F), где x - смещение. У меня есть:MatLab - Смещение изображения с использованием 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) 

Но у меня проблемы идентификации/представляющих F в H [F], так как мой вход является 2 одномерный массив. Как я могу это сделать? Желаемый результат будет моим исходным изображением, сдвинутым по горизонтальной оси (на х единиц) в том же кадре, чтобы он начинался с x + 1. В качестве примера:

Если input=

1 2 3 4 5 
6 7 8 9 0 

и х = 2, я хочу:

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

просто сказал, не проще ли использовать 'circshift'? – bla

+0

Да, это так. Но в принципе это можно сделать, используя описанный метод, в котором я заинтересован. (: – Pythonice

+0

@CeciliaGuerra - Я согласен с 'circshift', но я предполагаю, что вы делаете это как демонстрацию способности перевода/сдвига преобразования Фурье. В любом случае, я написал ответ. – rayryeng

ответ

11

Вы определили свойство для перевода/перехода в 1D. Для 2D это немного отличается, но основано на том же принципе. Для достижения перевода в 2D, это перевод/свойство сдвига, который определяется как:

enter image description here

x0,y0 будет сдвиг вы хотите ввести. Таким образом, положительное значение x0 переместит ваш 2D-сигнал вправо, а отрицательное значение сдвинется влево. Аналогично, положительное значение y0 перенесет ваш 2D-изображение вниз, в то время как отрицательное значение сдвинется вверх.

Поэтому, учитывая ваше преобразование Фурье в 2D, вам нужно будет добавить дополнительный показатель экспоненте. Кроме того, вы должны нормализовать на N или размер вашего двумерного сигнала. Это предполагает, что ваш двумерный сигнал имеет одинаковое количество строк и столбцов. Если это не так, то вам нужно будет принять u*x0, и вы разделите его на количество столбцов, а v*y0 будет разделено на количество строк.
Теперь причина, по которой вы запутались в F в приведенном выше коде, заключается в том, что вы не знаете, как определить это в 2D. Вы должны определить значение частоты для каждой точки в 2D-сетке. Из-за вашего вызова fftshift мы определяем значения x и y между -100 и 99, так как ваш 2D-сигнал имеет размер 200 x 200, и это будет центрировать наш 2D-сигнал в середине. На самом деле это то, что делает fftshift. Аналогично, ifftshift отменяет центрирование, выполняемое fftshift. Чтобы определить эти точки в 2D, я использую meshgrid. Как только вы определяете эти точки, вы берете каждую пару координат (x,y), а затем создавайте сложную экспоненту, как показано в приведенном выше свойстве.

Таким образом, ваш код должен быть изменен таким образом. Имейте в виду, что я избавился от избыточных fftshift и ifftshift звонков в вашем исходном коде. Вы бы назвали fft, затем сделайте fftshift, чтобы центрировать спектр. Я также изменил вашу переменную input на in, так как input - это функция в MATLAB, и мы не хотим непреднамеренно теневать функцию с переменной.

Я также определил сдвиг x на -35, а сдвиг y будет -50. Это будет означать, что результирующий сигнал сдвинется влево на 35 и вверх на 50.

Поэтому:

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

Примите к сведению, что я проявил реальный компонент результирующего изображения. Это связано с тем, что, как только вы примете обратное преобразование Фурье, может быть какая-то числовая неточность, а сложная часть сигнала на самом деле довольно мала. Мы можем игнорировать это, просто используя реальную составляющую сигнала.

Это изображение я получаю:

enter image description here

Как вы можете видеть, изображение было смещение правильно, проверяемого имущества видели выше. Если вы хотите указать разные смены, вам просто нужно изменить x0 и y0 в соответствии с вашими вкусами. В вашем случае вы должны указать y0 = 0, тогда x0 может быть любым, что вы хотите, если хотите горизонтальный перевод.

+0

@Sandino - Can ' Я верю, что не заметил этой опечатки. Я так давно ответил на этот вопрос. Спасибо за исправление. – rayryeng

Смежные вопросы