image - fft2 - labels and titles matlab
MatLab-Cambiando una imagen usando FFT (1)
Identificó la propiedad para traducción / desplazamiento en 1D. Para 2D, es un poco diferente pero basado en el mismo principio. Para lograr la traducción en 2D, esta es la propiedad de traducción / cambio, que se define como:
x0,y0
sería el cambio que desea introducir. Como tal, el valor positivo de x0
desplazaría su señal 2D hacia la derecha, mientras que un valor negativo se desplazaría hacia la izquierda. De manera similar, un valor positivo de y0
desplazaría su imagen 2D hacia abajo, mientras que un valor negativo se desplazaría hacia arriba.
Por lo tanto, dada su Transformada de Fourier en 2D, necesitaría agregar un término adicional al exponente. Además, debe normalizar por N
o el tamaño de su señal 2D. Esto supone que su señal 2D tiene el mismo número de filas y columnas. Si este no es el caso, entonces tendría que tomar u*x0
y se dividiría por el número de columnas y v*y0
se dividiría por el número de filas.
Ahora, la razón por la que está confundido acerca de F
en su código anterior es porque no está seguro de cómo definir esto en 2D. Debe definir un valor de frecuencia para cada punto en la grilla 2D . Debido a su llamada fftshift
, definiríamos los valores x
e y
entre -100 y 99, ya que su señal 2D es de un tamaño de 200 x 200 y esto centraría nuestra señal bidimensional en el centro. Esto es en realidad lo que está haciendo fftshift
. Del mismo modo, ifftshift
deshace el centrado realizado por fftshift
. Para definir estos puntos en 2D, utilizo meshgrid
. Una vez que defina estos puntos, tomaría cada par de coordenadas (x,y)
luego crearía la exponencial compleja como puede ver en la propiedad anterior.
Como tal, tu código debería ser modificado de esta manera. Tenga en cuenta que me deshice de fftshift
redundantes fftshift
y ifftshift
en su código original. fftshift
a fft
, luego harías fftshift
para centrar el espectro. También cambié tu input
variable a in
, ya que la input
es una función en MATLAB, y no queremos sombrear involuntariamente la función con una variable.
También he definido el cambio x
para ser -35, y el cambio y
para ser -50. Esto significará que la señal resultante se desplazará hacia la izquierda en 35, y hacia arriba en 50.
Por lo tanto:
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));
Tenga en cuenta que visualicé el componente real de la imagen resultante. Esto se debe al hecho de que una vez que tomas la Transformada de Fourier inversa, puede haber cierta imprecisión numérica y la parte compleja de la señal es bastante pequeña. Podemos ignorar esto simplemente usando el componente real de la señal.
Esta es la imagen que obtengo:
Como puede ver, la imagen se desplazó correctamente, según lo verificado por la propiedad vista arriba. Si desea especificar diferentes turnos, solo necesita cambiar x0
y y0
para adaptarlo a sus gustos. En su caso, debe especificar y0 = 0
, luego x0
puede ser lo que desee ya que desea una traducción horizontal.
Quiero desplazar una imagen (representada por una matriz 2D) usando la multiplicación de su fft
por exp (-j * 2 * pi * x * F), donde x es el desplazamiento. Yo tengo:
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)
Pero estoy teniendo problemas identificando / representando la F en H [F] ya que mi entrada es una matriz bidimensional. ¿Cómo podría hacer esto? La salida deseada será mi imagen original desplazada en el eje horizontal (por x unidades) en el mismo marco, por lo que comenzaría en x + 1. Como ejemplo:
Si input=
1 2 3 4 5
6 7 8 9 0
y x = 2, quiero:
4 5 1 2 3
9 0 6 7 8