API :
- sitk.Resample
- sitk.Euler2DTransform (sitk.Euler3DTransform)
Resampling 顾名思义,对一幅图像进行重采样操作。而图像本身就是对原始连续信号的采样。
一搬来说使用 SimpleITK重采样包含以下四个部分:
- 我们需要重新采样的图像image,在坐标系 m m m下。???why?
- 重采样网格(Resampling grid )—— 相应的坐标系 f f f下的网格点,将映射到坐标系 m m m下。 f f f —> m m m
- 变换 T f m T_f^{m} Tfm -> f f f坐标系下的点到 m m m的映射变换, m p = T f m ( f p ) ^mp = T_f^m(^fp) mp=Tfm(fp)。
- 插值方法的选择
⚠️:第三点的变换?? T f m T_f^m Tfm??
SimpleITK提供了很多的插值方法,最常用的是两种:
- sitkLinear
- sitkNearestNeighbor
前者用于大多数插值任务,是精度和计算效率之间的折衷。
后一种方法是对mask进行插值,这是唯一一种不会在结果中引入新的label的插值方法。
我们在Resample图像的时,同时要Resample它们的mask,而mask是单一的值标志像素的类别,如果使用sitkLinear会引入新的值,此时必须使用sitkNearestNeighbor。
logo = sitk.ReadImage(fdata('SimpleITK.jpg'))
tx = 2
ty = -6.50
theta = 0.31
euler2d = sitk.Euler2DTransform()
euler2d.SetTranslation((tx, ty))
euler2d.SetAngle(theta)
resampled_image = sitk.Resample(logo, euler2d)
plt.imshow(sitk.GetArrayFromImage(resampled_image))
plt.axis('off')
plt.show()
sitk.Euler2DTransform:一个刚性的二维变换,以弧度围绕一个固定的中心旋转并平移。
问题: T f m T_f^m Tfm 是 f f f 到 m m m的变换,但是实际的情况确实对 m m m坐标系下的图像进行了变换?逆变换?
定义重新采样网格
在上面的例子中,我们任意使用原始图像网格作为重采样网格。
??
图像是如何实现变换的。