图像处理02 matlab中NSCT的使用

06 matlab中NSCT的使用

最近在学习NSCT相关内容,奈何网上资源太少,简单看了些论文找了一些帖子才懂了一点点,在此分享给大家,希望有所帮助。

一.NSCT流程

首先我们先梳理一下NSCT变换的流程,只有清楚流程才更好的理清NSCT工具箱里的代码,才能够根据自己的需要进行灵活使用。

①NSPFB进行非下采样金子塔分解将图像分解为低频和高频分量,比如下图所示,进行三层分解就可以得到三个高频分量和一个低频分量。

image

②NSDFB对NSP分解后的高频分量进行方向分解,在不同方向上进行分解,分解成为不同方向上的细节信息。

image

③经过上面两个步骤,我们其实就已经实现了NSCT分解的全部过程,如下图所示。

image

④那么如何进行图像的重构呢,这是针对我目前应用到的图像融合进行分析的,我们利用制定好的图像融合的规则,分别将低频分量,和各个方向上的信息进行融合,最终得到的是将两个上图所示的结构又变成了一个这样结构。

⑤将各个方向的频率信息合在一起得到每一层总的高频信息,3-1的结构又变回了金字塔结构,之后我们只要进行金字塔重构即可,从底层到顶层这样一个过程。
至此虽然忽略掉了一些细节(虽然我也不太懂),我们大概理清了NSCT分解和图像重构的这样一个流程,搞懂这个流程再去看代码自然就事半功倍了。

二. matlab关键代码解析

1.小试牛刀(搞懂一个函数快速上手使用)

关键函数:NSCT再matlab NSCT 工具箱中仅仅下面一个函数即可实现。

y = nsctdec(x, levels, [dfilt, pfilt] )
  • x:图像的输入矩阵,双精度数据类型
  • levels:方向滤波器组分解层数向量,注意是一组向量值,比如[1 2 3],就是说明对第一层高频分量进行2个方向分解,第二层4方向分解,第三层8方向分解。
  • dfilt:方向滤波器组
  • pfilt:塔式分解的滤波器组
  • out:输出的结果是一组向量集合,集合第一个向量是低频分量的二维数组,接下来是从小到大排列高频子带。

经过三次分解后,我们输出一下每层的信息(注意inshow中我引用的格式,关注一些cell里面输出内容,就可以上手使用了)


subplot(2,2,2);
imshow(Insp{1,1},[]);
 title('低频分量');
subplot(2,2,3);
imshow(Insp{1,2}{1,1},[]);
 title('高频1');
subplot(2,2,4);
imshow(Insp{1,2}{1,2},[]);
 title('高频1');

image

2.登堂入室(看看这个函数背后的细节)

这个函数所实现的无外乎就是在上文中所讲诉的流程,想了想没必要仔细去讲,下面是完整注释版代码,大家对着注释好好看一下就好。

function [Insp,Insct]= myNSCTd(I,levels,pfiltername,dfiltername,type)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数功能:完成图像的level级NSCT分解
%%函数输入:I	——输入源图像
%          levels	——分解级别的数组,例如[1,2,3],分解的方向数分别为[2,4,8].
%          pfiltername	——塔式分解滤波器名称
%          dfiltername  ——方向分解滤波器名称
%%函数输出:Insct    ——输出为cell类型,包括低通以及各级别各方向的分量
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                      
 
%%%%%%%%生成非下采样金字塔滤波器组%%%%%%%%%%%%%
%该函数为copy的,可选参数如下:
%'9-7'、'maxflat'、'pyr'、'pyrexc'
%输出的h0,h1是金字塔分解滤波器
%输出的g0,g1是金字塔重构滤波器
[ph0, ph1, pg0, pg1] = atrousfilters(pfiltername);%无法改进
 
%%%%%%%%%生成非下采样方向滤波器组%%%%%%%%%%%%%
%建立一个4*4的空矩阵,存放滤波器组
filtersd = cell(4) ;
 
%function [h0, h1] = dfilters(fname, type)
%copy的函数,作用是根据名字生成方向滤波器
%fname的可选参数有:'haar'、'vk'、'ko'、'kos'、
%'lax'、'sk'、'cd'、'pkva'、'oqf_362'、'sinc'
%其中测验结果看的比较舒服的有'lax'、'sk'、'cd'
%最理想的是'pkva',copy函数中的ldfilter.m、
%ld2quin.m和qupz.m都是用语生成该滤波器
%type的可选参数有:'d'、'r',分别表示生成分解
%滤波器和重构滤波器。
%输出的h0为小波函数(高频),h1为尺度函数(低频)
[dh1, dh2] = dfilters(dfiltername, 'd'); %无法改进
dh1 = dh1./sqrt(2) ;
dh2 = dh2./sqrt(2) ;
 
%function y = modulate2(f, type, center)
%copy的函数,作用是将输入的方向滤波器f依据type类型增加方向性
%type可选参数有:'r'生成横向梳状滤波器、'c'生成纵向梳状滤%波器、
%'d'生成网格型滤波器(综合横纵梳状滤波器的特点)
%center参数,对输入滤波器的初始中心作确定,通常默认为[0 0]。
filtersd{1} = modulate2(dh1, 'c');%无法改进
filtersd{2} = modulate2(dh2, 'c');%无法改进
 
%function [y1, y2] = parafilters( f1, f2 )
%copy的函数,输入是两个滤波器,输出是两个滤波器组
%作用是将输入的两个滤波器分别增加行列方向性之后
%再分别转置,生成四个不同的滤波器
%随后循环调用function y = resampz(x, type, shift)
%copy的函数,输入是单个滤波器x,type是上面生成的四个滤波器
%中的第几个,shift通常不输入,为默认值1.
%对每个滤波器作旋转,即生成四个旋转后的方向滤波器。
%综合结果:
%对输入的两个滤波器,输出两组旋转后的滤波器,每组四个
[filtersd{3}, filtersd{4}] = parafilters( dh1, dh2 ) ;%无法改进
 
%判断分解层数
clevels = length( levels );
%初始化输出缓存
nIndex = clevels + 1 ;
y = cell(1, nIndex) ;
Insp=cell(1,clevels);
 
%NSCT分解
for i= 1 : clevels   
 
    %对图像进行金字塔分解,xlo为低通输出,xhi为高通输出
    switch type
        case 'NSCT'
            [Ilow, Ihigh] = NSPd(I, ph0, ph1, i-1) ;%无法改进
            %NSPlow{i}=Ihigh;
        case 'NewPM'
            [Ilow,Ihigh]=Newmcd(I);
    end
  
    %如果方向分解级别不为0,进行方向分解,并将结果存入y的对应部分
    if levels(nIndex-1) > 0 
        % function nsdfbdec中,在level高于3的时候,采样矩阵M的设定不懂,
        % 所以只能copy过来。
      
        Ihigh_dir = nsdfbdec(Ihigh, filtersd, levels(nIndex-1));      
        y{nIndex}=Ihigh_dir ;
      
 
    %若方向分解级别为0,直接复制
    else 
        y{nIndex}=xhigh ;
    end
  
    %更新输出缓存指针
    nIndex = nIndex - 1 ;
  
    %更新图像为分解的低通部分,进行下一次迭代
    I = Ilow ;
    Insp{i}=I;
end
 
% 输出的第一副图为最后的低通结果。
y{1}=I;
Insct=y;
 
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/171270.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis(位图Bitmap和位域Bitfield)

位图: 位图是字符串类型的扩展。 Redis中的位图是一种特殊的数据结构,用于表示一系列位的集合。它可以存储大量的布尔值数据,每个位代表一个布尔值(0或1),并且可以对这些位进行各种位运算操作。位图通常用…

【ARM Trace32(劳特巴赫) 使用介绍 2.3 -- TRACE32 进阶命令之 参数传递介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 参数传递命令 ENTRY 参数传递命令 ENTRY ENTRY <parlist>The ENTRY command can be used to Pass parameters to a PRACTICE script or to a subroutineTo return a value from a subroutine 使用示例&am…

C++入门第八篇---STL模板---list的模拟实现

前言&#xff1a; 有了前面的string和vector两个模板的基础&#xff0c;我们接下来就来模拟实现一下list链表模板&#xff0c;我还是要强调的一点是&#xff0c;我们模拟实现模板的目的是熟练的去使用以及去学习一些对于我们本身学习C有用的知识和用法&#xff0c;而不是单纯的…

泛型进阶:通配符

基本概念 对泛型不了解的可以看这篇博客&#xff1a;数据结构前瞻-CSDN博客 一般来说&#xff0c;&#xff1f;在泛型里的使用就是通配符 看看下面的代码 class Message<T> {private T message ;public T getMessage() {return message;}public void setMessage(T m…

Qml使用cpp文件的信号槽

文章目录 一、C文件Demo二、使用步骤1. 初始化C文件和QML文件&#xff0c;并建立信号槽2.在qml中调用 一、C文件Demo Q_INVOKABLE是一个Qt元对象系统中的宏&#xff0c;用于将C函数暴露给QML引擎。具体来说&#xff0c;它使得在QML代码中可以直接调用C类中被标记为Q_INVOKABLE的…

【Sql】sql server还原数据库的时候,提示:因为数据库正在使用,所以无法获得对数据库的独占访问权。

【问题描述】 sql server 还数据库的时候&#xff0c;提示失败。 点击左下角进度位置&#xff0c;可以得到详细信息&#xff1a; 因为数据库正在使用&#xff0c;所以无法获得对数据库的独占访问权。 【解决方法】 针对数据库先后执行下述语句&#xff0c;获得独占访问权后&a…

Python 和 Ruby 谁是最好的Web开发语言?

Python 和 Ruby 都是目前用来开发 websites、web-based apps 和 web services 的流行编程语言之一。 【这个时候又人要说PHP是世界上最好的语言了】 我就不说PHP 最好的方法 VS 以人为本的语言 社区: 稳定与创新 尽管特性和编程哲学是选择一个语言的首要驱动因素&#xff0c…

stack和queue简单实现(容器适配器)

容器适配器 stack介绍stack模拟实现queue 介绍queue模拟实现deque stack介绍 stack模拟实现 以前我们实现stack&#xff0c;需要像list,vector一样手动创建成员函数&#xff0c;成员变量。但是stack作为容器适配器&#xff0c;我们有更简单的方法来实现它。 可以利用模板的强大…

C语言生成dll与lib文件

环境要求 新建一个空白项目&#xff0c;可以是exe的&#xff0c;也可以直接是dll的&#xff0c;也可以是啥都没有的空项目&#xff0c;推荐创建空项目&#xff0c;项目创建好以后进行配置&#xff0c;共两步 第一步&#xff0c;打开项目属性 第二步&#xff0c;设置配置类型…

基础课10——自然语言生成

自然语言生成是让计算机自动或半自动地生成自然语言的文本。这个领域涉及到自然语言处理、语言学、计算机科学等多个领域的知识。 1.简介 自然语言生成系统可以分为基于规则的方法和基于统计的方法两大类。基于规则的方法主要依靠专家知识库和语言学规则来生成文本&#xff0…

java中的抽象

1.当一个类中给出的信息不够全面时&#xff0c;&#xff08;比方说有无法确定的行为&#xff09;&#xff0c;它给出的信息不足以描绘出一个具体的对象&#xff0c;这时我们往往不会实例化该类&#xff0c;这种类就是抽象类。 2. 在Java中&#xff0c;我们通过在类前添加关键字…

Redis篇---第九篇

系列文章目录 文章目录 系列文章目录前言一、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?二、什么情况下可能会导致 Redis 阻塞?三、缓存和数据库谁先更新呢?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…

南京--ChatGPT/GPT4 科研实践应用

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

MySQL 数据库下载

1 最新版 MySQL :: Download MySQL Community Server 2 存档版本(Archived Versions)-历史版本 MySQL :: Download MySQL Community Server (Archived Versions) 3 下载(样例: zip 方式) tip1&#xff1a; 可以下载安装文件的方式&#xff0c;也可以使用压缩包方式&#xff…

Git详解

Git是一个开源的分布式版本控制系统&#xff0c;常用于软件开发中对代码版本管理。Git具有版本控制、协作开发、分支管理、代码审查等功能&#xff0c;能够记录每次代码修改的内容和时间&#xff0c;并能够回滚到任意历史版本&#xff0c;方便团队协作和代码维护。 Git的基本概…

腾讯云5年服务器2核4G和4核8G配置租用价格表

腾讯云百科整理五年云服务器优惠活动 txybk.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频3…

SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用

SQL NULL 值 什么是 NULL 值&#xff1f; NULL 值是指字段没有值的情况。如果表中的字段是可选的&#xff0c;那么可以插入新记录或更新记录而不向该字段添加值。此时&#xff0c;该字段将保存为 NULL 值。需要注意的是&#xff0c;NULL 值与零值或包含空格的字段不同。具有 …

大数据Doris(二十五):Stream Load数据导入演示和其他导入案例

文章目录 数据导入演示和其他导入案例 一、数据导入演示

万字解析设计模式之 装饰者模式

一、装饰者模式 1.1概述 装饰者模式是一种结构型设计模式&#xff0c;它允许在运行时动态地为一个对象添加额外的职责。它以一种透明的方式来扩展对象的功能&#xff0c;而不需要通过子类来实现。在装饰者模式中&#xff0c;有一个基本对象&#xff0c;也称为组件&#xff0c;…

2023年亚太杯数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…