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

How do I swap the phase responses of two images?

我将 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) 中的复数。对吗?

是的,您是正确的,因为您需要操纵相位响应。但是,您没有正确交换相位响应。为了正确地完成您的要求,您 还必须 还提取每个图像的大小。回想一下复数分析,您可以根据信号的幅度和相位来表示信号的频率响应:

因此,如果你想交换两个图像之间的相位响应,你只需要为输出响应中的每个元素计算上面的等式,你在其中获取幅度并乘以相位的指数及其参数乘以复数 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, []);

例子

让我们载入摄影师图像和山魈图像,但我们要确保将山魈图像的大小调整到与摄影师图像相同的大小,因为山魈图像更大。在这种情况下,我想向您展示两个图像大小相同时的结果:

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

它们如下所示:

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

如您所见,图像的主要结构已经交换。在山魈图像中可以看到摄影师,反之亦然。关键是相位在图像中物体的结构中起着重要作用,而不仅仅是大小......我认为这是这个探索性练习的重点 - 让你得出这个结论。