[英]Scaling fft2 after zeropad frequency domain
我有一個帶有兩個圓圈的圖像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,所以現在我只有I3 =(100x100),僅圓A。對於此圖像,我再次應用FFT2,並僅將FT的中心作為50x50的一部分,然后執行IFFT2得到另一個圖像PSF =(50x50),在這里我可以看到該圓的點擴展函數(PSF)。
FT = fftshift(fft2(I3));
FTcenter = FT(25:75,25:75);
I4 = ifft2(ifftshift(FTcenter));
同樣,我是否也應該在此處應用任何縮放比例?
我喜歡將內置的interpft
用於基於FFT的正弦插值,因為它消除了零填充,移位,縮放等所有edit interpft
(並且您可以檢查它的工作方式: edit interpft
,這都是合法的) 。 它僅執行一維插值,但是您可以在兩個維度上對二維進行兩次插值。
我制作了一個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')
仔細查看此結果,您會發現為什么放大后的數組的最小值/最大值比原始值寬:這種正弦插值會導致Gibbs在圖像的尖銳過渡處(如圓邊) 響起 ,從而導致放大后的圖像超過峰值和降低谷值。
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')
這是上采樣circles-mask.png
蒙版(黑色表示要保留的數據):
這是生成的psf
圖像(反轉),與沒有小圓圈的原始circles.png
圖像相同:
看起來,由於線性原因,在2x上采樣圖像中應用蒙版等效於在原始圖像中應用較小的蒙版。
因此,我應該問我上面所做的工作是否與您要使用PSF進行的工作相符? 我想再次強調一下,您在問題中描述的插值和抽取步驟(FFT→zeropad→IFFT和FFT→保持中心→IFFT) 恰好是interpft
功能(加上簿記以確保幅度和對稱性正確) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.