image - 图像的零填充傅里叶

标签 image matlab image-processing fft

我正在尝试解决一个问题, 给定大小为 N,M 且具有傅里叶变换 F 的图像 f(x,y)。 我们定义函数g,其傅立叶变换G定义如下:

G(x,y)=F(x,y) 如果 x

这意味着我们用零填充图像。 我尝试使用 matlab 和以下代码进行检查:

i1 = imread('1.bmp');
i1 = im2double(i1);
k=fft2(i1);
newmat = padarray(k,[84,84],0,'post');
mat2=ifft2(newmat);
imshow(mat2);

出于某种原因,我得到了一个复杂的矩阵,我无法真正说出一些有趣的事情, 我缺少什么? (澄清一下,我尝试的图像尺寸为 84x84)。

谢谢!

最佳答案

填充必须添加高频,这不是你正在做的。对于 1D FFT FF(2)F(end) 对应于相同的频率 - 在 2D 中这是完全相同的,对于沿每个图像维度的每个图像线。通过扩展数组并用零填充,您将创建一个新的 F(end)。该值不再与 F(2) 中的值匹配。为了使逆变换成为实值,这两个值应该是彼此的复共轭。

解决方案是在数组的中间添加填充,即最高频率所在的位置。最简单的方法是首先使用 fftshift 将零频率移动到阵列的中心,然后填充阵列周围,然后移回:

k = fft2(i1);
k = fftshift(k);
k = padarray(k,[84,84]/2,'both');
k = ifftshift(k);
mat2 = ifft2(k);

通过这种方式,您可以保留实值图像的傅里叶变换所期望的共轭对称性。


OP 似乎对在傅里叶谱的不同部分用零填充时会发生什么感到困惑。这是一个小实验:

% Create a test image, a simple Gaussian, purely real-valued
x = linspace(-3,3,84);
img = exp(-0.5*x.^2);
img = img.' * img;
imshow(img)

input image

% OP's method
k = fft2(img);
k = padarray(k,[84,84],0,'post');
k = complex(k); % This line does nothing
out = ifft2(k) * 4;
subplot(1,2,1); imshow(real(out)); title('real part')
subplot(1,2,2); imshow(imag(out)); title('imaginary part')

output

% Correct method
k = fft2(img);
k = fftshift(k);
k = padarray(k,[84,84]/2,'both');
k = ifftshift(k);
out = ifft2(k) * 4;
subplot(1,2,1); imshow(real(out)); title('real part')
subplot(1,2,2); imshow(imag(out)); title('imaginary part')

output

正如您所看到的,当填充“post”时,您在傅里叶域中引入了不对称性,该不对称性转化为空间域中的非真实图像。相反,按照我在这个答案中指示的填充可以保留共轭对称性,从而保留实值输出(虚部全黑)。

(抱歉图像周围有所有空白)

关于image - 图像的零填充傅里叶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52575913/

相关文章:

PHP HTML图像输出

php - 扩展图像类

java - JLabel 获取图像

matlab - 计算 eigs 时出现神秘的 matlab 错误

matlab - 在 Matlab 中生成三角分布

php - 调整图像设置最小宽度和最大高度

c++ - opencv C++ 中非均匀光照物体的检测

javascript - Summernote图片上传

matlab - 我如何在 Matlab 中创建这个矩阵?

c# - 将图像转换为灰度并行循环