这个例子展示了如何使用imregister
那imregtform
和imwarp.
自动对齐两个体积数据集:一个CT图像和一个T1加权MR图像收集自同一患者在不同时间。不像其他的技术,imregister
和imregtform
找不到功能或使用控制点。基于强度的注册通常非常适合医疗和遥感的图像。
在此示例中使用的3-D CT和MRI数据集由Michael Fitzpatrick博士作为...的一部分回顾性图像注册评估(RIRE)数据集。
此示例使用同一患者头部的两个3-D图像。在注册问题中,我们将一个图像视为固定图像和另一个图像是运动图像。注册的目标是将运动图像与固定图像对齐。在该示例中,固定图像是T1加权MRI图像。我们要注册的运动图像是CT图像。数据存储在回顾性图像配准评估(RIRE)项目使用的文件格式中。用multibandread
读取包含图像数据的二进制文件。使用helperReadHeaderRIRE
获取与每个图像关联的元数据的功能。您可以使用以下链接查找有关RIRE文件格式的更多信息:reire数据格式
fixedHeader = helperReadHeaderRIRE ('rijatient007mrt1.header');movingHeader = helperReadHeaderRIRE ('rijatient007ct.header');fixedVolume = multibandread (“rirePatient007MRT1.bin”那......[修正主机。,固定主机。,firdenheader.slices],......'int16 =>单',0,“bsq”那'ieee-be');mothingvolume = multibandread(“rirePatient007CT.bin”那......[movingHeader。行,movingHeader。列,movingHeader。片),......'int16 =>单',0,“bsq”那'ieee-be');
这helperVolumeRegistration
函数是帮助判断三维配准结果质量的辅助函数。您可以交互地旋转视图,两个轴将保持同步。
helperVolumeRegistration (fixedVolume movingVolume);
你也可以使用imshowpair
从固定和移动的体量中观察单个平面,获得体量整体对齐的感觉。在重叠图像中imshowpair
,灰色区域对应于具有相似性的区域,而洋红色和绿色区域则显示一个图像比另一个图像更亮的地方。用imshowpair
观察图像体沿轴向切片通过每个体的中心的配准错误。
centerFixed =大小(fixedVolume) / 2;centerMoving =大小(movingVolume) / 2;图imshowpair (movingVolume (:,:, centerMoving (3)), fixedVolume (:,:, centerFixed (3)));标题('未注册的轴向切片')
这imregconfig
函数使它很容易选择正确的优化器和度量配置使用imregister
。这两个图像来自两个不同的模态,MRI和CT,因此“多模式”选项是合适的。
(优化器,度量)= imregconfig (“多通道”);
使用的算法imregister
当指定输入图像的分辨率和/或位置的空间参考信息时,将更快地收敛到更好的结果。在这种情况下,CT和MRI数据集的分辨率在图像元数据中定义。使用此元数据进行构造imref3d
空间引用我们将通过作为注册的输入参数传递的对象。
Rfixed = imref3d(大小(fixedVolume) fixedHeader.PixelSize (2), fixedHeader.PixelSize (1) fixedHeader.SliceThickness);Rmoving = imref3d(大小(movingVolume) movingHeader.PixelSize (2), movingHeader.PixelSize (1) movingHeader.SliceThickness);
空间引用对象的属性定义相关的图像卷在世界坐标系中的位置以及每个维度中的像素范围是多少。RMoving的Xworldlimits属性定义了X维度中的移动量的位置。PIXELEXTENTINWORLD属性在X维度(沿列)中的世界单位中定义每个像素的大小。移动量在世界X坐标系中从0.3269延伸到334.97,每个像素的程度为0.6536mm。单位以毫米为,因为用于构造空间引用的标题信息以毫米为单位。ImageExtentInworldx属性在世界单位中的运动图像卷的世界单位中确定了全部范围。
Rmoving。XWorldLimits
ans =1×20.3268 334.9674
Rmoving。PixelExtentInWorldX
ANS = 0.6536.
Rmoving。ImageExtentInWorldX
ans = 334.6406
两个体量之间的错位包括平移、缩放和旋转。使用相似度变换来注册图像。
首先使用imregister
获得可以直接查看和观察的注册输出图像体,以访问注册结果的质量。
为优化程序的itallRadius属性指定非默认设置,以在注册结果中实现更好的收敛。
优化器。InitialRadius = 0.004;moveregisteredvolume = imregister(movingVolume,Rmoving, fixedVolume,Rfixed,“刚性”优化器,指标);
用imshowpair
再次再次重复检查通过注册卷的中心的轴向切片的对准,以获得注册成功的感觉。
图imshowpair (movingRegisteredVolume (:,:, centerFixed (3)), fixedVolume (:,:, centerFixed (3)));标题(“登记体积的轴向切片”)
从上面的轴向切片来看,注册似乎是成功的。用helperVolumeRegistration
再次查看已注册的卷,继续判断注册是否成功。
helperVolumeRegistration (fixedVolume movingRegisteredVolume);
这imregtform
当您对使用的几何变换估计感兴趣时,可以使用功能imregister
以形成注册的输出图像。imregtform
使用与相同的算法imregister
并接受相同的输入参数imregister
。自从目视检查所得体积imregister
表示注册成功,您可以致电imregtform
使用相同的输入参数来获取与此注册结果相关的几何变换。
Geomtform = Imregtform(移动volume,rmoving,fixedvolume,Rfixed,“刚性”,优化器,指标)
geomtform = affine3d与属性:T: [4x4双]维度:3
imregtform的结果是一个几何变换对象。这个对象包含一个属性T,它定义了3-D仿射变换矩阵。
geomtform.t.
ans =4×40.9704 -0.0143 -0.2410 0 0.0228 0.9992 0.0324 0 0.2404 -0.0369 0.9700 0 -15.8648 -17.5692 29.1830 1.0000
几何变换的transformPointsForward方法可以用来确定一个点[u,v,w]在移动图像映射作为配准的结果。因为空间参考输入被指定到imregtform,几何变换将世界坐标系中的点从移动映射到固定。下面使用transformPointsForward方法来确定移动图像中心在世界坐标系中的变换位置。
centerXWorld =意味着(Rmoving.XWorldLimits);centerYWorld =意味着(Rmoving.YWorldLimits);centerZWorld =意味着(Rmoving.ZWorldLimits);[xWorld, yWorld zWorld] = transformPointsForward (geomtform、centerXWorld centerYWorld, centerZWorld);
您可以使用RFIXED的WorldToSubscript方法来确定与移动卷的中心对齐的固定卷的元素。
[r,c,p] = worldtosubscript(rfixed,xworld,yworld,zworld)
r = 116.
c = 132
P = 13.
这imwarp.
函数可以用于应用几何变换估计从imregtform到3-D体积。'OutputView' Name/Value被用来定义一个空间引用参数,它决定了输出重采样图像的世界限制和分辨率。你可以产生相同的结果imregister
通过使用与固定图像相关联的空间参考对象。这创造了一个输出量,其中世界限制和分辨率的固定和移动图像是相同的。一旦两个体积的世界限制和分辨率相同,每个移动和固定体积的样本之间就有像素对像素的对应。
movingRegisteredVolume = imwarp (movingVolume Rmoving geomtform,“双三次的”那“OutputView”, Rfixed);
再次使用IMShowpair通过所产生的注册量的中心查看轴向切片imwarp.
。
图imshowpair (movingRegisteredVolume (:,:, centerFixed (3)), fixedVolume (:,:, centerFixed (3)));标题(“登记体积的轴向切片”)