十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

图像带通滤波原理与MATLAB实现:从频域设计到参数调优全攻略

图像带通滤波原理与MATLAB实现:从频域设计到参数调优全攻略 简介本资源是一份面向MATLAB图像处理初学者与进阶学习者的带通滤波实践工具包聚焦于频域图像增强与噪声抑制等典型任务适用于医学影像分析、遥感图像特征提取及视频预处理等实际场景。压缩包为RAR格式共含2个MATLAB脚本文件.m总大小仅1022B轻量简洁其中核心函数daitongfilter.m封装了可调参数的带通滤波器设计逻辑支持巴特沃斯等经典滤波器类型主脚本daitong.m则完整实现图像读取、频域转换、滤波应用、结果可视化与保存全流程便于快速验证与二次开发。目前已有400人学习下载资源虽小但结构完整提供即用型滤波接口、清晰的参数注释及端到端图像处理范例特别适合理解频域滤波原理、调试滤波器截止频率设置及开展课程实验与项目原型开发。 做图像处理的人迟早都会撞上带通滤波这堵墙。我最早接触它是在做纹理分析的时候想从一张布满噪点的表面缺陷图里把周期性纹理提出来低通把纹理和高频噪声一起抹了高通又把缺陷边缘和噪声一起放大了折腾一圈才发现真正需要的其实是把某个频段单独拎出来——这就是带通滤波的活。当时从网上下过一个叫“daitong.rar”的MATLAB程序包里面有个图像带通的Demo代码写得乱跑起来还一堆坑但这东西确实让我把频域滤波那点事彻底搞明白了。这篇东西就是写给正在被带通滤波折磨的人。不管你是做图像处理大作业还是在做工业检测、医学影像分析只要能理解“频段”这个概念就能用MATLAB把带通滤波玩明白。我会从原理、代码、参数调优到实际踩坑完整走一遍最后给你一套可以直接抄作业的MATLAB实现。1. 图像带通滤波到底在解决什么问题先说个很多初学者没想明白的事图像滤波的本质不是“模糊”或“锐化”而是在频率域里做选择。图像可以看成无数个不同频率的正弦波叠加的结果低频对应平坦区域和大致轮廓高频对应边缘、细节和噪声。低通滤波就是留低频去高频高通滤波就是留高频去低频那带通呢它把两者都砍了一部分只留下中间那一段频率。1.1 为什么低通和高通常常不够用举一个真实的场景。我在做芯片引脚缺陷检测的时候图像里有三类东西大面积的底色变化低频、引脚边缘和细微裂纹中频、传感器本身的随机噪声高频。如果用低通滤波噪声是没了但裂纹和边缘也被一起模糊掉如果用高通滤波边缘和裂纹倒是出来了但噪声也被放大了简直是灾难。这种两头为难的情况在医学影像里更常见。比如说眼底图像里的血管分割血管宽度对应的频率范围是相对固定的背景光照不均属于低频成像系统的颗粒噪声属于高频。你要把血管结构完整提取出来就必须要带通滤波把背景不均匀性去掉把颗粒噪声压掉只保留血管对应的频段。1.2 带通滤波在图像处理里的典型应用我梳理了一下实际项目里带通滤波最常见的几个用途纹理提取与分析织物、木材、金属表面的纹理往往集中在特定的频率范围带通滤波可以把纹理从背景中分离出来方便后续的统计分析和缺陷识别。图像增强遥感图像里的山脊、道路等线性特征医学图像里的血管、支气管树都属于特定尺度的结构带通滤波可以定向增强这些结构抑制无关信息。去噪与去伪影某些周期性噪声比如扫描仪的条纹干扰在频域里表现为一个特定频率的峰值用带通滤波器把那个频率单独滤出来再在原始图像里减去就能干净地去除。工业缺陷检测表面划痕、凹坑、气泡这类缺陷往往出现在中频段带通滤波配合形态学处理可以显著降低误检率。1.3 “频率”在图像里到底该怎么理解这是理解带通滤波的关键一步。对图像来说频率不是时间上的快慢而是空间上灰度变化的剧烈程度。我习惯用一个类比来解释你在看一面平静的湖水低频图像突然落下一颗石子涟漪的产生和扩散中频结构水面上密密麻麻的细小波纹高频噪声。如果你想研究涟漪本身就需要把湖面的平静背景和细碎波纹都去掉——这就是带通滤波在做的事。对应到图像里平坦区域灰度变化缓慢是低频边缘处灰度突变是高频而像纹理这种有规律的中等尺度变化就落在中频。带通滤波器就是给图像装了一个“频率窗口”只让窗口内的频率成分通过。2. 频域设计路线从傅里叶变换到带通滤波器图像带通滤波最直观、最可控的实现方式就是走频域路线先把图像从空间域变换到频率域在频率域里构造一个带通滤波器把频谱和滤波器逐点相乘再变换回空间域。2.1 频域滤波的完整流程在MATLAB里标准的频域滤波流程是这样% 读入图像并转为灰度图 img imread(texture.png); if size(img, 3) 3 img rgb2gray(img); end img im2double(img); % 转浮点类型避免计算溢出 % 1. 傅里叶变换并中心化 F fft2(img); % 二维傅里叶变换 F_shift fftshift(F); % 将零频移到频谱中心 % 2. 构造带通滤波器传递函数 H(u,v) % 这里先用一个简单的理想带通示意后面会详细讲 [M, N] size(img); [u, v] meshgrid(1:N, 1:M); D sqrt((u - N/2 - 1).^2 (v - M/2 - 1).^2); % 每个像素到中心的距离 D0_low 30; % 通带下截止频率 D0_high 80; % 通带上截止频率 H ones(M, N); H(D D0_low | D D0_high) 0; % 理想带通 % 3. 频谱与滤波器相乘 G_shift F_shift .* H; % 4. 反傅里叶变换回空间域 G ifftshift(G_shift); filtered real(ifft2(G)); % 5. 显示结果 figure; subplot(1,2,1); imshow(img); title(原图); subplot(1,2,2); imshow(filtered, []); title(带通滤波结果);这段代码里最核心的一步是fftshift。fft2变换后的频谱零频在矩阵的左上角也就是四个角的频率最低中心频率最高。如果不做fftshift你构造的滤波器就必须跟着去匹配这种“零频在角落”的布局非常容易出错。fftshift之后零频在正中心频率从中心向四周逐渐增高这种“从中心读频率”的方式最符合直觉。2.2 三种常见的带通滤波器传递函数MATLAB图像处理工具箱里其实没有直接叫“带通”的滤波器函数但带通可以由低通和高通组合而来或者直接构造传递函数。实际项目中最常用的有三种理想带通滤波器Ideal Bandpass Filterfunction H ideal_bandpass(M, N, D0, D1) % D0: 下截止频率通带内径 % D1: 上截止频率通带外径 [u, v] meshgrid(1:N, 1:M); D sqrt((u - N/2 - 1).^2 (v - M/2 - 1).^2); H ones(M, N); H(D D0 | D D1) 0; end理想带通的特性是通带内所有频率原样通过通带外完全截止。边界非常陡峭理论上效果最好但实际用起来会有问题——后面会详细说。高斯带通滤波器Gaussian Bandpass Filterfunction H gaussian_bandpass(M, N, D0, sigma) % D0: 中心频率通带中心 % sigma: 带宽控制参数 [u, v] meshgrid(1:N, 1:M); D sqrt((u - N/2 - 1).^2 (v - M/2 - 1).^2); H 1 - exp(-(D.^2 - D0^2).^2 / (2 * (D0 * sigma)^2)); end这个形式看着有点绕其实本质就是在频率轴上以 D0 为中心形成一个高斯形状的突起。离 D0 越远的频率衰减越厉害。高斯带通没有突变边界滤波结果非常平滑是最推荐新手使用的。巴特沃斯带通滤波器Butterworth Bandpass Filterfunction H butterworth_bandpass(M, N, D0, D1, n) % D0: 下截止频率 % D1: 上截止频率 % n: 滤波器阶数控制过渡带的陡峭程度 [u, v] meshgrid(1:N, 1:M); D sqrt((u - N/2 - 1).^2 (v - M/2 - 1).^2); H 1 ./ (1 ((D .^ 2 - D0 * D1) ./ (D .* (D1 - D0))) .^ (2 * n)); end巴特沃斯带通是理想带通的“平滑版”通过调节阶数 n 可以控制过渡带的陡峭程度。n 越大越接近理想带通但振铃效应也会越明显。三种滤波器的对比如下滤波器类型过渡带特性振铃效应参数含义适用场景理想带通无过渡带阶跃截止严重D0下截止、D1上截止极少单独使用高斯带通平滑过渡无D0中心频率、sigma带宽初学者首选纹理分析巴特沃斯带通可通过n调节中等D0下截止、D1上截止、n阶数工业检测、边缘分析2.3 为什么理想带通会有振铃效应这是频域滤波里最容易踩的坑。理想带通滤波器的传递函数在截止频率处是阶跃的从 0 直接跳到 1。这种突变在频率域里很尖锐对应到空间域里就会产生振荡——就是图像上出现一圈一圈的伪影专业上叫振铃效应Ring Effect实际表现就是目标边缘附近出现明暗交替的“鬼影”。我最早用理想带通做血管增强出来结果吓一跳血管周围全是水波纹。后来才明白凡是传递函数有“硬跳变”的滤波器必然存在振铃。高斯带通和低阶巴特沃斯带通因为过渡带平滑就不会有这个问题。所以我的建议是能用高斯带通就别用理想带通除非你明确知道振铃伪影不影响后续处理。3. 空间域实现卷积核设计与实操频域滤波理解起来直观但实际工程里有时候需要在空间域做卷积原因无非两种要么是频域变换的开销太大要么是滤波器需要集成到实时处理流程里无法忍受傅里叶变换的延迟。空间域带通滤波的本质是设计一个空间卷积核让它的频率响应呈现“带通”形状。3.1 从频率响应反推空间卷积核空间域卷积核的设计思路是一个卷积核的频率响应就是它自身做傅里叶变换的结果。反过来我们可以先设计好想要的频率响应再做逆傅里叶变换得到空间卷积核。MATLAB里最直接的做法是fsamp2函数它根据频率响应采样值生成二维FIR滤波器% 设计一个5x5的带通卷积核 % 先构造理想的频率响应矩阵尺寸随意但要能覆盖你关心的频段 [M, N] size(img); % 用之前构造的高斯带通频率响应作为目标 H_desired gaussian_bandpass(M, N, 50, 0.4); % 生成空间域卷积核 h fsamp2(H_desired); % 用卷积核做空间滤波 filtered imfilter(img, h, replicate, same);这里fsamp2会生成一个和频率响应矩阵等大的卷积核直接用imfilter做卷积就行。注意imfilter的边界选项replicate表示边界外复制边缘像素same表示输出和输入同尺寸。边界处理不当会造成边缘黑条后面会有专门的避坑说明。3.2 用高斯拉普拉斯组合构造带通空间域还有一种更经典的带通构造方法用两个不同尺度的高斯低通核做差。这本质上就是高斯差分DoG它的频率响应天然是带通形状。% 高斯差分构造带通核 sigma1 1.0; % 小尺度高斯对应高频 sigma2 3.0; % 大尺度高斯对应低频 h1 fspecial(gaussian, [15 15], sigma1); h2 fspecial(gaussian, [15 15], sigma2); h_dog h1 - h2; % 两个高斯核相减得到带通核 % 空间域滤波 filtered imfilter(img, h_dog, replicate, same);这个方法的物理意义非常直观大尺度高斯平滑掉高频细节小尺度高斯保留更多细节两者相减留下来的就是介于两种尺度之间的结构——也就是带通。DoG在生物学上还模拟了视网膜神经节的感受野响应在边缘检测里也是经典算法。3.3 频域和空间域两种路线的对比很多初学者纠结到底用哪种实现我的看法是看场景维度频域实现空间域实现实现难度低代码直观中等需要设计核计算效率大图慢依赖FFT核小则快适合实时灵活性高频率响应任意设计受核尺寸和采样限制边界效应隐含着周期性假设可通过边界选项控制适合场景离线分析、参数调优实时系统、嵌入式部署如果你是在做研究或者一次性的数据处理频域实现更直观调参也方便。如果是要嵌入到实时检测系统里空间域卷积核一旦训练好就用不着每次做傅里叶变换了速度和稳定性都更好。4. 带通滤波器参数选型的实操策略带通滤波器的效果90%取决于参数选得好不好。参数选得不对比如通带范围设得太宽滤波结果跟原图区别不大设得太窄又会把有用的信息滤掉。这一节我把自己调参的完整思路和工具分享出来。4.1 通带范围怎么定从频谱图反推参数调参的第一步不是拍脑袋设个D0和D1而是先看频谱图搞清楚你要的信息到底在哪个频段。我常用的方法是先画出图像的频谱用视觉判断信息分布F fftshift(fft2(img)); % 取对数压缩动态范围方便观察 F_log log(1 abs(F)); imshow(F_log, []);观察频谱图时中心区域亮表示低频能量强四周的亮线或亮点对应着图像里特定方向的周期纹理或噪声。你要提取的纹理或结构如果在频谱上表现为某个半径附近的环形亮斑那通带的中心频率就选那个半径值通带宽度就覆盖亮斑的范围。如果觉得看图换算麻烦我还有一个更直接的定量方法把频谱按半径从中心向外累加能量画出能量随频率的分布曲线从曲线上找峰值区域。% 围绕频谱中心计算每个半径的能量 [M, N] size(F_shift); [u, v] meshgrid(1:N, 1:M); D sqrt((u - N/2 - 1).^2 (v - M/2 - 1).^2); radius round(D(:)); energy abs(F_shift(:)).^2; % 按半径分组求能量和 maxR max(radius); radial_energy zeros(maxR 1, 1); for r 0 : maxR radial_energy(r 1) sum(energy(radius r)); end plot(0 : maxR, radial_energy);看完这条曲线你大概就知道图像的能量集中在哪些频段。做带通滤波时通带就压在目标频段的峰值附近。4.2 高斯带通的sigma怎么选高斯带通滤波器里有两个核心参数中心频率D0和带宽控制参数sigma。D0好理解就是你要提取的主体频率sigma的作用是控制通带的宽度。我的经验是sigma取D0的0.3到0.6倍比较合理。sigma太小通带窄只提取非常单一的频率结果会像被“抽取”了纹理一样细节丢失严重sigma太大通带宽就会把邻近频段的无关信息也放进来失去了带通的意义。一个比较实用的做法是做一个参数扫描img im2double(imread(texture.png)); [M, N] size(img); F_shift fftshift(fft2(img)); sigmas 0.2 : 0.1 : 0.8; figure; for i 1 : length(sigmas) H gaussian_bandpass(M, N, 50, sigmas(i)); G F_shift .* H; filtered real(ifft2(ifftshift(G))); subplot(2, 4, i); imshow(filtered, []); title([sigma num2str(sigmas(i))]); end把不同sigma的结果并排显示你一眼就能判断哪个参数最贴合你的需求。这种“暴力扫描”法虽然不优雅但在实际项目中往往是最有效的调参手段。4.3 判定滤波效果好坏的客观指标除了靠肉眼观察我也建议用几个客观指标来辅助判断。这些指标在做项目报告、写论文时尤其有用。对比度Contrast滤波后的图像感兴趣区域的对比度是否提升了。可以用std2(filtered)计算标准差标准差越大说明图像灰度分布越分散对比度越高。信噪比SNR如果有一张干净的参考图可以计算滤波前后信噪比的变化确认滤波有没有把噪声压下去。能量保留率滤波后图像的能量灰度平方和占原始图像能量的比例。这个指标能告诉你带通滤波滤掉了多少信息能量保留率太低说明你把有用信息也滤掉了。不过我得说句实话工程上最靠谱的指标还是“下游任务表现”你是做缺陷检测的就看检测率有没有提升你是做血管分割的就看分割精度有没有变好。所有图像指标都只是参考最终效果得看业务结果。4.4 我自己的调参心法调带通参数踩了无数次坑之后我总结出一个原则从小带宽开始逐步向大带宽扩展。具体做法是先用频谱图锁定目标频段的大致位置。设置一个较窄的通带只包含目标频段。观察滤波结果如果目标结构提取不完整说明通带偏窄适当加大带宽。如果结果里出现明显噪声或背景干扰说明通带偏宽往回收缩。反复迭代直到结果在“提取完整”和“噪声干扰”之间达到平衡。这个方法虽然笨但比一次性设一个参数要可靠得多。因为带通滤波器的参数和图像内容强相关不存在通用的最优值必须针对具体的图像反复试。5. 实战中排过的坑完整排查链路与避坑手册看完了原理和基本操作我来分享一些实际动手时容易踩的坑。这些坑我基本都经历过有的查了半天资料才明白是怎么回事有的纯靠运气才绕过去。把它们记下来希望你能少走弯路。5.1 坑一滤波结果一片黑问题出在数据类型刚学MATLAB图像处理的人十有八九遇到过这样的问题滤波出来的图像黑乎乎一片什么都看不到。很大概率是你的图像经过傅里叶变换、乘法、反变换之后数据类型出了问题。imread读进来的图像是uint8类型范围是 0~255但傅里叶变换和乘法运算会产生浮点数而且范围可能远大于 255 或包含负值。如果你直接用imshow显示超范围的像素会被裁剪负值被截断为0结果自然是一片黑。正确的做法是在滤波之前就im2double转成双精度浮点类型显示的时候如果要归一化到0~1区间用imshow(filtered, [])让MATLAB自动调整显示范围。img im2double(img); % 计算前转double filtered real(ifft2(ifftshift(G))); % 取实部丢弃虚部残差 imshow(filtered, []); % 自动归一化显示还有一个常被忽略的细节反傅里叶变换后理论上结果应该是实数的但由于浮点计算误差会产生很小的虚部。如果直接用ifft2的结果做imshow会报错或者显示异常。必须用real()取实部或者至少abs()取模才能正常显示。5.2 坑二fftshift和ifftshift用反了这个坑非常隐蔽而且报错不会很直观。你可能会疑惑为什么我滤波的结果看起来像被旋转了或者滤波效果出现在了图像边缘而不是中心原因就是fftshift和ifftshift混用。简单说fftshift把频谱从“零频在角落”移到“零频在中心”。ifftshift做逆操作把“零频在中心”移回“零频在角落”。正确的使用顺序是F fft2(img); % 变换后零频在角落 F_shift fftshift(F); % 移到中心方便构造滤波器 G_shift F_shift .* H; % 滤波 G ifftshift(G_shift); % 移回角落准备反变换 filtered real(ifft2(G)); % 反变换注意反变换之前一定要用ifftshift把频谱还原成“零频在角落”的布局否则ifft2出来的图像会错位像被四分块交换了一样。5.3 坑三构造滤波器时坐标网格方向和矩阵尺寸不匹配meshgrid生成坐标矩阵时第一个输出对应列坐标u方向第二个输出对应行坐标v方向。如果你把meshgrid(1:M, 1:N)写反了构造出来的滤波器就是转置的滤波效果会完全不对。这是我见过最多人犯的低级错误包括我自己早期也栽过一次。一个比较稳的写法是直接用尺寸变量来构造[M, N] size(img); [u, v] meshgrid(1:N, 1:M); % u范围是1到N列数v范围是1到M行数 D sqrt((u - N/2 - 1).^2 (v - M/2 - 1).^2); % 距离注意减的是N/2和M/2这里的关键在于u对应图像宽度方向列v对应图像高度方向行。中心点的坐标就是 (N/21, M/21)。写完之后最好自己验证一下检查D(1,1)是否等于sqrt((1-N/2-1)^2 (1-M/2-1)^2)也就是左上角到中心的距离。5.4 坑四理想带通的振铃把结果毁了前面说过理想带通滤波器的阶跃截止会在空间域引入振铃伪影。这个坑的实际表现是滤波结果里目标周围出现一圈一圈的波纹尤其是亮暗交替的边缘处特别明显。我之前做血管增强时用理想带通把血管周围的伪影当成血管结构分割出来的结果简直没法看。改用高斯带通之后伪影立刻消失效果立竿见影。所以我的建议是优先使用高斯带通或低阶巴特沃斯带通别碰理想带通。除非你的图像完全没有强边缘否则振铃一定会来捣乱。5.5 坑五大图像滤波速度慢——频域预计算与单精度优化处理 2048x2048 甚至更大的图像时频域滤波的fft2和ifft2操作会比较耗时尤其是在老一点的电脑上跑起来极慢。我的解决办法有两个第一个是预计算滤波器。如果要对一批相同尺寸的图像做同样的滤波滤波器只需要构造一次之后每次只做fft2→ 乘法 →ifft2能省下不少时间。% 预先构造一次滤波器 [M, N] size(img_template); H gaussian_bandpass(M, N, 50, 0.4); for i 1 : num_files img im2double(imread(files{i})); filtered real(ifft2(ifftshift(fftshift(fft2(img)) .* H))); % 保存结果... end第二个是用单精度浮点数。双精度计算虽然精度高但大矩阵的双精度运算非常吃内存和时间。对于图像滤波这种任务单精度完全够用还能省一半内存img im2single(img); F fft2(img); H single(H); % 滤波器也转成单精度 G F .* H; filtered real(ifft2(G));我实测过单精度把2048x2048图像的滤波时间缩短了差不多40%而且结果肉眼几乎看不出差异。5.6 坑六边界效应的处理方式空间域滤波的边界效应是另一个高频坑。imfilter默认会用0填充边界这会导致滤波后的图像边缘出现一圈暗纹因为边界外全是0卷积结果在边界处被拉低。解决方案是显式指定边界选项filtered imfilter(img, h_dog, replicate, same);replicate表示向外复制边缘像素这是我用得最多的方式对大多数图像效果都好。如果图像边缘有重要信息也可以用symmetric镜像反射比replicate更平滑一点。千万别用默认的0填充除非你不在乎边缘那几十个像素。频域滤波也有类似的边界问题因为FFT默认把图像看成周期的左右边界、上下边界会“连接”起来如果图像左右边界灰度差异大滤波结果边缘会出现伪影。一个缓解的办法是在FFT之前对图像做边缘平滑处理比如用edgeTaper或手动对边界加窗。6. 一个完整的应用案例从需求到结果理论讲了一堆最后用一个完整的应用案例把这些内容串起来。这个案例是我以前做过的——从一张带有背景纹理干扰的电路板图中提取出特定频率的元件边缘信息用于后续的缺陷定位。6.1 项目需求与图像分析原始图像是一张电路板的灰度图元件边缘清晰但表面有一层均匀的纹理干扰。生产线上需要根据边缘信息定位元件边界但纹理干扰导致边缘检测结果里全是假的边缘。我先对图像做了频谱分析发现元件边缘的能量主要集中在半径约40到70像素的环形区域而纹理干扰的能量集中在更高的频率段半径约100以上。低频区域主要是照明不均匀造成的背景变化。这个分析结果说明需要一个通带为40到70的带通滤波器把元件边缘提取出来同时滤掉低频背景和高频纹理。6.2 MATLAB完整实现%% 带通滤波在元件边缘提取中的应用 % 读取图像 img imread(circuit.png); if size(img, 3) 3 img rgb2gray(img); end img im2double(img); %% 频域分析和滤波器构造 [M, N] size(img); [u, v] meshgrid(1:N, 1:M); D sqrt((u - N/2 - 1).^2 (v - M/2 - 1).^2); % 高斯带通中心频率55带宽系数0.4 D0 55; sigma 0.4; H 1 - exp(-(D.^2 - D0^2).^2 / (2 * (D0 * sigma)^2)); figure; subplot(2,2,1); imshow(img); title(原始图像); subplot(2,2,2); imshow(log(1 abs(fftshift(fft2(img)))), []); title(频谱对数); subplot(2,2,3); imshow(H, []); title(带通滤波器传递函数); % 频域滤波 F_shift fftshift(fft2(img)); G_shift F_shift .* H; G ifftshift(G_shift); filtered real(ifft2(G)); subplot(2,2,4); imshow(filtered, []); title(带通滤波结果); %% 后续处理边缘检测 edges edge(filtered, canny, 0.15); figure; imshow(edges); title(滤波后的边缘检测);6.3 效果对比与参数分析对比直接边缘检测和先带通滤波再边缘检测的结果差异非常明显处理流程检测到的边缘数量误检率边缘连续性直接Canny大量伪边缘高差边缘断裂严重带通滤波Canny目标边缘清晰低好边缘连续完整这个案例很好地说明了带通滤波在预处理中的价值它不直接做检测而是把后面算法的输入质量大幅提升让下游任务变得简单可靠。6.4 扩展同一个框架可以做高通、低通掌握了带通滤波的整个框架你会发现高通、低通都只是一个特例。低通只保留中心附近的低频代码上就是H(D D1) 0。高通把中心附近的低频去掉H(D D0) 0。带阻正好和带通相反H(D D0 D D1) 0。它们共享同一套频域处理的骨架只改滤波器构造那几行代码就行。所以学会了带通等于把整个频域滤波家族都学会了。写在最后的经验体会做了几年图像处理我的一个体会是带通滤波这玩意儿看着简单用好了很见功力。它不像深度学习那些模型可以端到端地暴力出结果而是要求你对图像内容有足够的理解——知道你要的信息在哪个频段知道怎么把它跟其他频率成分分开。这种对数据和问题的理解能力反而是越基础的技巧越能体现出来。实际动手的时候我建议你先别急着写代码先把图像的频谱图好好看一看。频谱图这东西看多了之后你会慢慢建立一种感觉——什么样的图像特征对应什么样的频谱形状这种感觉比任何公式都值钱。然后带着这种感觉去调参数、做实验你会发现带通滤波的思路其实无处不在。最后再分享一个我一直在用的小技巧把滤波器可视化出来。不管是构造好的传递函数图还是空间域卷积核的二维图都打印出来看一眼。滤波器本身长什么样决定了大半的滤波效果。我每次调参都会把频谱图、滤波器图和滤波结果图放在一起对比三个图一起看问题出在哪一目了然。这个习惯帮我避免了不少调试死胡同也让我对“频率”这个概念有了更实在的理解。本文还有配套的精品资源点击获取
返回列表