图像的傅里叶变换

信息处理 图像处理 matlab fft 傅里叶变换 IFFT
2022-02-17 20:37:01

我正在做一个项目,我需要在 MATLAB 中对照片进行 FFT 和 IFFT。光学原理中,来自透镜的强度分布等于光最初通过的光圈的傅里叶变换。我在寻找理想来源的 FFT 和 IFFT 时遇到问题。

圆形孔径应具有称为艾里斑的强度模式,这应由圆的傅立叶变换产生。这是我在代码中使用的 Airy 磁盘的照片:

在此处输入图像描述

对艾里斑进行傅里叶逆变换应该会得到一个圆形光圈的图像,但是当我转换为 uint8 时,我所看到的只是黑色。如果我将其保留为 double 类型,那么我会在角落看到类似艾里斑的东西。这是我正在使用的代码:

pic=imread('airy.jpg');  
pic=rgb2gray(pic); %Convert to grayscale  
imshow(pic)  
title('Initial');  

pic=double(pic); %Convert to double before transforms  
pic=ifft2(pic); %Take IFFT of Airy disk  
pic=real(pic); %Take real part  

figure()  
pic=uint8(pic); %If commented out, black screen has Airy disks in corners  
imshow(pic);  

有没有人知道为什么艾里斑的IFFT不返回一个圆圈?谢谢

1个回答

你有它的要点,但有几个问题。抱歉,我没有 MATLAB,但我会尽力为您提供类似 MATLAB 的伪代码供您使用。

主要问题是您的艾里斑是图像,即仅振幅(拍摄的结果abs)。要重建圆形孔径,您还需要相位。这是首先生成复杂艾里斑 (PSF) 的代码,然后您可以从中重建圆形孔径(瞳孔函数)。从此文件开始,circ.jpg

一个圆形光圈

pupil = imread('circ.jpg');
pupil = rgb2gray(pupil);
% use fftshift to block-swap the fft output (move DC to the center)
complex_airy = fftshift(fft2(pupil));

% now, starting with this complex airy pattern, you were close:
pupil_reconstructed = ifft2(complex_airy);
pupil_reconstructed = abs(pupil_reconstructed);

下面是 complex_airy 模式的幅度和相位,分别使用abs(complex_airy)和获得angle(complex_airy)(我只包括了图像的中心,以显示细节。)您最初方法的问题是它是一个格式错误的逆问题:单个艾里幅度模式可以对应于无限数量的瞳孔函数。当您仅对幅度进行逆变换时,您假设相位处处为零,从下面的相位图像中可以清楚地看出,事实并非如此。有统计方法可以仅从艾里振幅估计瞳孔函数,使用从光源属性和光学系统收集的许多其他约束,但我认为这不是你所追求的。

伊姆古尔 伊姆古尔