在zeropad频域之后缩放fft2

时间:2016-07-21 12:38:41

标签: matlab fft padding scaling

我的图像I1 =(50x50),有两个圆圈 - A(像素的强度值为100)和B(强度值为500)。

我想将图像调整为I2 =(100x100)。我开始做图像的FFT2,之后我将其填零,使FT成为100x100的矩阵,然后再次进行IFFT2。

FT = fftshift(fft2(M)); 
FT = padarray(FT,[50 50]);
I2 = ifft2(ifftshift(FT));

所以现在我有一张尺寸为100x100的新图像,但现在圆圈的幅度不同了。如何更正此缩放问题?

在此之后我应用一个遮罩来仅选择圆圈A,所以我现在只有圆圈A的I3 =(100x100)。对于这个图像我再次应用FFT2并且仅在此中心使用50x50部分FT和做IFFT2得到另一个图像PSF =(50x50),我可以看到这个圆的点扩散函数(PSF)。

FT = fftshift(fft2(I3)); 
FTcenter = FT(25:75,25:75);
I4 = ifft2(ifftshift(FTcenter));

同样,我应该在这里应用任何缩放吗?

1 个答案:

答案 0 :(得分:0)

我喜欢使用内置的interpft进行基于FFT的sinc插值,因为它可以完成零填充,移位,缩放等所有工作(并且您可以检查它是如何做到的: edit interpft,这一切都是合法的。它只进行1D插值,但您可以在2D维度上运行两次。

我制作了一张100 x 100灰度图像,其中包含两个圆圈,最小/最大强度[29,255]:

Start image

然后,在Matlab REPL:

>> im = double(imread('circles.png'));
>> whos im
  Name        Size             Bytes  Class    Attributes

  im        100x100            80000  double

>> imup = interpft(interpft(im, 2*size(im,1), 1), 2*size(im,2), 2);
>> whos imup
  Name        Size              Bytes  Class     Attributes

  imup      200x200            320000  double

这会创建2倍上采样图像。它的最小值和最大值是[23.059,271.66],超出原始[29,255]的范围,因此我将放大的图像的值重新缩放以与原始图像保持相同的边界,转换为uint8 ,并将其另存为PNG:

>> rescaled = interp1([min(imup(:)), max(imup(:))], [min(im(:)), max(im(:))], imup);
>> imwrite(uint8(rescaled), 'circles-up.png')

upsampled

仔细观察这个结果,你可以看到为什么放大的数组的最小值/最大值比原始值更宽:这种sinc插值导致Gibbs ringing处于图像中的急剧过渡,如圆边,这会导致放大的图像超出峰值并低于低谷。

interpft可以插值(上采样)以及抽取(下采样)。所以这里是一个完整的脚本 - 一个调整:我“反转”我原始图像的颜色,所以背景是黑色而不是白色:这使掩盖更容易:

clearvars
interpft2 = @(x, sz) interpft(interpft(x, sz(1), 1), sz(2), 2);

im = 255 - double(imread('circles.png'));
imup = interpft2(im, 2*size(im));

mask = double(imread('circles-mask.png')) ~= 255;
psf = interpft2(mask .* imup, round(size(imup) / 2));
imwrite(uint8(255 - round(psf)), 'psf.png')

以下是upsampled circles-mask.png掩码(其中黑色表示保留的数据):

mask

这是生成的psf图片(倒置),与没有小圆圈的原始circles.png图片相同:

point spread function

看起来,由于线性,在2倍上采样图像中应用蒙版相当于在原始图像中应用较小的蒙版。

所以我应该问一下,我上面做的是否符合您尝试用PSF做的事情?我想再次强调你在问题中描述的插值和抽取步骤(FFT→zeropad→IFFT和FFT→保持中心→IFFT)正好 interpft所做的(加上簿记,以确保振幅和对称是正确的。)

相关问题