二维图像(数组)的fftshift

功能

自行编写二维图像的fftshift,并进行测试

环境

Matlab

fftshift是啥

将零频分量移到频谱中心
Y = fftshift(X) 通过将零频分量移动到数组中心,重新排列傅里叶变换 X。
如果 X 是向量,则 fftshift 会将 X 的左右两半部分进行交换。
如果 X 是矩阵,则 fftshift 会将 X 的第一象限与第三象限交换,将第二象限与第四象限交换。
如果 X 是多维数组,则 fftshift 会沿每个维度交换 X 的半空间。

fftshift的效果

在这里插入图片描述
左边为fftshift前的效果,右边为fftshift后的效果(32*32)

定义8*8的二维数组,依次填充1:64
在这里插入图片描述
变换前后的效果如图所示

找规则

对变换前后的结果作差
在这里插入图片描述
可以发现,二维数组分为四个部分
在这里插入图片描述
地址变换关系可以总结为如上公式

测试

经过测试,自编的fftshift在效果上与fftshift完全相同,但是只能适用于偶数阶方阵,但是对于奇数阶方阵或者矩阵而言,也有其固有的关系,可以自行总结。

Code

以下代码不能直接运行,仅供参考。建议修改后分块运行,有问题可以评论区交流。

%% 生成地址方阵
m = 8;
n = 8;
addr = 1:m*n;
a_shrink = reshape(addr, m, n);
a_shrink = a_shrink';
disp("---");
disp(a_shrink);
figure; imshow(a_shrink, []);
%% 生成数据方阵
m = 8;
n = 8;
data = 1:n;
data = repmat(data', m, 1);
data_shrink = reshape(data, m, n);
data_shrink = data_shrink';
disp("---");
disp(data_shrink);
figure; imshow(data_shrink, []);
%% fftshift
a_f = fftshift(a_shrink);
disp("---");
disp(a_f);
figure; 
subplot(1,2,1); imshow(a_shrink, []);
subplot(1,2,2); imshow(a_f, []);
disp("---");
disp(a_f-a_shrink);

%% myfftshift
% +-(n*m/2 +-m/2)
a_addr_s = a_shrink;

a_addr_f(1:m/2, 1:n/2)      = a_addr_s(1:m/2, 1:n/2)     + (n*m/2 +m/2);
a_addr_f(1:m/2, n/2+1:n)    = a_addr_s(1:m/2, n/2+1:n)   + (n*m/2 -m/2);
a_addr_f(m/2+1:m, 1:n/2)    = a_addr_s(m/2+1:m, 1:n/2)   - (n*m/2 -m/2);
a_addr_f(m/2+1:m, n/2+1:n)  = a_addr_s(m/2+1:m, n/2+1:n) - (n*m/2 +m/2);

% disp(a_addr_f-a_f);
%% test myfftshift
load('I1.mat');
I1_expand = reshape(I1', 1, []); % 按行展开为行向量
I2_expand = zeros(1, m*n);
for i=1:m*n
   I2_expand(i) = I1_expand(a_addr_f(i));
end
I2 = reshape(I2_expand, m, n);
I2 = I2';

figure; 
subplot(1,2,1); imagesc(abs(I1));        axis square; axis on; colormap(jet(255)); colorbar; title('before');
subplot(1,2,2); imagesc(abs(I2));        axis square; axis on; colormap(jet(255)); colorbar; title('after');

FPGA实现

将变换后的地址保存到ROM中,在变换时,从原位置读取数据,按ROM中的地址保存数据。


看到这儿了,点个赞吧!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Matlab是一种广泛使用的科学计算软件,在处理信号和图像时尤为出色。离散二维傅里叶变换是处理二维信号和图像的重要方法之一。通过傅里叶变换可以将时域(空间域)的信号和图像转化到频域,以便更好地理解和处理。 使用Matlab进行离散二维傅里叶变换需要使用fft2函数。该函数将输入的二维数组作为参数,返回其离散二维傅里叶变换后的结果。变换得到的结果同样是一个二维数组,保存的是信号和图像在频域的信息。 在进行离散二维傅里叶变换时,需要注意以下几点: 1. 信号和图像必须先转换为矩阵形式,才能进行离散二维傅里叶变换。 2. 由于傅里叶变换得到的结果是复数,因此变换后的结果同样保存在一个复数矩阵中。 3. 变换后的结果需要进行反变换才能回到时域(空间域),使用ifft2函数可以实现反变换。 在实际应用中,离散二维傅里叶变换通常用于图像压缩、图像增强、图像滤波等方面。通过对频域的特征分析,可以得到一些对于图像处理有帮助的信息。因此,在Matlab中熟练掌握离散二维傅里叶变换的方法和使用技巧,对于科学计算的研究和实际应用都具有重要意义。 ### 回答2: 离散二维傅里叶变换是一种将图像从空域转换到频域的数学变换。MATLAB中提供了fft2函数来进行离散二维傅里叶变换。在使用该函数时,需要将待处理的图像矩阵作为参数传入,该函数会将其转换为频域矩阵。得到的频域矩阵包含了图像中各个频率成分的信息,其中,低频分量位于矩阵中心,高频分量位于四周。 若需要将频域矩阵重新转换为空域图像,则可以使用ifft2函数。该函数将频域矩阵作为参数传入,并返回空域图像矩阵。在进行频域图像处理时,可以通过对频域矩阵做变换来实现滤波、增强等操作,然后再将变换后的频域矩阵通过ifft2函数转回空域图像。 离散二维傅里叶变换在图像处理中有广泛应用,如图像去噪、增强、压缩等。需要注意的是,在实际应用中,由于图像矩阵的大小一般为2的整数次幂,因此在做离散二维傅里叶变换时,需要将图像矩阵的大小进行补齐,以避免出现频谱泄漏等问题。 ### 回答3: MATLAB是一种常用的数学软件,拥有丰富的工具箱,包括能够进行离散二维傅里叶变换(DFFT)的函数。 简单来说,二维傅里叶变换是一种用于图像处理和信号分析的数学方法。它将图像或信号分解成一系列正弦和余弦函数,确定它们在空间中的频率和强度。这些频率和强度信息可以用于图像和信号的压缩、滤波、恢复和分析,是许多图像和信号处理算法的基础。 在MATLAB中,我们可以使用fft2()函数进行二维傅里叶变换。这个函数接受一个矩阵作为输入,返回一个具有相同维度的复数矩阵。这个复数矩阵包含了原始图像的傅里叶变换的幅度和相位信息。 然后,我们可以使用ifft2()函数对傅里叶变换结果进行反变换。这个函数可以将傅里叶变换的结果转换回原始的图像或信号。在进行反变换之前,我们可以应用各种滤波器来进一步处理和分析图像或信号。 MATLAB中还提供了一些其他的函数,如fftshift()和ifftshift(),可以帮助处理离散傅里叶变换的边界效应和频率零点偏移问题。 总之,MATLAB的离散二维傅里叶变换函数提供了丰富的图像和信号处理功能。它们可以用于许多应用,包括图像增强、频域滤波、模式识别和压缩等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值