python基于影像Dicom标签,计算患者年龄

13 篇文章 0 订阅

本文由Markdown语法编辑器编辑完成。

1. 需求背景

产品要进行体系认证,而体系中对影像过滤进行了一些限制。其中一条规则是,需要筛选出所有影像中年龄大于等于16岁的影像。
要注意,这里的年龄,是患者在当时拍摄影像时的年龄,而不是患者当前的年龄。
在dicom标签中,有一个标签是表明患者拍摄时的年龄的,(0x0010, 0x1010) PatientAge.
但是由于这个标签不是一类标签,不一定存在。因此,可以根据另外两个标签,来计算出患者当时拍摄时的年龄。这两个标签是:(0x0008, 0x0020) StudyDate, (0x0010, 0x0030) PatientBirthDate. 然后根据这两个标签,计算出年份的差异,也就知道了患者当时拍摄时的年龄。

明确了以上的方案,就可以写代码来实现了。

2. 需求实现

def check_age_restriction():
	patient_age_str = get_tag_values(ds, (0x0010, 0x1010), None)
          if patient_age_str:
              if patient_age_str.__contains__('D') or \
                      patient_age_str.__contains__('W') or \
                      patient_age_str.__contains__('M') or \
                      (patient_age_str.__contains__('Y') and
                       int(patient_age_str.split('Y')[0]) < 16):
                  return False
              return True
          patient_birthdate_str = get_tag_values(ds, (0x0010, 0x0030), None)
          study_date = get_tag_values(ds, (0x0008, 0x0020), None)
          series_date = get_tag_values(ds, (0x0008, 0x0021), None)
          acquisition_date = get_tag_values(ds, (0x0008, 0x0022), None)
          content_date = get_tag_values(ds, (0x0008, 0x0023), None)
          if not patient_birthdate_str:
              return True
          else:
              patient_birthdate = \
                  datetime.strptime(patient_birthdate_str, '%Y%m%d').date()
              actual_study_date = datetime.strptime(
                  study_date or series_date or acquisition_date or
                  content_date, '%Y%m%d').date()
              patient_age = cal_age_by_study_and_birth_date(
                  actual_study_date, patient_birthdate)
              if patient_age < DR_CE_AGE_LOWER_LIMIT:
                  return False
              return True

def get_tag_values(ds, tag, default=None):
    """
    获取dataset
    :param ds: Dataset 待获取对象dataset
    :param tag: tuple tag十六进制数
    :param default: object 缺省返回
    :return: object
    """
    if tag[0] == 0x0002:
        val = ds.file_meta.get(tag)
    else:
        val = ds.get(tag, default=default)
    if hasattr(val, 'value'):
        val = val.value
    return normalize_tag(val)


def normalize_tag(tag):
    """
    把tag的值转化为python的内置类型
    :param tag: Tag
    :return: object
    """
    type_map = [
        ('DSfloat', float),
        ('DSdecimal', float),
        ('IS', int),
        ('MultiString', lambda x: [normalize_tag(i) for i in x]),
        ('MultiValue', lambda x: [normalize_tag(i) for i in x]),
        ('PersonName3', str),
        ('PersonNameBase', str),
        ('PersonName', str),
        ('PersonNameUnicode', unicode),
    ]
    cls_name = tag.__class__.__name__
    val = dict(type_map).get(cls_name, lambda _: _)(tag)
    return val


def cal_age_by_study_and_birth_date(study_date, birth_date):
    if not study_date:
        raise Exception("StudyDate, SeriesDate, AcquisitionDate and "
                        "ContentDate do not exist!")
    if isinstance(study_date, date) and isinstance(birth_date, date):
        return study_date.year - birth_date.year - \
               ((study_date.month, study_date.day) <
                (birth_date.month, birth_date.day))
    raise Exception("StudyDate or BirthDate is not date type.")

以下是相应的测试case:
case1:

case2:

参考链接:

未完待续…

### 回答1: 可以使用 python 库 pydicom 来处理 DICOM 影像。下面是一个简单的示例代码,用于读取并显示 DICOM 影像: ```python import pydicom from pydicom.data import get_testdata_files # 使用 pydicom 提供的测试数据 filename = get_testdata_files("CT_small.dcm")[0] # 读取 DICOM 文件 ds = pydicom.dcmread(filename) # 显示影像数据 print(ds.pixel_array) ``` 上面的代码读取了一个 DICOM 文件,并使用 `ds.pixel_array` 属性打印出影像数据。您可以使用其他库(如 matplotlib 或 OpenCV)来显示影像。 还有很多其他的DICOM处理库可供使用,如: - SimpleITK - Python-DICOM - Dicom-Numpy - Dicom-Tools 请根据项目需求来选择最合适的库。 ### 回答2: DICOM是医学数字成像和传输的标准,用于存储、传输和处理医学影像数据Python是一种强大的编程语言,可以用于DICOM处理。 首先,我们需要安装PythonDICOM库,可以使用命令pip install pydicom在终端或命令行中进行安装。 接下来,我们可以使用pydicom库的功能来读取、处理和保存DICOM影像。在代码中,我们可以使用函数pydicom.dcmread()来读取DICOM文件。例如,我们可以使用以下代码读取一个DICOM文件: import pydicom dicom_file = pydicom.dcmread('example.dcm') 读取DICOM文件后,我们可以使用属性和方法来获取影像的元数据和图像数据。例如,我们可以使用以下代码获取图像的宽度、高度和像素数: width = dicom_file.Rows height = dicom_file.Columns pixels = dicom_file.pixel_array 同时,我们可以使用其他函数和方法来进行DICOM影像的处理和操作。例如,我们可以使用函数pydicom.pixel_data_handlers.util.apply_voi_lut()来应用窗宽窗位来调整影像的对比度和亮度。 最后,我们可以使用pydicom库的函数pydicom.dcmwrite()来保存处理后的DICOM影像。例如,我们可以使用以下代码保存处理后的影像dicom_file.SaveAs('processed.dcm') 总结来说,使用Python的pydicom库可以方便地进行DICOM影像的读取、处理和保存。我们可以利用pydicom库的功能来读取DICOM文件、获取元数据和图像数据、进行影像处理和操作,并保存处理后的DICOM影像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inter_peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值