是在图像进行空间变换后做的插值
cp是cupy库,跟numpy的功能基本一样,indx,indy,indz是图像的x,y,z轴的坐标索引,mat是空间变换矩阵。为了迭代更快做了函数部分并行化处理
def rot_tran_3inter(img, indx, indy, indz, mat):
# 旋转变换是沿着z,x,y方向进行的,先旋转再平移
rows, cols, slic = img.shape
dstimg = img.copy()
# 双线性插值
fnx = mat[0, 0] * indx + mat[0, 1] * indy + mat[0, 2] * indz + mat[0, 3]
fny = mat[1, 0] * indx + mat[1, 1] * indy + mat[1, 2] * indz + mat[1, 3]
fnz = mat[2, 0] * indx + mat[2, 1] * indy + mat[2, 2] * indz + mat[2, 3]
dx=fnx-cp.floor(fnx)
dy=fny-cp.floor(fny)
dz=fnz-cp.floor(fnz)
fx1 = cp.clip((cp.floor(fnx)).astype(cp.int),0,rows - 2)
fy1 = cp.clip((cp.floor(fny)).astype(cp.int),0,cols - 2)
fz1 = cp.clip((cp.floor(fnz)).astype(cp.int),0,slic - 2)
fx2=fx1+1
fy2=fy1+1
fz2=fz1+1
#先在z1层进行二维双线性插值
z1=(img[fx1,fy1,fz1]*(1-dx)+img[fx2,fy1,fz1]*dx)*(1-dy)\
+(img[fx1,fy2,fz1]*(1-dx)+img[fx2,fy2,fz1]*dx)*dy
#z2层次进行二维双线性插值
z2=(img[fx1,fy1,fz2]*(1-dx)+img[fx2,fy1,fz2]*dx)*(1-dy)\
+(img[fx1,fy2,fz2]*(1-dx)+img[fx2,fy2,fz2]*dx)*dy
dstimg[indx, indy, indz]=z1*(1-dz)+z2*dz
return dstimg