图像配准的方法

2023-10-27

转自:http://blog.sina.com.cn/s/blog_4b9b714a0100d5k5.html

 图像配准的方法

基于特征的图像配准

基于特征的图像配准首先提取图像信息的特征,然后以这些特征为模型进行配准。特征提取的结果是一含有特征的表和对图像的描述,每个特征由一组属性表示,对属性的进一步描述包括边缘的定向和弧度、区域的大小等。局部特征之间存在着相互关系,如几何关系、辐射度量关系、拓扑关系等。可以用这些局部特征之间的关系描述全局特征。通常基于局部特征配准大多都是基于点、线或边缘的,而全局特征的配准则是利用局部特征之间的关系进行配准的方法。

由于图像的特征点比图像的像素点要少很多,因此大大减少了配准过程的计算量,但特征提取方法的计算代价通常较大,不便于实时应用。特征点的配准度量值对位置的变化比较敏感,可以大大提高配准的精确程度。对于纹理较少的图像区域提取的特征的密度通常比较稀少,局部特征的提取就比较困难。特征点的提取过程可以减少噪声的影响,对灰度变化、图像形变和遮挡等都有较好的适应能力。因此,在图像配准领域得到了广泛应用。基于特征的图像配准方法有两个重要环节:特征提取和特征配准。

2  基于互信息的图像配准

医学图像配准技术从基于特征的配准方法发展到基于统计的配准方法有其突破性的意义。与基于特征的配准方法相比,基于统计的配准方法的突出优点为鲁棒性好、配准精度高、人工干预少。基于统计的配准方法通常是指最大互信息的图像配准方法。

基于互信息的图像配准是用两幅图像的联合概率分布与完全独立时的概率分布的广义距离来估计互信息,并作为多模态医学图像配准的测度。当两幅基于共同的解剖结构的图像达到最佳配准时,它们的对应像素的灰度互信息应为最大。由于基于互信息的配准对噪声比较敏感,首先,通过滤波和分割等方法对图像进行预处理。然后进行采样、变换、插值、优化从而达到配准的目的。

基于互信息的配准技术属于基于像素相似性的方法。它基于图像中所有的像素进行配准,基于互信息的图像配准引入了信息论中的概念,如熵、边缘熵、联合熵和互信息等,可使配准精度达到亚像素级的高精度。    

基于互信息只依赖于图像本身的信息,不需要对图像进行特征点提取和组织分类等预处理,是一种自动而有效的配准算法。该算法可靠,对图像中的几何失真、灰度不均匀和数据的缺失等不敏感。不依赖于任何成像设备,可应用于多模态医学图像配准。基于互信息的图像配准也有其缺点,它运算量大,对噪声敏感,要求待配准图像间联合概率分布函数必须是严格正性的。

【例1】计算两幅图像的互信息。

function mi = MI(a,b)

%Caculate MI of a and b in the region of the overlap part

%计算重叠部分

[Ma,Na] = size(a);

[Mb,Nb] = size(b);

M=min(Ma,Mb);

N=min(Na,Nb);

%初始化直方图数组

hab = zeros(256,256);

ha = zeros(1,256);

hb = zeros(1,256);

%归一化

if max(max(a))~=min(min(a))

a = (a-min(min(a)))/(max(max(a))-min(min(a)));

else

a = zeros(M,N);

end

if max(max(b))-min(min(b))

b = (b-min(min(b)))/(max(max(b))-min(min(b)));

else

b = zeros(M,N);

end

a = double(int16(a*255))+1;

b = double(int16(b*255))+1;

%统计直方图

for i=1:M

for j=1:N

indexx = a(i,j);

indexy = b(i,j) ;

hab(indexx,indexy) = hab(indexx,indexy)+1;%联合直方图

ha(indexx) = ha(indexx)+1;%a图直方图

hb(indexy) = hb(indexy)+1;%b图直方图

end

end

%计算联合信息熵

hsum = sum(sum(hab));

index = find(hab~=0);

p = hab/hsum;

Hab = sum(sum(-p(index).*log(p(index))));

%计算a图信息熵

hsum = sum(sum(ha));

index = find(ha~=0);

p = ha/hsum;

Ha = sum(sum(-p(index).*log(p(index))));

%计算b图信息熵

hsum = sum(sum(hb));

index = find(hb~=0);

p = hb/hsum;

Hb = sum(sum(-p(index).*log(p(index))));

%计算a和b的互信息

mi = Ha+Hb-Hab;

%计算a和b的归一化互信息

%mi = hab/(Ha+Hb);

3  医学图像配准

目前,图像配准技术在医学领域应用得相当广泛。医学图像配准具有很重要的临床应用价值。对各种使用相同或者不同的成像手段所获得的医学图像进行配准不仅可以应用于医疗诊断,也可以应用于手术计划的制定、治疗计划的制定、病理情况的跟踪和治疗效果的评价等各个方面。

下面给出一个具体的图像配准的例子来形象说明配准的应用。

 

(1) 读取图像数据。因为源图像以矩阵形式存在一个二进制的文件里,用fread可将其读取到变量矩阵中。将读取文件编制成一个子函数(RTIread.m)。源代码如下:

function imMatrix=RTIread(FILENAME,SIZE)

%RTIread Read the image matrix from binary "Registration Test Image" file.

% imMatrix=RTIread(FILENAME,SIZE) opens the file FILENAME, and reads the

% number of elements specified by SIZE.

%

% FILENAME is a string containing the name of the file to be opened.

% Valid entries for SIZE are:

% N read N elements into a column vector.

% inf read to the end of the file.

% [M,N] read elements to fill an M-by-N matrix, in column order.

% N can be inf, but M can't.

%

% It returns the image matrix.

fid=fopen(FILENAME,'r');

imMatrix=fread(fid,SIZE,'uint8=>uint8');

fclose(fid);

这里选取了两张256×256的图片,文件名为sag1.tif和sag2.tif。

 

运行以下代码读取图像矩阵:

base=RTIread('sag1.tif',[256,256]);

input=RTIread(sag2.tif,[256,256]);

(2) 选取匹配点。根据预定的配准方法,选定足够的匹配点对。运行下列代码:

cpselect(input,base); %please select 15 points for test.

 

注意:

这里允许选择15个点进行测试。

操作很简单,只需注意选点要均匀布开,以增加其代表性。选定完毕,再选择File→Save Points to Workspace命令将数据保存到工作区中。Workspace立刻多出两个N×2的数组(其中N为选定的匹配点对数),分别为input_points和base_points。

(3) 利用十字相关法调整选定了的匹配点。如果对上面一个步骤的选点工作不满意,可以进行这一步。如果感觉尚可,则跳过这一步,以减小运算量。

运行代码:

input_points_corr = cpcorr(input_points,base_points,input,base);

%优化选择点的作用

input_points_corr为优化后在输入图片的对应匹配点。

(4) 计算变换公式的参数。利用cp2tform选定变换类型(配准方法),计算变换参数。以下只需选定一种即可。

% (1) not Fine-tune points

Tlinear = cp2tform(input_points,base_points,'linear conformal');

Taffine = cp2tform(input_points,base_points,'affine');

Tprojective = cp2tform(input_points,base_points,'projective');

Tpolynomial2 = cp2tform(input_points,base_points,'polynomial',2);

Tpolynomial3 = cp2tform(input_points,base_points,'polynomial',3);

Tpolynomial4 = cp2tform(input_points,base_points,'polynomial',4);

Tpiecewise = cp2tform(input_points,base_points,'piecewise linear');

Tlwm = cp2tform(input_points,base_points,'lwm');

% (2)Fine-tune points

fTlinear = cp2tform(input_points_corr,base_points,'linear conformal');

fTaffine = cp2tform(input_points_corr,base_points,'affine');

fTprojective = cp2tform(input_points_corr,base_points,'projective');

fTpolynomial2 = cp2tform(input_points_corr,base_points,'polynomial',2);

fTpolynomial3 = cp2tform(input_points_corr,base_points,'polynomial',3);

fTpolynomial4 = cp2tform(input_points_corr,base_points,'polynomial',4);

fTpiecewise = cp2tform(input_points_corr,base_points,'piecewise linear');

fTlwm = cp2tform(input_points_corr,base_points,'lwm');

(5) 变换图像。

% Transform the unregistered image to bring it into alignment.

title('image registration polynomial method');

subplot(2,2,1);

imshow(base);

title('Base image');

subplot(2,2,2);

imshow(input);

title('Input image');

subplot(2,2,3);

imshow(imtransform(input,Tpolynomial2));

title('registered image');

subplot(2,2,4);

imshow(imtransform(input,fTpolynomial2));

title('registered image(fine-tune points)');

 

小结:

(1) 选择适当的方法来建立转换参数,并非算法越复杂越好,应参考成像因素(退化因素)。

(2) 利用cpselect选择匹配点,cpselect可以返回一个GUI句柄。在使用中,应当尽量选择恰当的匹配区域,这样能够得到较好的效果。

上面的这个例子典型地说明了图像配准的步骤:提取图像特征,根据特征对进行几何变换,执行整个变换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像配准的方法 的相关文章

  • 如何使用 winforms 在 C# 中从网络下载显示下载进度的图像?

    我使用 WebRequest 从 URL 异步下载图像 如下所示 public void Download string url byte buffer new byte 0x1000 WebRequest request HttpWebR
  • 沿着预定路径移动图像?

    是否可以通过按下 iphone SDK 中的按钮来将图像设置为沿着预定路径运动 我不是在寻找任何奇特的东西 我正在研究一个简单的概念 但这会节省大量动画工作 是的 您可以通过创建一个路径来为任何 CALayer 制作动画CAKeyframe
  • 计算字符串向量中连续数字的函数

    我想创建一个函数 它接受至少 1 个元素的字符串对象并包含数字 2 到 5 并确定是否存在至少 N 长度的连续数字 其中 N 是实际数字值 如果是 则返回字符串 true 否则返回字符串 false 例如 Input 555123 Outp
  • html 中的输入字段可以有多少个字符?

    html 输入字段中允许的 自然 字符数是多少 多谢 根据评论添加 我不需要通过邮寄或获取将其发送到服务器 我将通过 JS 解析字符串 因此 如果输入是无限的 就像 sAc 所说 这会给我带来两个进一步的问题 JS 最长的 String 可
  • 更新:随机将行添加到矩阵中,但遵循严格的规则

    以下是一个更大的矩阵的一部分 0 1 0000 1 0000 77 0000 100 0000 0 0 2500 0 1 0000 1 0000 72 0000 100 0000 0 2500 0 2500 0 1 0000 1 0000
  • Laravel 上传前如何压缩图像?

    我正在制作一个图片库网站 用户可以在其中上传任何图像 它们将显示在前端 我需要在不影响图像质量的情况下压缩图像 以减小图像大小 以便页面加载速度不会影响那么大 我使用以下代码来上传图像 rules array file gt require
  • 如何加载图像文件到ImageView?

    我试图在从文件选择器中选择图像文件后立即显示该图像文件 文件选择器仅限于 png 和 jpg 文件 所选文件存储在文件类型的变量中 为此 我设置了一个 ImageView 我希望用这个新文件设置图像 唯一的问题是它的类型是文件而不是图像 如
  • 根据用户输入使用 Jquery 显示/隐藏字段

    li class numeric optional li
  • Google App Engine 中的图像上传

    我正在开发一个网站 用户可以上传与某个位置相关的帖子 然后他们可以添加两到三张照片 我了解如何使用数据存储区或 Blobstore 进行基本上传 但我想将这些照片链接到帖子和用户 然后能够在连接到帖子和用户的所有页面中显示它们 这是一般的想
  • Java中读取图像文件的方式有什么区别?

    在java中读取图像文件有多种方法 例如BufferedImage and ImageIcon仅举几例 我想知道这些情况有什么区别 它们是否依赖于上下文 在特定情况下只能使用其中一个 阅读所选图像的最佳方式是什么JFileChooser由用
  • 禁用 Angular 2 中的按钮

    我想如果输入 合同类型 为空 则 保存 按钮不可点击 保存按钮 div class col md 4 div
  • 查找一个二维矩阵是否是另一个二维矩阵的子集

    最近我参加了一个黑客马拉松 我了解到一个问题 试图在 2d 矩阵中找到网格形式的模式 模式可以是 U H 和 T 并由 3 3 矩阵表示 假设我想展示 H 和 U 1 0 1 1 0 1 1 1 1 gt H 1 0 1 gt U 1 0
  • Java - 使用 JNA 的 Windows 任务栏 - 如何将窗口图标 (HICON) 转换为 java 图像?

    我正在尝试将应用程序切换器添加到我正在处理的更大项目中 它需要在 Windows XP Vista 7 8 上运行 我正在使用 Java 1 7 下面是我创建的一个示例应用程序 用于演示我遇到的一些问题 我对 JNA 很陌生 非常感谢 充满
  • WPF 中图像的淡入淡出

    当我更改幻灯片放映等图像源时 如何实现淡入和淡出图像 我的图像从本地和网络加载 并且其数量是可变的 谢谢 您可以编写一个扩展方法 通过动画显示图像来淡出图像Opacity属性设置为 0 然后设置Source属性并最终将不透明度动画回到 1
  • 将键码转换为相关的显示字符

    在 C Windows Forms 项目中 我有一个不提供 KeyPressed 事件的控件 它是一个 COM 控件 ESRI 映射 它仅提供 KeyUp 和 KeyDown 事件 包含关键事件参数 http msdn microsoft
  • 从类 T 获取函数名 (__func__) 和指向成员函数的指针 void(T::*pmf)()

    是否可以写一些f 接受类型的模板函数T和一个指向签名成员函数的指针void T pmf 作为 模板和 或函数 参数并返回const char 指向成员函数的 func 变量 或损坏的函数名称 EDIT 我被要求解释我的用例 我正在尝试编写一
  • Javascript:函数的“无限”参数?

    在 Chrome 中 当我输入console log在下面的一项中 console log A parameter A parameter A parameter A parameter A parameter A parameter A
  • PolyML 函数和类型

    一对函数tofun int gt a gt a and fromfun a gt a gt int这样 fromfun o tofun n评估为n对于每一个n int 任何人都可以向我解释这实际上要求什么 我正在寻找更多对此的解释 而不是实
  • 调用函数时切换“控制转移绕过初始化:”

    当我尝试构建以下开关时 出现 控制转移绕过初始化 错误 switch retrycancel case 4 The user pressed RETRY Enumerate all visible windows and store han
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m

随机推荐

  • 【计算机网络】INADDR_ANY释义

    INADDR ANY是一个常量 它指代的是一个特殊的IP地址 即0 0 0 0 在网络编程中 当一个进程需要绑定一个网络端口时 可以使用INADDR ANY来指定该端口可以接受来自任何IP地址的连接请求 具体来说 当一个进程需要监听某个网络
  • vue导出el-table中的所选项

    问题描述 最近在公司项目中需要使用导出el table中所选中的项 之前没有接触过此方面的内容 所以感觉无从下手 搜索资料后发现了解决方案 现将解决方案记录下来 方便下次使用 实现效果 解决方案 1 安装插件 npm install fil
  • DirectX9例程:绘制简单立方体

    总结至红龙书提供的立方体绘制例程代码及重要函数 d3dUtility h ifndef d3dUtilityH define d3dUtilityH include
  • ISP是什么?我们常用的ISP

    ISP全称为Internet Service Provider 即互联网服务提供商 是一种向用户提供互联网接入服务的公司或组织 它们提供的服务包括互联网接入 域名注册 网站托管等等 ISP的应用场景非常广泛 几乎所有的互联网用户都需要通过I
  • 《算法零基础100讲》 变量交换算法

    题目1 题目链接 int swapNumbers int numbers int numbersSize int returnSize numbers 0 numbers 0 numbers 1 numbers 1 numbers 0 nu
  • (已解决)pytorch错误:RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED (安装cuda)

    RuntimeError cuDNN error CUDNN STATUS EXECUTION FAILED 原因 pytorch与cuda版本不对 也有可能是内存空间不足 可以更改虚拟空间大小 先卸载了pytorch conda unin
  • Ant Design Pro使用操作说明--(1) 搭建项目

    Antdpro Umi Dva 创建项目 之前的umi dva antd那套博客蛮多人看并且有互动 一套详细的全新升级antdpro管理系统的搭建和使用希望可以帮助到各位 这次会细分 尽量帮助你们快速解决遇到的问题 一 Ant Design
  • JS/JQ实现字符串加密成 HEX(十六进制) 字符串

    应用场景 1 数据传输 在网络通信或数据存储中 将字符串转换为十六进制格式可以确保数据的可靠传输和存储 十六进制字符串只包含数字和字母 而不涉及控制字符或其他特殊字符 因此避免了特殊字符在传输过程中引起的问题 2 数据校验 十六进制字符串可
  • (ESP32学习7)双核使用队列进行任务间通信

    这里是调用双核的方法哈 和我们单核使用的方法不兼容 因为有一些函数是不一样的 不通用 但是下一篇博文我会更一篇单核使用队列进行任务间通讯的问题 队列是什么 队列是可以从一个任务向其他任务以并发安全的方式发送消息的机制 也就是说他的目标是实现
  • C语言各变量类型占字节数

    C语言变量所占字节数整理 变量的基本类型包括 字符型 整型 长整型 浮点型 每个变量在每个编译器所占的字节数不同 the C Programming language 是这样说的 Each compiler is free to choos
  • c++11新特性实战:智能指针

    c 11添加了新的智能指针 unique ptr shared ptr和weak ptr 同时也将auto ptr置为废弃 deprecated 但是在实际的使用过程中 很多人都会有这样的问题 不知道三种智能指针的具体使用场景 无脑只使用s
  • 【kali换源后报错:The repository ‘http://old.kali.org/kali moto InRelease‘ is not signed.的解决办法】

    问题描述 添加旧源 vim etc apt sources list 末行追加 deb http old kali org kali moto main non free contrib 更新源 apt get update 报错 Err
  • python,Pycharm导入自定义包

    1 Pycharm中如何让导入的自定义包生效 第一步 File gt Settsing gt Build Executions Deployment gt Console gt Python Console gt 勾选 add source
  • Android——使用Spinner实现下拉列表

    1 执行步骤 1 确定数据源 添加一个下拉列表项的list 2 定义适配器 添加数据源 为下拉列表定义一个数组适配器ArrayAdapter 3 为适配器设置下拉时的菜单样式 adapter setDropDownViewResource
  • 【Python项目】简易的密码本

    import json 名称文件 名称 json 账号文件 账号 json 密码文件 密码 json 名称 账号 密码 序列号 0 更新数据 with open 账号文件 as f 账号 json load f with open 名称文件
  • js代替eval的办法

    在滚滚的boring写代码的潮流中 eval 方法逐渐被淘汰 那我们可以用什么方法代替它呢 binggo 以下方法使用效果超出你的想象 function evalPro str var Fn Function return new Fn r
  • layui框架学习(5:面板)

    Layui中的菜单样式与面板结合比较紧密 在学习菜单之前 先熟悉Layui的面板样式 Layui的面板主要作为容器使用 其样式主要分为常规面板 卡片面板 折叠面板 含手风琴效果 Layui官网示例中还介绍了面板嵌套 本文后续一一介绍并验证
  • 图像描述算法排位赛:SceneXplain与MiniGPT-4谁将夺得桂冠?

    如果你对 AI 前沿感兴趣 本场 图像描述算法排位赛 绝对是你不能错过的 在这场较量中 SceneXplain 和 MiniGPT 4 将会比试 谁将摘得这场比赛的桂冠 直接上手体验 scenex jina ai 背景介绍 在 一张图就是一
  • php curl集成包的安装和实用

    下载curl集成包 https github com php mod curl 放在vendor目录下 加载curl包 实例化 vendor Curl src Curl Curl php pinJ new Curl 然后按照官网demo使用
  • 图像配准的方法

    转自 http blog sina com cn s blog 4b9b714a0100d5k5 html 图像配准的方法 1 基于特征的图像配准 基于特征的图像配准首先提取图像信息的特征 然后以这些特征为模型进行配准 特征提取的结果是一含