图像配准实现(matlab篇)

本文详细介绍了一种基于Matlab的多模态或多序列MRI图像配准流程,包括图像下载、初始配准、精度提升及利用初始条件进行进一步优化等关键步骤。
部署运行你感兴趣的模型镜像

原帖:http://bbs.youkuaiyun.com/topics/390975425



研究配准进两年的时间,有幸看到一个技术文档,做了一下的总结,如有不妥之处敬请大家谅解,多提出意见

废话不多说,书归正传!
这里主要讲解的是多模态或者说是多序列MRI图像配准。采用的图片是人体膝盖图。配准暂且分为五部
Step1. 下载图片
Step2. 初始配准(粗配准)
Step3. 提高配准精度
Step4. 利用初始条件提高配准精度配准
Step5. 结果满意不满意,你说了算
下面一一详细说明以上几个步骤!
一,下载图片
        这里采用的图片是matlab子带的两张MR膝盖图,“knee1.dcm” 作为参考图像,"knee2.dcm"为浮动图像!

Plain Text code
?
1
2
fixed = dicomread('knee1.dcm');      % 读参考图像fixed
moving = dicomread('knee2.dcm'); %  读浮动图像moving


可能接下来大家关注的问题就是这两幅图像到底有什么区别,这种区别又有多大的可视化程度,下面就为推荐两个比较好用的函数用于观测两幅图像的区别。
Plain Text code
?
1
2
figure, imshowpair(moving, fixed, 'method');
title('Unregistered');


imshowpair函数就是指以成双成对的形式显示图片,其中一个重要的参数就是‘method’,他又4个选择
(1)‘falsecolor’ 字面意思理解就是伪彩色的意思了,其实就是把两幅图像的差异用色彩来表示,这个是默认的参数。
(2)‘blend’ 这是一种混合透明处理类型,技术文档的翻译是alpha blending,大家自己理解吧。
(3)‘diff’ 这是用灰度信息来表示亮度图像之间的差异,这是对应‘falsecolor’的一种方式。
(4)参数‘monotage’可以理解成‘蒙太奇’,这是一种视频剪辑的艺术手法,其实在这里我们理解成拼接的方法就可以了。
为什么在这里罗里吧嗦的说这么多的显示呢,大家知道"人靠衣装,美靠...."(就不多说了吧),总之就是一个好的视觉效果能给人以耳目一新的效果。

嗯嗯,这个就是蒙太奇的效果了,


这两个则分别是伪彩色,混合透明处理了,至于大家接受那个就要看自己的爱好了
说到了这里终于结束了这关没有意义的读图环节,请大家原谅我的无耻吧。

二,初始配准(粗配准)
初始配准就是大致的使图像对其,使其差别不要太明显,以方便下一步的精细配准环节。
函数imregconfig这在个环节可是主角,从名字上看就知道他要设置一些参数和方法了,其实他真正的作用是配置优化器和度量准则,
Plain Text code
?
1
[optmizer, metric] = imregconfig(modality);

参数modality指定fixed image, moving image之间的关系,有两种选择‘monomodal’, 'multimodal'两种,分别质量两幅图像是单一模态还是多模态,根据需要自己选择。
返回的参数optimizer是用于优化度量准则的优化算法,这里有
registration.optimizer.RegularStepGradientDescent 或者 registration.optimizer.OnePlusOneEvolutionary两种可供选择。
输出参数metric则是注明了度量两幅图片相似度的方法,提供了均方误差(registration.metric.MeanSquares)和互信息(registration.metric.MattesMutualInformation)两种供选择。
当然大家也可以根据结构扩充这两个参数。
到这里优化器和度量准别就已将做好了,是不是简单到没朋友。

要上大菜了,配准代码
Plain Text code
?
1
2
3
movingRegisteredDefault = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegisteredDefault, fixed);
title('A: Default registration');


imregister函数根据取得的optimizer,metric参数对2D,3D参考图像做变换(transform)目的是fixed,moving image对其,大家关注到有一个参数‘affine’,他是指该变化是仿射变换,同样该参数还可以选为
‘translation’ (x,y)坐标平移变换,不牵涉到旋转个尺度变换
‘rigid’ 刚性变换(平移和旋转)
‘similarity’ 改变换包括了平移,旋转和尺度变换
‘affine’ 在similarity的基础上加入了shear(图像的剪辑)

该图片就是粗配准的结果了,大家可以在右上角看到明显的不重合现象。

三,提高配准精度
粗配准的结果一般情况下达不到实际应用的要求,为此很有必要进一步提高精度,如果有对精度要求不高的朋友看到这里就可以结束了。
Plain Text code
?
1
2
disp('optimizer');
disp('metric');

这两条指令可以看到默认生成的优化器和度量函数参数,当然这里提高精度的途径就是通过修改这两个参数了!

在这里我们通过修改两个参数,观察对配准效果的改进:
(1)改变优化器的步长已达到对更加精细的变换。
Plain Text code
?
1
2
3
4
optimizer.InitialRadius = optimizer.InitialRadius/3.5;
movingRegisteredAdjustedInitialRadius = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegisteredAdjustedInitialRadius, fixed);
title('Adjusted InitialRadius');

把原步长缩小为原来的3.5倍,结果如下

貌似效果还是有点的啊,大家在看右上角的阴影好像不见了
(2)在(1)基础上改变最大迭代次数
Plain Text code
?
1
2
3
4
optimizer.MaximumIterations = 300;
movingRegisteredAdjustedInitialRadius300 = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegisteredAdjustedInitialRadius300, fixed);
title('B: Adjusted InitialRadius, MaximumIterations = 300, Adjusted InitialRadius.');

效果如下:正上的阴影好像也减小了


四,改变初始条件提高精度
这里的思想就像我们在做雕塑一样,假如我们要用石头雕一个人,首先我们可以大刀阔斧的把头部留出来,然后把脖子留的比头部更细,简单的说就是美女留出S轮廓,或者o型的(哈哈,对号入座就可以了),下一步精雕细琢的时候就会轻松很多,这里的初始条件就是先用简单的变换做出一个初始配准图像,然后以初始配准的结果作为输入做精细配准。
大致做法如下:
Plain Text code
?
1
tformSimilarity = imregtform(moving,fixed,'similarity',optimizer,metric);

用similarity的变换方式做初始配准,或者你还可以用rigid,transform的方式都可以
Plain Text code
?
1
tformSimilarity = imregtform(moving,fixed,'similarity',optimizer,metric);

在这里imregtform把变化矩阵输出;
然后用imref2d限制变换后的图像与参考图像有相同的坐标分布
Plain Text code
?
1
Rfixed = imref2d(size(fixed));


imwarp函数执行几何变换,当然依据则是tformSimilarity的变换矩阵了。
Plain Text code
?
1
2
3
movingRegisteredRigid = imwarp(moving,tformSimilarity,'OutputView',Rfixed);
figure, imshowpair(movingRegisteredRigid, fixed);
title('C: Registration based on similarity transformation model.');

得到的tformsimilarity.T就是传说中的变换矩阵了
tformSimilarity.T=    1.0331   -0.1110         0
                                    0.1110    1.0331         0
                                   -51.1491    6.9891    1.0000
下面就是精配准的部分了:
Plain Text code
?
1
2
3
4
movingRegisteredAffineWithIC = imregister(moving,fixed,'affine',optimizer,metric,...
    'InitialTransformation',tformSimilarity);
figure, imshowpair(movingRegisteredAffineWithIC,fixed);
title('D: Registration from affine model based on similarity initial condition.');

初始配准结果:
进一步精细配准:

五,到这里就是你说了算了Deciding When Enough is Enough
Plain Text code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
figure
imshowpair(movingRegisteredDefault, fixed)
title('A - Default settings.');
 
figure
imshowpair(movingRegisteredAdjustedInitialRadius, fixed)
title('B - Adjusted InitialRadius, 100 Iterations.');
 
figure
imshowpair(movingRegisteredAdjustedInitialRadius300, fixed)
title('C - Adjusted InitialRadius, 300 Iterations.');
 
figure
imshowpair(movingRegisteredAffineWithIC, fixed)
title('D - Registration from affine model based on similarity initial condition.');

您可能感兴趣的与本文相关的镜像

Qwen3-VL-8B

Qwen3-VL-8B

图文对话
Qwen3-VL

Qwen3-VL是迄今为止 Qwen 系列中最强大的视觉-语言模型,这一代在各个方面都进行了全面升级:更优秀的文本理解和生成、更深入的视觉感知和推理、扩展的上下文长度、增强的空间和视频动态理解能力,以及更强的代理交互能力

### 图像的流程和实现步骤 图像是一种用于将两幅或多幅图像对齐的技术,在计算机视觉领域有着广泛的应用。以下是图像的一般流程和具体实现步骤: #### 1. 数据预处理 在进行图像时,通常需要先对输入数据进行一些基本的预处理操作。这一步骤可能包括但不限于灰度化、去噪以及尺寸调整等。通过这些操作可以减少不必要的干扰因素并提高后续计算效率[^1]。 #### 2. 特征检测与描述符生成 为了找到源图(参考图像)与目标图之间的对应关系,需提取两者共同拥有的显著特征点。常用的方法有SIFT(Scale-Invariant Feature Transform)[^2], SURF (Speeded-Up Robust Features), ORB(Oriented FAST and Rotated BRIEF)等算法来完成这一任务。每种方法都会为每个关键点创建一个独特的描述向量以便于比较相似程度。 ```python import cv2 # 加载图片 img1 = cv2.imread('reference_image.jpg', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('target_image.jpg', cv2.IMREAD_GRAYSCALE) # 初始化 SIFT 检测器 sift = cv2.SIFT_create() # 寻找关键点和描述子 kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) ``` #### 3. 特征匹 利用之前生成的关键点描述符来进行最近邻搜索从而得到初步匹结果。FLANN( Fast Library for Approximate Nearest Neighbors ) 是一种快速近似最近邻居查找库,常被用来加速大规模数据库中的查询过程。 ```python # 创建 FLANN 匹对象 flann_index_kdtree = 0 index_params = dict(algorithm=flann_index_kdtree, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1,des2,k=2) ``` #### 4. 剔除错误匹 由于实际场景复杂多样,单纯依靠距离阈值筛选出来的匹很可能存在大量误报情况因此还需要进一步过滤掉那些不符合条件的结果比如采用 Lowe's ratio test 方法去除不合理的候选者只保留最佳选项作为最终输出。 ```python good_matches = [] for m,n in matches: if m.distance < 0.7*n.distance: good_matches.append(m) ``` #### 5. 计算变换模型参数 基于成功匹后的坐标位置信息估计出能够使一幅图像变形到另一幅上的仿射或者透视投影矩阵形式即HomoMatrix。OpenCV 提供了 findHomography 函数可以直接求解该问题。 ```python src_pts = np.float32([ kp1[m.queryIdx].pt for m in good_matches ]).reshape(-1,1,2) dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good_matches ]).reshape(-1,1,2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0) ``` #### 6. 应用变换 最后把估算好的转换函数作用回原始待校正画面上即可获得已注册版本的新影像资料。 ```python h,w = img1.shape pts = np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2) dst = cv2.perspectiveTransform(pts,M) registered_img = cv2.warpPerspective(img1, M, (w,h)) cv2.imwrite('registered_image.png', registered_img) ``` 以上便是整个图像过程中涉及的主要环节概述及其Python代码片段展示[^2].
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值