如何交换两个图像的相位响应?

时间:2016-11-02 17:09:13

标签: matlab image-processing signal-processing fft phase

我将FFT应用于每个图像。我提取了图像1和2的角度或相位。之后,我想交换两个图像之间的相位响应,但保持大小完整。我到目前为止的代码是:

Image1=double(imread('/home/anelmad/Desktop/ml/signal_images_processing/tp6/barbara.png'))/255;
Image2=double(imread('/home/anelmad/Desktop/ml/signal_images_processing/tp6/lena.bmp'))/255;
Image1=fft2(Image1);
Image2=fft2(Image2);

figure(1);
imshow(angle(Image1));
x=(angle(Image1));
angle(Image2)=x;

figure(2);
imshow(Image2);

我收到此错误:

error: assignment failed, or no method for '<unknown type> = matrix'

我认为问题是我们应该修改傅立叶变换矩阵(fft2)中的复数。这是对的吗?

1 个答案:

答案 0 :(得分:9)

是的,你是正确的,因为你需要操纵相位响应。但是,您没有正确地交换相位响应。要正确地执行您要求的操作,必须也会提取每个图像的幅度。回想一下复杂分析,您可以根据其幅度和相位来表示信号的频率响应:

因此,如果要交换两个图像之间的相位响应,您只需要计算输出响应中每个元素的上述等式,其中您将获取幅度并乘以相位的指数乘以其参数乘以乘以复数1j。此外,在计算两个图像的最终频率响应时,您必须确保交换两个角度。我还要将两个图像的频率响应变量分别称为Image1_FFTImage2_FFT。需要注意的是,您必须确保两个图像之间的FFT大小相同或不起作用。因此,我们可以确定两个图像之间的最大尺寸是什么,在两个维度中使用这些多个点进行FFT,然后当我们采用逆向重建图像时。请注意,我们不会裁剪结果,因为它会以更明显的方式显示结果。如果两个图像的大小相同,那么说明这些结果的最佳效果就是。

% Read the images in   
Image1=double(imread('/home/anelmad/Desktop/ml/signal_images_processing/tp6/barbara.png'))/255;
Image2=double(imread('/home/anelmad/Desktop/ml/signal_images_processing/tp6/lena.bmp'))/255;

% Find dimensions and extent of the FFT
[rows1, cols1] = size(Image1);
[rows2, cols2] = size(Image2);

rows = max(rows1, rows2);
cols = max(cols1, cols2);

% Take the FFT
Image1_FFT=fft2(Image1, rows, cols);
Image2_FFT=fft2(Image2, rows, cols);

% NEW - Find the magnitudes and phase responses
mag1 = abs(Image1_FFT);
mag2 = abs(Image2_FFT);
pha1 = angle(Image1_FFT);
pha2 = angle(Image2_FFT);

% Recompute frequency responses by swapping the phases
out1 = mag1 .* exp(j*pha2);
out2 = mag2 .* exp(j*pha1);

% Find the inverse images
out1 = real(ifft2(out1));
out2 = real(ifft2(out2));

% Show the images
figure;
imshow(out1, []);
figure;
imshow(out2, []);

实施例

让我们加载摄影师图像和心轴图像,但是当mandrill图像更大时,让我们确保将mandrill图像调整到与摄影师图像相同的大小。在这种情况下,我想向您展示两个图像大小相同的结果:

Image1 = im2double(imread('cameraman.tif'));
load mandrill;
clear caption;
Image2 = X / 255; clear X;
Image2 = imresize(Image2, 0.5, 'bilinear');

它们如下所示:

enter image description here

enter image description here

当我们交换两个图像的相位响应并在事后重建图像时会发生这种情况:

enter image description here

enter image description here

如您所见,图像的主要结构已被交换。摄影师在mandrill图像中看到,反之亦然。关键在于阶段在图像中的对象结构中起着重要作用,而不仅仅是我认为这是探索性练习的重要性 - 为了得出这个结论。