首页/新闻资讯/正文详情

[数字图像处理]频域滤波(1)--基础与低通滤波器

发布时间:2026/11/4 1:00:43 来源:云帆数科 栏目:资讯中心
[数字图像处理]频域滤波(1)--基础与低通滤波器
【修订版】本文已整理到我的个人博客订正了原文的几处错误卷积的定义有误补零的作用是避免圆周卷积的缠绕误差并不是扩大频率范围中心化应乘 (−1)^(xy)。CSDN 这一版保留原样之后的勘误与更新只在博客进行 Frequency Domain Filter : 低通滤波 | Finns blog之前的博文主要介绍了空间域内的滤波器本文主要从频域的角度进行分析。主要使用傅里叶变换将空间域的图像转换到频域内在频域内进行数字图像处理。这部分的内容及其重要频域内的处理可以解决空间域内无法完成的图像增强。本文首先从数学角度对图像的频域内的性质进行分析然后在着重介绍滤波器在频域内的性质。1.傅里叶变换与频域在之前的文中我们已经进行过一些基本的图像处理。比如使用低通滤波可以将图像模糊也有些许降噪的作用。这些都是在空间域内进行的滤波处理这个处理主要是依靠卷积来进行计算的。首先从连续的一维卷积入手如下所示。将上式进行傅里叶变换可以得到如下结果。从这个式子我们可以得到一个重要的结论。也就是函数与卷积的傅里叶变换所得到的结果是函数与的傅里叶变换与的乘积。再将其总结得简单易懂一些有如下结论。在将其扩展到二维的形况下假设尺寸为MxN的图像如下关系是成立的。其实到这基本的原理就明了的。我们所看到的图像均为空间域内的表现形式我们无法辨识出频域内的图像。要进行频域内的滤波器处理首先就需要进行傅里叶变换然后直接进行滤波处理最后再用反傅里叶变换倒回到空间域内。到此已经可以开始空间域内的滤波处理了。但是还有一点需要注意的地方。使用某个一维信号来举例子一维信号的傅里叶变换是以2π为周期的函数。所以我们常常使用的范围[-π,π]来表示这个信号的傅里叶变换如下所示。这样做的好处是靠近0的成分就是低频靠近-π与π的成分就表示高频。而对于图像而言在Matlab中我们使用fft2()这个函数来求取图像的傅里叶变换。g fft2(f);上面这个代码求取的其实是范围[0,π]内的傅里叶变换。为了方便理解下图画出了本行代码所求取的图像的傅里叶变换的范围右和与其等效的一维傅里叶变换的范围左。很显然这并不是希望的范围下面这个代码可以求取[0,2π]内的傅里叶变换。P 2*M; Q 2*N; F fft2(f,P,Q);下图画出了本行代码所求取的图像的傅里叶变换的范围右和与其等效的一维傅里叶变换的范围左。所得到的图像F(u,v)的尺寸为PxQ。我们需要对其移动一下如下图所示我们需要的是粉色范围的区域。下面从数学上分析一下如何获得这个部分的频谱。对于傅里叶变换有如下性质。这个特性称为平移特性粉色部分的频谱将带入上式我们可以得到如下式子。为次我们已经得到了粉色范围的频谱。越靠近傅里叶频谱图像中间的成分代表了低频成分。其Matlab代码如下所示。[M,N] size(f); P 2*M; Q 2*N; fc zeros(M,N); for x 1:1:M for y 1:1:N fc(x,y) f(x,y) * (-1)^(xy); end end F fft2(fc,P,Q);代码所得到的结果如下图所示。接下来我们总结一下频域滤波的步骤①先将图像做频域内的水平移动然后求原图像f(x,y)的DFT得到其图像的傅里叶谱F(u,v)。②与频域滤波器做乘积③求取G(u,v)的IDFT然后再将图像做频域内的水平移动移动回去其结果可能存在寄生的虚数此时忽略即可。④这里使用ifft2函数进行IDFT变换得到的图像的尺寸为PxQ。切取左上角的MxN的图像就能得到结果了。2.低通滤波器2.1理想的低通滤波器其中D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离很简单就能得到。使用低通滤波器所得到的结果如下所示。低通滤波器滤除了高频成分所以使得图像模糊。由于理想低通滤波器的过度特性过于急峻所以会产生了振铃现象。2.2巴特沃斯低通滤波器同样的D0表示通带的半径n表示的是巴特沃斯滤波器的次数。随着次数的增加振铃现象会越来越明显。2.3高斯低通滤波器D0表示通带的半径。高斯滤波器的过度特性非常平坦因此是不会产生振铃现象的。3.实现代码close all; clear all; %% ---------Ideal Lowpass Filters (Fre. Domain)------------ f imread(characters_test_pattern.tif); f mat2gray(f,[0 255]); [M,N] size(f); P 2*M; Q 2*N; fc zeros(M,N); for x 1:1:M for y 1:1:N fc(x,y) f(x,y) * (-1)^(xy); end end F fft2(fc,P,Q); H_1 zeros(P,Q); H_2 zeros(P,Q); for x (-P/2):1:(P/2)-1 for y (-Q/2):1:(Q/2)-1 D (x^2 y^2)^(0.5); if(D 60) H_1(x(P/2)1,y(Q/2)1) 1; end if(D 160) H_2(x(P/2)1,y(Q/2)1) 1; end end end G_1 H_1 .* F; G_2 H_2 .* F; g_1 real(ifft2(G_1)); g_1 g_1(1:1:M,1:1:N); g_2 real(ifft2(G_2)); g_2 g_2(1:1:M,1:1:N); for x 1:1:M for y 1:1:N g_1(x,y) g_1(x,y) * (-1)^(xy); g_2(x,y) g_2(x,y) * (-1)^(xy); end end %% -----show------- figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(1,2,2); imshow(log(1 abs(F)),[ ]); xlabel(b).Fourier spectrum of a); figure(); subplot(1,2,1); imshow(H_1,[0 1]); xlabel(c).Ideal Lowpass filter(D60)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_1)),[ ]); xlabel(d).Result of filtering using c); subplot(1,2,2); imshow(g_1,[0 1]); xlabel(e).Result image); figure(); subplot(1,2,1); imshow(H_2,[0 1]); xlabel(f).Ideal Lowpass filter(D160)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_2)),[ ]); xlabel(g).Result of filtering using e); subplot(1,2,2); imshow(g_2,[0 1]); xlabel(h).Result image); close all; clear all; %% ---------Butterworth Lowpass Filters (Fre. Domain)------------ f imread(characters_test_pattern.tif); f mat2gray(f,[0 255]); [M,N] size(f); P 2*M; Q 2*N; fc zeros(M,N); for x 1:1:M for y 1:1:N fc(x,y) f(x,y) * (-1)^(xy); end end F fft2(fc,P,Q); H_1 zeros(P,Q); H_2 zeros(P,Q); for x (-P/2):1:(P/2)-1 for y (-Q/2):1:(Q/2)-1 D (x^2 y^2)^(0.5); D_0 100; H_1(x(P/2)1,y(Q/2)1) 1/(1(D/D_0)^2); H_2(x(P/2)1,y(Q/2)1) 1/(1(D/D_0)^6); end end G_1 H_1 .* F; G_2 H_2 .* F; g_1 real(ifft2(G_1)); g_1 g_1(1:1:M,1:1:N); g_2 real(ifft2(G_2)); g_2 g_2(1:1:M,1:1:N); for x 1:1:M for y 1:1:N g_1(x,y) g_1(x,y) * (-1)^(xy); g_2(x,y) g_2(x,y) * (-1)^(xy); end end %% -----show------- figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(1,2,2); imshow(log(1 abs(F)),[ ]); xlabel(b).Fourier spectrum of a); figure(); subplot(1,2,1); imshow(H_1,[0 1]); xlabel(c)Butterworth Lowpass (D_{0}100,n1)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_1)),[ ]); xlabel(d).Result of filtering using c); subplot(1,2,2); imshow(g_1,[0 1]); xlabel(e).Result image); figure(); subplot(1,2,1); imshow(H_2,[0 1]); xlabel(f).Butterworth Lowpass (D_{0}100,n3)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_2)),[ ]); xlabel(g).Result of filtering using e); subplot(1,2,2); imshow(g_2,[0 1]); xlabel(h).Result image); close all; clear all; clc; %% ---------Gaussian Lowpass Filters (Fre. Domain)------------ f imread(characters_test_pattern.tif); f mat2gray(f,[0 255]); [M,N] size(f); P 2*M; Q 2*N; fc zeros(M,N); for x 1:1:M for y 1:1:N fc(x,y) f(x,y) * (-1)^(xy); end end F fft2(fc,P,Q); H_1 zeros(P,Q); H_2 zeros(P,Q); for x (-P/2):1:(P/2)-1 for y (-Q/2):1:(Q/2)-1 D (x^2 y^2)^(0.5); D_0 60; H_1(x(P/2)1,y(Q/2)1) exp(-(D*D)/(2*D_0*D_0)); D_0 160; H_2(x(P/2)1,y(Q/2)1) exp(-(D*D)/(2*D_0*D_0)); end end G_1 H_1 .* F; G_2 H_2 .* F; g_1 real(ifft2(G_1)); g_1 g_1(1:1:M,1:1:N); g_2 real(ifft2(G_2)); g_2 g_2(1:1:M,1:1:N); for x 1:1:M for y 1:1:N g_1(x,y) g_1(x,y) * (-1)^(xy); g_2(x,y) g_2(x,y) * (-1)^(xy); end end %% -----show------- close all; figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(1,2,2); imshow(log(1 abs(F)),[ ]); xlabel(b).Fourier spectrum of a); figure(); subplot(1,2,1); imshow(H_1,[0 1]); xlabel(c)Gaussian Lowpass (D_{0}60)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_1)),[ ]); xlabel(d).Result of filtering using c); subplot(1,2,2); imshow(g_1,[0 1]); xlabel(e).Result image); figure(); subplot(1,2,1); imshow(H_2,[0 1]); xlabel(f).Gaussian Lowpass (D_{0}160)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_2)),[ ]); xlabel(g).Result of filtering using e); subplot(1,2,2); imshow(g_2,[0 1]); xlabel(h).Result image);原文发于博客zhoufan900428-CSDN博客

相关推荐

uniapp海外游戏分发工程:PG电子集成与Switch卡带区域适配
uniapp海外游戏分发工程:PG电子集成与Switch卡带区域适配

简介:这是一套面向海外游戏业务开发者的全栈前端解决方案,基于UniApp框架实现跨平台兼容,专为构建海外游戏交易平台、手游下载站及Switch游戏卡带销售系统设计。资源包含完整可二次开发的前端源码(非编译后产物)&#… · 2026/11/4 0:00:17

Qoder NEXT:智能代码补全工具的技术解析与应用
Qoder NEXT:智能代码补全工具的技术解析与应用

1. 项目概述Qoder NEXT作为新一代智能编程辅助工具,其核心突破在于通过深度优化代码补全算法,将AI生成代码的开发者采纳率提升了65%。这个数字背后代表着编程效率的实质性飞跃——开发者不再需要花费大量时间在重复性代码编写和机械性调试上,… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

深度揭秘:Hermes Agent如何构建企业级多智能体通信架构
深度揭秘:Hermes Agent如何构建企业级多智能体通信架构

深度揭秘:Hermes Agent如何构建企业级多智能体通信架构 在当今分布式AI系统日益复杂的背景下,多智能体协作的效率直接决定了系统的整体性能。Hermes Agent作为一款面向企业级应用的开源多智能体框架,通过创新的消息传递机制和智能协调协议&a… · 2026/11/4 1:46:00

3个高级配置技巧:解锁Hermes Agent的隐藏潜能
3个高级配置技巧:解锁Hermes Agent的隐藏潜能

3个高级配置技巧:解锁Hermes Agent的隐藏潜能 你是否曾想过,为什么同样的Hermes Agent在不同开发者手中表现差异如此之大?当其他人轻松处理复杂任务时,你的Agent却频繁遇到上下文限制或响应迟缓的问题。这并非模型能力不足&#… · 2026/11/4 1:46:00

双态持久化记忆系统:重新定义AI助手的长时记忆范式
双态持久化记忆系统:重新定义AI助手的长时记忆范式

双态持久化记忆系统:重新定义AI助手的长时记忆范式 在传统AI助手领域,"健忘症"一直是制约用户体验的核心瓶颈。每个会话都是孤立的,AI无法记住用户的偏好、工作习惯或历史约定,导致重复的配置和低效的交互。Hermes Age… · 2026/11/4 1:46:00

Hermes Agent:你的AI协作伙伴,如何让复杂任务变得简单?
Hermes Agent:你的AI协作伙伴,如何让复杂任务变得简单?

Hermes Agent:你的AI协作伙伴,如何让复杂任务变得简单? 你是否曾为管理多个AI助手而烦恼?想象一下,你需要同时处理Telegram上的客户咨询、Discord的技术讨论,还要协调团队看板上的开发任务。每个平台都需要… · 2026/11/4 1:46:00

FastAPI API文档定制指南:4 步做出带品牌色的 Swagger 与 ReDoc 界面
FastAPI API文档定制指南:4 步做出带品牌色的 Swagger 与 ReDoc 界面

FastAPI API文档定制指南:4 步做出带品牌色的 Swagger 与 ReDoc 界面 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi 做 Fa… · 2026/11/4 1:46:00

计算1!+ 2!+ 3! + 4! +···+10!(1到10的阶乘)
计算1!+ 2!+ 3! + 4! +···+10!(1到10的阶乘)

//初始化 int i 0; int j 1; int ret 1; int sum 0; //嵌套for循环 for (i 0; i < 10; i) //累计1到10 {for (j 1; j < i; j) //每次数的阶乘{ret ret * j;}sum sum ret; //计算每个数的阶乘相加 } printf("%d", sum);int i 1; int ret 1; int sum … · 2026/11/4 1:45:00

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进&#xff0c;技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里&#xff0c;先后经历了三次重大技术栈迁移&#xff0c;每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策"&#xff1a;Jev 到底在解决什么问题大多数人第一次接触大模型&#xff0c;脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样&#xff0c;它给你一段描述&#xff1b;你让它写个周报&#xff0c;它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用"&#xff0c;这件事我前后折腾了小半年。标题里说的这台 Mac mini M6&#xff0c;是我们这次讨论的目标平台&#xff0c;具体到手规格以实物为准&#xff1b;但下面这套推算方法和实测思路&#xff0c;对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码