1. 要求

对灰度图像进行离散傅里叶变换(Discrete Fourier Transfom, DFT)变换,在频域上分别使用理想的高通和低通滤波器进行滤波,显示滤波后的频域图像,以及逆离散傅里叶变换(Inverse Discrete Fourier Transfom, IDFT)变换后的空域图像,观察振铃现象。

2. 读取灰度图像

这里读取matlab自带的“摄影师”灰度图像

%% 读取图像
x = imread('cameraman.tif');
figure, imshow(x), title('原图')

3. 离散傅里叶变换

关于傅里叶变换的理解可以参考这篇文章

通俗讲解:图像傅里叶变换 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/99605178结合这篇文章,使用matlab实现离散傅里叶变化可以参考这篇文章

使用matlab对图像进行傅里叶变换 - 三山音 - 博客园 (cnblogs.com)https://www.cnblogs.com/sanshanyin/p/5426822.html这里使用的fft2是二维傅里叶变换,fftshift可以将将零频分量移到频谱中心,abs是绝对值和复数的模,如abs(3+4i)=5,imshow(I, [])不同于imshow(I),它是显示灰度图像 I,根据 I 中的像素值范围对显示进行转换。imshow 使用 [min(I(:)) max(I(:))] 作为显示范围。imshow 将 I 中的最小值显示为黑色,将最大值显示为白色。

%% 傅里叶变换
y = fft2(x);       % 二维傅里叶变换
y = fftshift(y);   % 将零频分量移到频谱中心
y_abs = abs(y);    % 对复数进行模运算
z = log(y_abs+1);  % 映射到小范围区间
% 根据z中的像素值范围对显示进行转换,将z中的最小值显示为黑色,最大值显示为白色。
figure, imshow(z, []), title('频域');

4. 低通滤波

如果图像的宽度为col ,高度为row ,那么理想低通频域滤波器可形式化地描述为:

其中表示理想低通滤波器的截止频率,滤波器的频率域原点在频谱图像的中心处,在以截止频率为半径的圆形区域之内的滤镜元素值全部为1,而该圆之外的滤镜元素值全部为0。理想低通滤波器的频率特性在截止频率处十分陡峭,无法用硬件实现,这也是使用者称之为理想的原因,但其软件编程的模拟实现较为简单。

由此,我们可以制作一个低通滤波器LPF,LPF初始化为一个全部为1的矩阵,接着遍历y,对其中的每个点(i,j),判断其频率是否高于截止频率,若高于截止频率,则将低通滤波器中对应的点置为0,若小于等于截止频率,则不做处理。

这里y.*LPF,是将y中的所有点分别乘以LPF中的所有点,对于y(i,j),如果其频率高于截止频率,则其对应位置的LPF(i,j)=0,两者想相结果为0,即过滤了高频;如果其频率小于等于截止频率,则其对应位置的LPF(i,j)=1,两者相乘结果仍为y(i,j),即保留了低频。

%% 低通滤波器
LPF = ones(size(y));        % 初始化低通滤波器
threshold_low = 50;         % 设置截至频率
[row, col] = size(y);       % 得到图像y的高度和宽度
for i = 1: rowfor j = 1: col% 计算频率if sqrt((i-row/2)^2+(j-col/2)^2) > threshold_low% 将低通滤波器中高于截止频率的频率变为0LPF(i,j) = 0;endend
end
y_LPF = y.*LPF;             % 低通滤波
y_LPF = ifftshift(y_LPF);   % 逆零频平移
x_LPF = ifft2(y_LPF);       % 傅里叶逆变换
x_LPF = uint8(real(x_LPF)); % 转换成实数,并将double转成uint8
figure, imshow(x_LPF), title('低通滤波')

更一般地,低通滤波器仅仅是一个形式,每次为了得到指定频率的滤波器(低通也好,高通也罢),如果都需要遍历row*col次,效率也是很低的。

本质上,理想低通滤波器和理想高通滤波器都是基于频率的,我们可以先计算出每个点对应的频率,将其存放在一个频率矩阵(频率本质上也是距离)distance中,接下来,对于任意一个给定的截止频率,我们只需要对distance矩阵进行处理即可。

(上面这段的代码和下面的两段代码在效果上是相同的)

%% 计算频率,频率 = 当前点(i,j) 到 中心点(row/2, col/2)的距离
[row, col] = size(y);
distance = zeros(row, col);
for i = 1: rowfor j = 1: col% 计算向量的模长,即两点间距离distance(i,j) = norm([i-row/2 j-col/2]);end
end

ifftshift是逆零频平移,是fftshift的逆变换,ifft2是二维快速傅里叶逆变换,是fft2的逆变换,

real用来得到复数的实部,返回的数据类型是double,一般灰度图像的数据类型是uint8,所以需要使用uint8进行转换。

%% 低通滤波 (Low Pass Filtering, LPF)
y_LPF = y;                  % 复制一个正常的y
threshold_low = 50;         % 设置阈值
% 过滤频率高于阈值的点
y_LPF(distance > threshold_low) = 0;
y_LPF = ifftshift(y_LPF);   % 逆零频平移
x_LPF = ifft2(y_LPF);       % 傅里叶逆变换
x_LPF = uint8(real(x_LPF)); % 转换成实数,并将double转成uint8
figure, imshow(x_LPF), title('低通滤波')

5. 高通滤波

高通滤波同理

%% 高通滤波 (HPF, High Pass Filtering)
y_HPF = y;
threshold_high = 30;
y_HPF(distance < threshold_high) = 0;
y_HPF = ifftshift(y_HPF);
x_HPF = ifft2(y_HPF);
x_HPF = uint8(real(x_HPF));
figure, imshow(x_HPF), title('高通滤波')

6. 完整代码

关注公众号TobleroneWind,回复“数字图像处理”即可获取完整代码。

Matlab对灰度图像的频域进行高通滤波和低通滤波相关推荐

  1. 空间域、频域、高通滤波、低通滤波

    最近由于深度学习做图像,要看图像处理的知识,看了几篇博客,本文的图和大部分的文字均来自于那些参考的博客,在这把知识点总结了一下: ① 通过观察灰度分布来描述一幅图像称为空间域,观察图像变化的频率被称为 ...

  2. 《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  3. opencv学习笔记22:傅里叶变换,高通滤波,低通滤波

    傅里叶变换原理 任何连续的周期信号,都可以由一组适当的正弦曲线组合而成. 下列左上图由其他三图构成. 左图经过傅里叶变换,由时域图转换到频域图.相互可逆 相位:不是同时开始的一组余弦函数,在叠加时要体 ...

  4. opencv 四 Mat的基本操作3(高通滤波、低通滤波、对比度调节)

    图像滤波分为高通滤波和低通滤波,高通滤波用于求图形的边缘,低通滤波用于图像去噪.图像模糊化等.这里的频是指变化(相邻像素值的变化),高通滤波是指使变化大也就是图像的边缘)的通过(低通滤波是指使变化小( ...

  5. python-opencv图像的高通滤波和低通滤波

    13.python-opencv图像的高通滤波和低通滤波 第一章 python-opencv-图片导入和显示 第二章 python-opencv图像简单处理 第三章 python-opencv图像ma ...

  6. 【数字图像处理2.1 】频率域中的 高通滤波 和 低通滤波 Python+Opencv+Numpy

    文章目录 前言 1.实验目的 2.频率域中高通.低通的效果图 3.代码 4.空间域滤波 与 频率域滤波比较 (1).回顾空间滤波 (2).相同点: (3).不同点: (4).二者关系: 前言 1.图像 ...

  7. [Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  8. c++读取excel_Python读取并提取xlsx数据+去趋势和高通滤波与低通滤波

    这是接昨天的推文,昨天的推文中我用来分析的数据是自己手动输入的少量数据,但是现实中我们需要的数据可能比较大,因此被存储在电子表格中,我们就需要把数据读取并提取需要的内容进行分析,好吧,开始吧,拉次够 ...

  9. python源码 高通滤波、低通滤波、带通滤波

    创作不易,如果此文使您有收获,记得点赞哦! 一. 傅里叶变化原理: https://www.cnblogs.com/wojianxin/p/12529809.html 二. 高通滤波.低通滤波.带通滤 ...

最新文章

  1. 下列哪些说法符合《阿里巴巴Java开发手册》
  2. Python程序设计 第六章 函数(续
  3. 为什么都说 Go 是大厂通行证!
  4. ZOJ 1970 All in All
  5. c语言 输入若干字符串 用指针和一位数组 冒泡排序,C 语言作业 - 1 - 指针使用与冒泡排序...
  6. 数据结构期末复习-线性表查找
  7. Android 通过URL scheme 实现点击浏览器中的URL链接,启动特定的App,并调转页面传递参数...
  8. centos7桌面没有计算机图标,centos7下创建桌面图标的方法
  9. python 去掉tab_Python使用crontab模块设置和清除定时任务操作详解
  10. mdui.js手机端侧边滑出导航菜单
  11. 切换输入法半角全角(打开关闭输入法)
  12. Android NFC开发详解 总结和NFC读卡实例解析
  13. JavaScript children和childNodes
  14. 模糊神经网络matlab模拟仿真
  15. Android下修改hosts文件-重启有效
  16. 简单、好用才是真道理,适用于初学人群的Linkboy5.0
  17. 健康睡眠,提高工作效率
  18. Matlab运算于内部函数,java工程师面试突击第三季笔记
  19. jacob 操纵Microsoft Word 进行转移、拆分、合并、插入等操作 结合Freemarker将无所不能
  20. 骑士放置(最大独立集)

热门文章

  1. HTML页面中引入日历插件
  2. python 安装+基础PPT
  3. 对一个加壳的可执行文件进行脱壳三种方法
  4. 详解4D毫米波雷达数据集(VOD)Multi-class Road User Detection with 3+1D Radar in the View-of-Delft Dataset
  5. highcharts 小结
  6. Boolean数据类型
  7. vray for c4d r20-s24汉化版
  8. 【智能物流】谈笔1000亿的生意:揭秘菜鸟全球智能仓配技术实践
  9. 关于VBA中Evaluate的用法
  10. 杭电 1272 小希的迷宫