Matlab对灰度图像的频域进行高通滤波和低通滤波
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对灰度图像的频域进行高通滤波和低通滤波相关推荐
- 空间域、频域、高通滤波、低通滤波
最近由于深度学习做图像,要看图像处理的知识,看了几篇博客,本文的图和大部分的文字均来自于那些参考的博客,在这把知识点总结了一下: ① 通过观察灰度分布来描述一幅图像称为空间域,观察图像变化的频率被称为 ...
- 《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造
本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...
- opencv学习笔记22:傅里叶变换,高通滤波,低通滤波
傅里叶变换原理 任何连续的周期信号,都可以由一组适当的正弦曲线组合而成. 下列左上图由其他三图构成. 左图经过傅里叶变换,由时域图转换到频域图.相互可逆 相位:不是同时开始的一组余弦函数,在叠加时要体 ...
- opencv 四 Mat的基本操作3(高通滤波、低通滤波、对比度调节)
图像滤波分为高通滤波和低通滤波,高通滤波用于求图形的边缘,低通滤波用于图像去噪.图像模糊化等.这里的频是指变化(相邻像素值的变化),高通滤波是指使变化大也就是图像的边缘)的通过(低通滤波是指使变化小( ...
- python-opencv图像的高通滤波和低通滤波
13.python-opencv图像的高通滤波和低通滤波 第一章 python-opencv-图片导入和显示 第二章 python-opencv图像简单处理 第三章 python-opencv图像ma ...
- 【数字图像处理2.1 】频率域中的 高通滤波 和 低通滤波 Python+Opencv+Numpy
文章目录 前言 1.实验目的 2.频率域中高通.低通的效果图 3.代码 4.空间域滤波 与 频率域滤波比较 (1).回顾空间滤波 (2).相同点: (3).不同点: (4).二者关系: 前言 1.图像 ...
- [Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- c++读取excel_Python读取并提取xlsx数据+去趋势和高通滤波与低通滤波
这是接昨天的推文,昨天的推文中我用来分析的数据是自己手动输入的少量数据,但是现实中我们需要的数据可能比较大,因此被存储在电子表格中,我们就需要把数据读取并提取需要的内容进行分析,好吧,开始吧,拉次够 ...
- python源码 高通滤波、低通滤波、带通滤波
创作不易,如果此文使您有收获,记得点赞哦! 一. 傅里叶变化原理: https://www.cnblogs.com/wojianxin/p/12529809.html 二. 高通滤波.低通滤波.带通滤 ...
最新文章
- 下列哪些说法符合《阿里巴巴Java开发手册》
- Python程序设计 第六章 函数(续
- 为什么都说 Go 是大厂通行证!
- ZOJ 1970 All in All
- c语言 输入若干字符串 用指针和一位数组 冒泡排序,C 语言作业 - 1 - 指针使用与冒泡排序...
- 数据结构期末复习-线性表查找
- Android 通过URL scheme 实现点击浏览器中的URL链接,启动特定的App,并调转页面传递参数...
- centos7桌面没有计算机图标,centos7下创建桌面图标的方法
- python 去掉tab_Python使用crontab模块设置和清除定时任务操作详解
- mdui.js手机端侧边滑出导航菜单
- 切换输入法半角全角(打开关闭输入法)
- Android NFC开发详解 总结和NFC读卡实例解析
- JavaScript children和childNodes
- 模糊神经网络matlab模拟仿真
- Android下修改hosts文件-重启有效
- 简单、好用才是真道理,适用于初学人群的Linkboy5.0
- 健康睡眠,提高工作效率
- Matlab运算于内部函数,java工程师面试突击第三季笔记
- jacob 操纵Microsoft Word 进行转移、拆分、合并、插入等操作 结合Freemarker将无所不能
- 骑士放置(最大独立集)