1.添加DCM信息
DICOM图像的元数据包含了多个字段,用于描述和标识图像的相关信息。以下是一些常见的规则和建议,用于设置DICOM图像的患者PID、Accession Number和Study UID:
-
患者PID(患者编号):
- 患者PID是一个唯一的标识符,用于识别患者。
- 建议使用符合机构或标准的命名规则来设置患者PID。
- 通常是一个字符串,可以包含字母、数字和特殊字符。
-
Accession Number(检查登记号):
- Accession Number用于标识DICOM图像的具体检查或过程。
- 它是一个独特的标识符,用于区分不同的检查记录。
- 可以是数字、字母或数字与字母的组合。
- 按照机构的规定,可以遵循特定的命名约定。
-
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)