医学图像处理 ——图像平移补充


上一期:医学图像处理 ——图像配准

今天我们针对之前几何变换中的平移部分做一些细节编程的补充。解决一下有的同学在编程中遇到的一些问题。

按照我们24期所讲的使用affine2d和imwarp函数就可以配合仿射矩阵做出各种几何变换。一般的编写流程如下:

1. 导入图片。

2. 写出仿射矩阵T。

3. 调用affine2d对T进行处理。

4. 调用imwarp函数结合affine2d产生的结果对f进行处理。

5. 显示图像。

这样的流程对于图像的旋转、伸缩是没有问题的。但在图像的平移里面就有很大的问题了。看下面一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
I=imread('cameraman.tif');

T = [1 0 0; 0 1 0; 15 15 1];

tform = affine2d(T);

g = imwarp(I, tform);

figure

subplot(1,2,1),imshow(I)

title('原图像')

subplot(1,2,2),imshow(g)

title('平移变换');

看起来毫无破绽,但结果如下。

图像并没有产生平移的效果。这就很奇怪了。

大家可以想想所谓的平移一般是怎么理解的?我们一般会先取定某个参照物下,在这个参照物与周围的环境形成的坐标空间里可以说某物体在某段时间内像某个方向平移了多少。所以这里也是一样,在没有确定的坐标系下,就算做了仿射变换也观察不到平移现象。

因此为了解决此问题我们就可以将其放在世界坐标系下观察。具体的编码中就是在调用imwrap时加入世界坐标系。具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
I=imread('cameraman.tif');

T = [1 0 0; 0 1 0; 80 80 1];

tform = affine2d(T);

cb_translated_ref =imref2d(size(f));

[cb_translated,cb_translated_ref] = imwarp(I,tform,'OutputView',cb_translated_ref);

figure

subplot(1,2,1),imshow(I)

title('原图像')

subplot(1,2,2),imshow(cb_translated,cb_translated_ref)

title('平移变换');

这样有了坐标系后,对于平移现象就很直观了。

更多干货请关注公众微信号:医电小白的进阶之路