DICOM图像坐标系和病人坐标系的相互转换

本代码是https://nipy.org/nibabel/dicom/dicom_orientation.html#dicom-slice-affine的实现,关于两个坐标系的描述,可参考:https://www.cnblogs.com/zhhfan/p/9936945.html

需求:在Mimics中对3D图像中的关键点进行了标注,保存了关键点的坐标,该坐标属于病人坐标系,在做关键点检测时,需要把病人坐标系中的点坐标映射到图像坐标系。

代码如下:

import os
import numpy as np
import pydicom
import pylab

def get_affine_matrix(dicom_dir):
    '''
    Calculate the affine matrix which maps the voxel from the DICOM voxel space (column, row, depth) to patient
    coordinate system (x, y, z)
    reference: https://nipy.org/nibabel/dicom/dicom_orientation.html#dicom-slice-affine
    written by Shumao Pang, pangshumao@126.com
    :param dicom_dir: a dicom series dir
    :return: a numpy array with shape of (4, 4)
    '''
    dicom_file_list = os.listdir(dicom_dir)
    slice_num = len(dicom_file_list)
    dicom_list = [0] * slice_num
    for dicom_file in dicom_file_list:
        ds = pydicom.read_file(os.path.join(dicom_dir, dicom_file))
        instance_number = ds.InstanceNumber
        dicom_list[instance_number - 1] = ds
    pixel_spacing = dicom_list[0].PixelSpacing
    image_orientation_patient = dicom_list[0].ImageOrientationPatient
    orientation_matrix = np.reshape(image_orientation_patient, [3, 2], order='F')
    orientation_matrix = orientation_matrix[:, ::-1]

    first_image_position_patient = np.array(dicom_list[0].ImagePositionPatient)
    last_image_position_patient = np.array(dicom_list[-1].ImagePositionPatient)
    k = (last_image_position_patient - first_image_position_patient) / (slice_num - 1)

    affine_matrix = np.zeros((4, 4), dtype=np.float32)
    affine_matrix[:3, 0] = orientation_matrix[:, 0] * pixel_spacing[0]
    affine_matrix[:3, 1] = orientation_matrix[:, 1] * pixel_spacing[1]
    affine_matrix[:3, 2] = k
    affine_matrix[:3, 3] = first_image_position_patient
    affine_matrix[3, 3] = 1.0
    return affine_matrix

if __name__ == '__main__':
    data_dir = '/data/dicom_case1'
    affine_matrix = get_affine_matrix(data_dir)
    inv_affine_matrix = np.linalg.inv(affine_matrix)

    print('affine matrix:\n', affine_matrix)
    print('inv affine matrix:\n', inv_affine_matrix)

    image_coord = np.array([0, 0, 0]) # (row, column, depth)
    input = np.ones(4, dtype=np.float32)
    input[:3] = image_coord
    # map the image coord to patient coord
    patient_coord = np.matmul(affine_matrix, input)
    print('image coord:\n', image_coord)
    print('patient coord:\n', patient_coord)

    # map the patient coord to image coord
    inv_image_coord = np.matmul(inv_affine_matrix, patient_coord).astype(int)[:3] # (row, column, depth)
    print('inv image coord:\n', inv_image_coord)


 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值