DCM文件的相关操作

1.添加DCM信息

        DICOM图像的元数据包含了多个字段,用于描述和标识图像的相关信息。以下是一些常见的规则和建议,用于设置DICOM图像的患者PID、Accession Number和Study UID:

  1. 患者PID(患者编号):

    • 患者PID是一个唯一的标识符,用于识别患者。
    • 建议使用符合机构或标准的命名规则来设置患者PID。
    • 通常是一个字符串,可以包含字母、数字和特殊字符。
  2. Accession Number(检查登记号):

    • Accession Number用于标识DICOM图像的具体检查或过程。
    • 它是一个独特的标识符,用于区分不同的检查记录。
    • 可以是数字、字母或数字与字母的组合。
    • 按照机构的规定,可以遵循特定的命名约定。
  3. Study UID(检查唯一编号):

    • Study UID是用于唯一标识DICOM图像检查的标识符。
    • 它是一个全局唯一的ID,用于将图像与特定的检查或研究关联起来。
    • Study UID通常是一个长字符串,遵循唯一标识符的生成算法,如UUID(通用唯一标识符)。
    • 可以使用专门的工具或库来生成唯一的Study UID。

在设置这些元数据字段时,需要注意以下事项:

  • 确保为每个DICOM图像设置唯一的患者PID、Accession Number和Study UID,以避免重复或冲突。
  • 遵循机构的命名约定或标准,以保持一致性和易于识别。
  • 在添加或修改元数据之前,确保已正确读取DICOM图像并检查其当前的元数据值。
  • 使用适当的DICOM库和工具来读取、修改和保存DICOM图像的元数据,如pydicom库。

请注意,DICOM标准涵盖了大量的元数据字段和规范,上述规则仅针对特定的字段进行说明。根据实际需求和使用场景,可能还需要考虑其他DICOM元数据字段的设置和处理

2.具体处理代码

import os
import random
import string
import pydicom


def generate_random_string(length):
    """生成随机字符串"""
    letters = string.ascii_letters + string.digits
    return ''.join(random.choice(letters) for _ in range(length))


def add_metadata(directory, change_dcm_path):
    # 遍历指定目录下的所有DICOM文件
    for filename in os.listdir(directory):
        if filename.endswith(".dcm"):
            file_path = os.path.join(directory, filename)

            try:
                # 读取DICOM文件
                ds = pydicom.dcmread(file_path)

                # 生成随机的患者PID
                patient_id = f"P{random.randint(10000, 99999)}"
                ds.PatientID = patient_id

                # 生成随机的Accession Number
                accession_number = f"A{random.randint(100000, 999999)}"
                ds.AccessionNumber = accession_number

                # 生成随机的Study UID
                study_uid = pydicom.uid.generate_uid()
                ds.StudyInstanceUID = study_uid
                print(ds.PatientID, ds.AccessionNumber, ds.StudyInstanceUID)

                # 保存修改后的DICOM文件
                ds.save_as(change_dcm_path + filename)
            except Exception as e:
                print(f"处理文件 '{filename}' 时出现异常: {e}")


if __name__ == "__main__":
    # 指定包含DICOM文件的目录
    directory = "./images_revise"
    # 修改后的DICOM文件的目录
    change_dcm_path = './change_dcm/'
    # 指定文件夹路径列表
    folder_paths = [directory, change_dcm_path]
    for folder_path in folder_paths:
        if folder_path == directory:
            # 检查文件夹是否存在
            if not os.path.exists(folder_path):
                print(f"directory文件夹路径输入有误,请检查路径")
                break
        else:
            try:
                # 创建文件夹
                os.makedirs(folder_path)
                print(f"文件夹 '{folder_path}' 已创建")
            except Exception as e:
                print(f"创建文件夹 '{folder_path}' 失败: {e}")

    add_metadata(directory, change_dcm_path)





3. 筛选重复的DCM

import os
import pydicom

def compare_dcm_images(directory):
    image_data = {}  # 用于存储图像数据和文件名的字典

    # 遍历指定目录下的所有DICOM文件
    for filename in os.listdir(directory):
        if filename.endswith(".dcm"):
            file_path = os.path.join(directory, filename)

            try:
                # 读取DICOM文件
                ds = pydicom.dcmread(file_path)

                # 获取像素数据的哈希值
                hash_value = hash(ds.pixel_array.tobytes())

                # 检查哈希值是否已存在
                if hash_value in image_data:
                    print("重复的图像数据:", filename)
                    print("重复的图像数据:", image_data[hash_value])
                    print("*"*30)
                else:
                    image_data[hash_value] = filename
            except Exception as e:
                print(f"处理文件 '{filename}' 时出现异常: {e}")


if __name__ == "__main__":
    directory = "images_revise"  # 指定包含DICOM文件的目录
    compare_dcm_images(directory)

你可能感兴趣的:(数据处理,医学扫盲,机器学习,深度学习,人工智能)