
简介NSST_toolbox 是一套面向图像融合研究的 MATLAB 工具箱全称非下采样剪切波变换工具箱适合从事遥感图像处理、医学影像分析等方向的研究者与工程师使用。它针对传统 PCA、小波、DCT 等方法在边缘与细节保持上的不足利用非下采样特性完整保留图像信息并通过剪切波结构捕捉线性与非线性特征在融合速度与细节恢复上较 NSCT 更具优势。压缩包共 28 个文件约 303KB以 22 个 .m 脚本为核心辅以 mexw32、mexw64、mexmac 等平台加速文件及 C 源码另含示例图像与旧版备份覆盖正逆变换、融合策略与显示对比等环节。目前已有 430 人学习下载。借助其中的变换、逆变换与融合函数读者可快速搭建实验流程自定义基于能量或熵的融合规则对比不同方法的融合效果为算法验证与论文复现提供便利。1. NSST 工具箱到底解决什么问题从 NSCT 到 NSST 的融合需求如果你手头有一批红外与可见光、多聚焦或者遥感多光谱图像想做一个比小波、比 NSCT 更“干净”的融合结果NSST 工具箱往往是绕不开的一站。NSST 全称非下采样剪切波变换Non-Subsampled Shearlet Transform它和 NSCT 一样具备平移不变性但方向表示更灵活、冗余度更低在图像融合里常被用来做多尺度多方向分解再配合系数融合规则重构出结果。这个NSST_toolbox.tar.gz就是一套 MATLAB 实现核心用途是给图像融合、去噪、边缘检测提供变换域工具。它适合两类人一是做遥感图像融合、医学图像融合、多聚焦融合的研究生和工程师二是想拿 MATLAB 快速验证融合规则、不想从零推导剪切波滤波器的人。热词里“遥感图像融合”“图像配准和图像融合是两个工作吗”这类疑问本质都指向同一个诉求——我需要一个能跑通、能改参数、能对比 NSCT 的融合底座。2. NSST 与 NSCT 的差异为什么融合任务里值得换一次2.1 从 NSCT 的冗余痛点说起NSCT 在图像融合里成名很早靠的是非下采样金字塔加非下采样方向滤波器组平移不变性让融合结果不容易出现伪吉布斯效应。但它的方向滤波器组设计复杂冗余度随分解层数快速上升一副 512×512 的图做三层分解系数规模可能膨胀到原图的十几倍。NSST 换了一条路用非下采样金字塔做多尺度分解再用剪切滤波器做方向分解。剪切滤波器通过矩阵剪切和重采样实现方向数可以取 2 的幂次冗余度比 NSCT 低不少同时保留了平移不变性。对融合任务来说这意味着同样做 4 层分解、每层 8 个方向NSST 的系数矩阵更小后续融合规则的计算量和内存占用都更友好。选型时我一般看三个点第一方向数是否可调NSST 通常支持每层独立设置方向数第二是否有现成的重构函数工具箱里nsst_dec和nsst_rec成对出现才敢用第三融合规则改起来是否方便系数是 cell 数组还是结构体直接影响你写融合逻辑的顺手程度。NSCT 的教程多、代码成熟但如果你要做方向数较多的融合实验NSST 的性价比更高。2.2 工具箱目录与核心函数速览拿到NSST_toolbox.tar.gz后解压出来通常能看到类似这样的结构不同版本文件名可能略有差异以实际为准文件/目录作用nsst_dec.mNSST 多尺度多方向分解主函数nsst_rec.mNSST 重构主函数shear_filter.m剪切滤波器构造nsp_dec.m/nsp_rec.m非下采样金字塔分解与重构demo_*.m融合或变换演示脚本images/示例图像核心调用逻辑是先做 NSP 分解得到低频和高频再对高频做剪切方向分解。融合时分别处理低频系数和高频系数最后逆变换。下面这段是最小可运行框架假设你已经把工具箱路径加入 MATLAB% 添加工具箱路径按实际解压位置修改 addpath(genpath(NSST_toolbox)); % 读取两幅待融合图像统一为灰度 double imgA im2double(imread(images/sourceA.png)); imgB im2double(imread(images/sourceB.png)); if size(imgA,3) 3 imgA rgb2gray(imgA); imgB rgb2gray(imgB); end % NSST 分解参数4 层每层方向数 [8 8 16 16] nlevels 4; shear_dirs [8 8 16 16]; % 分解 coeffA nsst_dec(imgA, nlevels, shear_dirs); coeffB nsst_dec(imgB, nlevels, shear_dirs); % 此处插入融合规则得到 coeffF % coeffF fuse_coeff(coeffA, coeffB); % 重构 imgF nsst_rec(coeffF, nlevels, shear_dirs); % 显示与保存 figure; imshow(imgF); title(NSST 融合结果); imwrite(imgF, fused_nsst.png);逻辑说明nsst_dec返回的系数通常是一个结构体或 cell第一层是低频后续是各尺度各方向的带通系数。shear_dirs的长度必须等于nlevels每个元素是该层方向数一般取 2 的幂。参数怎么改方向数越多方向选择性越细但计算量上升层数越多尺度分离越细但重构误差累积风险也增加。常见做法是 3 到 4 层方向数从 8 起步高频层给到 16。失败时先看nsst_dec是否报维度不匹配多半是图像尺寸不是 2 的幂次附近或者方向数与滤波器长度冲突。3. 用 NSST 跑通图像融合分解、规则、重构三步3.1 分解阶段层数与方向数怎么定分解参数直接决定融合结果的上限。层数太少低频和高频混在一起融合规则难以区分“轮廓”和“细节”层数太多高频系数噪声也被放大重构后容易出现振铃。我一般先用 3 层做快速验证确认流程通了再上 4 层。方向数方面第一层低频子带通常不参与方向分解后续每层方向数递增比如[4 8 8 16]或[8 8 16 16]。遥感图像融合里空间细节丰富方向数可以给大一点多聚焦图像融合方向数适中即可重点在清晰度度量。% 参数对比实验不同方向数对融合结果的影响 dir_sets {[4 8 8 16], [8 8 16 16], [8 16 16 32]}; for k 1:length(dir_sets) dirs dir_sets{k}; cA nsst_dec(imgA, length(dirs), dirs); cB nsst_dec(imgB, length(dirs), dirs); % 融合规则见下一节 cF simple_fuse(cA, cB); f nsst_rec(cF, length(dirs), dirs); psnr_val psnr(f, imgA); % 仅作示例指标 fprintf(方向数配置 %sPSNR%.2f\n, mat2str(dirs), psnr_val); end这段代码把方向数配置做成循环方便你横向对比。注意psnr需要参考图融合任务里如果没有 ground truth可以改用信息熵、标准差、空间频率等无参考指标。参数说明length(dirs)就是层数dirs每个元素必须是 2 的幂否则剪切滤波器构造可能失败。3.2 融合规则低频取平均还是取最大低频系数代表图像的近似分量常见做法是加权平均权重可以固定 0.5也可以按局部能量自适应。高频系数代表边缘和纹理常用“绝对值取大”或“区域方差取大”。绝对值取大实现简单但对噪声敏感区域方差取大更稳但要算窗口。下面是一个可抄的融合规则函数function cF simple_fuse(cA, cB) % 假设 cA、cB 为 nsst_dec 返回的 cell 结构 % 第一层为低频后续为高频 cF cell(size(cA)); % 低频加权平均 cF{1} 0.5 * cA{1} 0.5 * cB{1}; % 高频绝对值取大 for i 2:length(cA) if iscell(cA{i}) cF{i} cell(size(cA{i})); for j 1:length(cA{i}) a cA{i}{j}; b cB{i}{j}; mask abs(a) abs(b); cF{i}{j} mask .* a (~mask) .* b; end else a cA{i}; b cB{i}; mask abs(a) abs(b); cF{i} mask .* a (~mask) .* b; end end end逻辑说明低频直接平均保证整体亮度稳定高频逐方向比较绝对值保留边缘更强的系数。参数说明如果你把低频改成0.7*cA{1}0.3*cB{1}融合结果会偏向 A 图高频如果想抗噪可以把abs(a)换成局部方差窗口大小取 3×3 或 5×5。注意 cell 嵌套层数要和nsst_dec返回结构一致否则重构会报错。3.3 重构与结果验证重构调用nsst_rec传入融合后的系数和与分解时完全相同的层数、方向数。重构后检查三件事一是尺寸是否和原图一致二是数值范围是否在 [0,1]三是目视有没有明显伪影。如果尺寸不对多半是分解时图像被填充过重构后需要裁剪。如果数值溢出用mat2gray归一化后再保存。imgF nsst_rec(cF, nlevels, shear_dirs); imgF mat2gray(imgF); % 归一化到 [0,1] % 客观指标 ent entropy(imgF); sf spatial_freq(imgF); % 需自行实现或从工具箱找 fprintf(信息熵%.4f空间频率%.4f\n, ent, sf);空间频率衡量图像整体活跃度融合结果一般比单幅源图高。信息熵反映信息量也是越大越好但要注意过大会引入噪声。验证时建议同时跑 NSCT 做对照把两组指标放一张表里差异才看得清。4. 避坑与排查NSST 融合里最容易翻车的 5 个点4.1 现象分解报错“维度不匹配” → 原因图像尺寸与滤波器不兼容 → 解决先填充再分解NSST 的 NSP 分解对图像尺寸有隐含要求常见实现会按 2 的幂次做延拓。如果你直接拿 375×500 的图进去可能在某些层报维度错误。解决方法是先padarray到最近的 2 的幂次分解重构后再裁回原尺寸。别小看这一步我见过不少人卡在这里以为工具箱坏了。4.2 现象重构结果全黑或全白 → 原因系数结构被破坏 → 解决检查融合函数是否改变了 cell 嵌套nsst_dec返回的系数可能是多层 cell低频一层高频每层又是一个 cell。如果你在融合时把高频 cell 拍平成了矩阵nsst_rec就找不到对应方向重构出来自然是废的。排查方法在融合前后用size和iscell打印结构确保层数和方向数一致。4.3 现象融合结果有网格状伪影 → 原因方向数过高或剪切滤波器设计问题 → 解决降低方向数或换滤波器参数方向数给到 32 以上时某些版本的剪切滤波器在边界处会出现网格伪影。这不是你融合规则的问题是变换本身的数值特性。先把方向数降到 16 试试如果伪影消失说明是方向分解过细导致。遥感图像融合里如果非要高方向数可以在重构后加一次轻微高斯滤波但会损失细节慎用。4.4 现象低频平均后整体偏暗 → 原因两幅源图亮度差异大 → 解决改用自适应加权或先做亮度均衡如果源图 A 整体偏亮、B 偏暗固定 0.5 平均会让结果偏暗。常见做法是先对两幅图做直方图匹配或亮度均衡再融合。或者低频权重按局部均值自适应w meanA / (meanA meanB)逐块计算。这个改动不大但效果立竿见影。4.5 现象运行速度慢到无法接受 → 原因方向数过多或图像过大 → 解决先降采样验证再上全尺寸NSST 本身比小波慢如果方向数给到[16 16 32 32]一副 1024×1024 的图跑一次分解可能要几十秒。调试阶段建议先把图像缩到 256×256参数调好后再上全尺寸。另外MATLAB 的循环尽量向量化融合规则里少用逐像素 for。5. 进阶技巧把 NSST 融合做成可对比的实验流水线如果你要写论文或者做工程对比单次跑通不够得把 NSST、NSCT、小波放在同一套评价体系下。我的习惯是写一个run_fusion.m脚本输入源图路径和算法名输出融合图和指标表。这样换算法只改一个字符串不用重复改代码。function [imgF, metrics] run_fusion(imgA, imgB, method) switch method case nsst dirs [8 8 16 16]; cA nsst_dec(imgA, length(dirs), dirs); cB nsst_dec(imgB, length(dirs), dirs); cF simple_fuse(cA, cB); imgF nsst_rec(cF, length(dirs), dirs); case nsct % 调用 NSCT 工具箱参数对齐 % ... case dwt [cA,~] wavedec2(imgA, 3, db4); [cB,~] wavedec2(imgB, 3, db4); cF 0.5*cA 0.5*cB; % 简化示意 imgF waverec2(cF, [], db4); end imgF mat2gray(imgF); metrics.entropy entropy(imgF); metrics.std std2(imgF); % 空间频率、互信息等按需补充 end这个流水线的好处是你可以批量跑不同图像对把指标存成表格直接看出 NSST 在哪些场景下优于 NSCT。参数对齐很关键层数、方向数、融合规则尽量保持一致否则对比不公平。我一般还会固定随机种子避免可复现性问题。另一个技巧是保存中间系数。调试融合规则时把cA、cB、cF存成.mat文件下次不用重新分解直接加载改规则能省大量时间。MATLAB 的save和load就够用注意文件别太大高频系数很占空间。最后说个血泪经验NSST 工具箱不同来源的版本函数签名可能不一样有的nsst_dec参数是结构体有的是位置参数。拿到手先跑demo确认调用方式再改自己的代码。别一上来就套网上的示例版本对不上会浪费一整天。希望帮到你。本文还有配套的精品资源点击获取