前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matlab | 离散傅里叶变换一阶、二阶

matlab | 离散傅里叶变换一阶、二阶

作者头像
福贵
发布2019-05-07 11:36:47
1.3K0
发布2019-05-07 11:36:47
举报
文章被收录于专栏:菜鸟致敬菜鸟致敬

把时域转换到频域,能够为图像处理带来很多便捷的操作。在频谱图中直接去掉低频部分或者高频部分都会发生很多有趣的事情。

在频谱图直接操作也能够简化一些在时域较为困难的操作,举个例子。

上面小丑图片里面的规律性条纹在时域是很难直接操作的,但是在频域却是规律性呈现的,我们只需要将这些条纹导致的规律性点删除即可。

选择从频率域看图像,我们都够简化一些图片的处理操作。

◆ ◆ ◆ ◆ ◆

一阶离散傅里叶变换

逆变换

下面是matlab的文档

代码语言:javascript
复制
For length N input vector x, the DFT is a length N vector X,%   with elements%                    N%      X(k) =       sum  x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.%                   n=1%   The inverse DFT (computed by IFFT) is given by%                    N%      x(n) = (1/N) sum  X(k)*exp( j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N.%                   k=1

一阶离散傅里叶变换很简单,matlab中有fft函数是对dft的快速变换实现。

dft的直接实现

代码语言:javascript
复制
function [F] = dft_chg(img_data)img_data=im2double(img_data);sz=size(img_data);F=zeros(sz);M=sz(1);m=0:M-1;T=1;if numel(sz)>2    T=sz(3);end
for tunnel=1:T    for column=1:sz(1)        column_data=img_data(:,column,tunnel);        part1=exp(-1i*2*pi/M);        ux=m'*m;        part2=part1.^ux;        F(:,column,tunnel)=column_data'*part2;    endendend

◆ ◆ ◆ ◆ ◆

二阶离散傅里叶变换也很简单,fft2是对ft2的快速变换实现。

二阶离散傅里叶变换

逆变换

对二阶离散傅里叶变换公式进行推导,可以看出,二阶即为一阶的两次变换。

对一张图片来说,先进行列变换,再进行行变换即可。

二阶基本实现

代码语言:javascript
复制
function [F] = dft2_chg(img_data)img_data=im2double(img_data);sz=size(img_data);M=sz(1);N=sz(2);n=0:N-1;m=0:M-1;T=1;if numel(sz)>2    T=sz(3);endF=zeros(sz);new_data=zeros(sz);
for tunnel=1:T    for column=1:sz(1)        column_data=img_data(:,column,tunnel);        part1=exp(-1i*2*pi/M);        ux=m'*m;        part2=part1.^ux;        new_data(:,column,tunnel)=column_data'*part2;    endend
for tunnel=1:T    for row=1:sz(2)        row_data=new_data(row,:,tunnel);        part1=exp(-1i*2*pi/N);        vy=n'*n;        part2=part1.^vy;        F(row,:,tunnel)=row_data*part2;    endendend

得到变换结果后,我们可以分离幅谱和相谱。

幅谱和相谱的显示

代码语言:javascript
复制
function [] = show_in_img(F)%SHOW_IMG 此处显示有关此函数的摘要%   此处显示详细说明F=fftshift(F);f=abs(F);f=log(f);fai=angle(F);T=1;sz=size(F);if numel(sz)>2    T=sz(3);endfigure("Name","离散变换","NumberTitle","off");for zone=1:T    zone1=subplot(2,T,zone);    imshow(f(:,:,zone));    title(zone1,"幅度图");    zone2=subplot(2,T,T+zone);    imshow(fai(:,:,zone));    title(zone2,"相位图");endend
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与MySQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档