我的图像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));
同样,我应该在这里应用任何缩放吗?
答案 0 :(得分:0)
我喜欢使用内置的interpft
进行基于FFT的sinc插值,因为它可以完成零填充,移位,缩放等所有工作(并且您可以检查它是如何做到的: edit interpft
,这一切都是合法的。它只进行1D插值,但您可以在2D维度上运行两次。
我制作了一张100 x 100灰度图像,其中包含两个圆圈,最小/最大强度[29,255]:
然后,在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')
仔细观察这个结果,你可以看到为什么放大的数组的最小值/最大值比原始值更宽:这种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
掩码(其中黑色表示保留的数据):
这是生成的psf
图片(倒置),与没有小圆圈的原始circles.png
图片相同:
看起来,由于线性,在2倍上采样图像中应用蒙版相当于在原始图像中应用较小的蒙版。
所以我应该问一下,我上面做的是否符合您尝试用PSF做的事情?我想再次强调你在问题中描述的插值和抽取步骤(FFT→zeropad→IFFT和FFT→保持中心→IFFT)正好 interpft
所做的(加上簿记,以确保振幅和对称是正确的。)