对医学图像中dcm文件进行处理

处理医学图像中的dcm/DICOM文件

  • 查看DICOM图像
  • 查看该dcm文件是否为单张多帧
  • 单张单帧的dcm文件转为png图像
  • 将文件夹中多个单张单帧的dcm转为png图像
  • 单张多帧的dcm转为png图像
  • 将文件夹中多个单张多帧的dcm转为png图像

查看DICOM图像

import pydicom
import matplotlib.pyplot as plt

dicom_file_path = 'DICOM_anon/i0000,0000b.dcm'  # 替换为DICOM文件的实际路径

# 读取DICOM文件
dicom_data = pydicom.dcmread(dicom_file_path)

# 打印DICOM元数据
print("DICOM Metadata:")
print(dicom_data)

# 获取像素数据
pixel_data = dicom_data.pixel_array

# 显示DICOM图像
plt.imshow(pixel_data, cmap=plt.cm.gray)
plt.axis('off')
plt.title('DICOM Image')
plt.show()

查看该dcm文件是否为单张多帧

import pydicom

dicom_file_path = 'do_dcm/1-1.dcm'  # 替换为DICOM文件的实际路径

# 读取DICOM文件
dicom_data = pydicom.dcmread(dicom_file_path)

# 检查NumberOfFrames标签是否存在
if 'NumberOfFrames' in dicom_data:
    num_frames = dicom_data.NumberOfFrames
    print(f"This DICOM file contains {num_frames} frames.")
else:
    print("This DICOM file is not a multi-frame image.")

单张单帧的dcm文件转为png图像

import look_dcm
import numpy as np
from PIL import Image

dicom_file_path = 'DICOM_anon/i0000,0000b.dcm'  # 替换为DICOM文件的实际路径

# 读取DICOM文件
dicom_data = pydicom.dcmread(dicom_file_path)

# 获取像素数据
pixel_data = dicom_data.pixel_array

# 将像素值范围归一化到0-255之间
pixel_data_normalized = ((pixel_data - np.min(pixel_data)) / (np.max(pixel_data) - np.min(pixel_data))) * 255
pixel_data_normalized = pixel_data_normalized.astype(np.uint8)

# 创建PIL图像对象
png_image = Image.fromarray(pixel_data_normalized, mode='L')

# 保存为PNG文件
output_png_path = '/root/autodl-tmp/datasets/CHAOS/CT/1/DICOM1.png'  # 替换为输出PNG文件的路径
png_image.save(output_png_path)

将文件夹中多个单张单帧的dcm转为png图像

import os
import look_dcm
import numpy as np
from PIL import Image
import pydicom

input_folder = '19/DICOM_anon'  # 替换为包含DICOM文件的文件夹路径
output_folder = '19/19DICOM_PNG/'  # 替换为输出PNG文件的文件夹路径
os.makedirs(output_folder, exist_ok=True)

# 遍历输入文件夹中的每个 .dcm 文件
for dcm_file_name in os.listdir(input_folder):
    if dcm_file_name.endswith('.dcm'):
        dcm_file_path = os.path.join(input_folder, dcm_file_name)

        # 读取DICOM文件
        dicom_data = pydicom.dcmread(dcm_file_path)

        # 获取像素数据
        pixel_data = dicom_data.pixel_array

        # 将像素值范围归一化到0-255之间
        pixel_data_normalized = ((pixel_data - np.min(pixel_data)) / (np.max(pixel_data) - np.min(pixel_data))) * 255
        pixel_data_normalized = pixel_data_normalized.astype(np.uint8)

        # 创建PIL图像对象
        png_image = Image.fromarray(pixel_data_normalized, mode='L')

        # 构建PNG文件名,并保存为PNG文件
        png_file_path = os.path.join(output_folder, dcm_file_name.replace('.dcm', '.png'))
        png_image.save(png_file_path)

单张多帧的dcm转为png图像

import pydicom
import os
import numpy as np
from PIL import Image

dicom_file_path = '/root/autodl-tmp/wzh/do_dcm/1-1.dcm'  # 替换为DICOM文件的实际路径

# 读取DICOM文件
dicom_data = pydicom.dcmread(dicom_file_path)

# 检查NumberOfFrames标签是否存在
if 'NumberOfFrames' in dicom_data:
    num_frames = dicom_data.NumberOfFrames
    print(f"This DICOM file contains {num_frames} frames.")

    # 创建输出文件夹
    output_folder = 'do_dcm/dcm_framesPNG/'  # 替换为输出PNG文件夹路径
    os.makedirs(output_folder, exist_ok=True)

    # 保存每一帧的像素数据为PNG图像
    for frame_idx in range(num_frames):
        frame_data = dicom_data.pixel_array[frame_idx, ...]

        # 将像素值范围归一化到0-255之间
        pixel_data_normalized = ((frame_data - np.min(frame_data)) / (np.max(frame_data) - np.min(frame_data))) * 255
        pixel_data_normalized = pixel_data_normalized.astype(np.uint8)

        png_image = Image.fromarray(pixel_data_normalized, mode='L')
        png_file_path = os.path.join(output_folder, f'frame_{frame_idx:03d}.png')
        png_image.save(png_file_path)
else:
    print("This DICOM file is not a multi-frame image.")

将文件夹中多个单张多帧的dcm转为png图像

import os
import pydicom
from PIL import Image

input_folder = 'path/to/your/input/folder'  # 替换为包含DICOM文件的文件夹路径
output_folder = 'path/to/output/folder'     # 替换为输出PNG文件的文件夹路径
os.makedirs(output_folder, exist_ok=True)

# 遍历输入文件夹中的每个 .dcm 文件
for file_name in os.listdir(input_folder):
    if file_name.endswith('.dcm'):
        dcm_file_path = os.path.join(input_folder, file_name)
        
        # 读取DICOM文件
        dicom_data = pydicom.dcmread(dcm_file_path)
        
        # 获取像素数据
        pixel_data = dicom_data.pixel_array
        
        # 创建子文件夹路径
        sub_folder_name = os.path.splitext(file_name)[0]
        sub_folder_path = os.path.join(output_folder, sub_folder_name)
        os.makedirs(sub_folder_path, exist_ok=True)
        
        # 保存像素数据为PNG图像
        png_file_path = os.path.join(sub_folder_path, f'{sub_folder_name}.png')
        png_image = Image.fromarray(pixel_data, mode='L')
        png_image.save(png_file_path)

你可能感兴趣的:(医学图像处理,图像处理,人工智能,python)