LIENWEIYING/test/OAR_Files/multi_organ_label_combiner.py

172 lines
6.9 KiB
Python
Raw Normal View History

2026-07-22 06:50:09 +00:00
# import os
# import SimpleITK as sitk
# import difflib
# # 定義資料夾路徑
# T1C_folder_path = '/home/onlylian/sorted_OAR_files/T1C'
# CTCTC_folder_path = '/home/onlylian/sorted_OAR_files/CT+CTC'
# T1C_output_folder_path = '/home/onlylian/T1C_label_folder'
# CTCTC_output_folder_path = '/home/onlylian/CT+CTC_label_folder'
# # 定義組織標籤對應關係
# labels = {
# "background": "0",
# "Brainstem": "1",
# "Right_Eye": "2",
# "Left_Eye": "3",
# "Optic_Chiasm": "4",
# "Right_Optic_Nerve": "5",
# "Left_Optic_Nerve": "6"
# }
# # 確保輸出資料夾存在
# os.makedirs(T1C_output_folder_path, exist_ok=True)
# os.makedirs(CTCTC_output_folder_path, exist_ok=True)
# def resample_image(image, reference_image):
# resample = sitk.ResampleImageFilter()
# resample.SetReferenceImage(reference_image)
# resample.SetInterpolator(sitk.sitkNearestNeighbor)
# resample.SetDefaultPixelValue(0)
# return resample.Execute(image)
# def process_images(input_folder, output_folder, image_type):
# # 獲取所有病人的資料夾路徑
# patient_folders = sorted([os.path.join(dp, d) for dp, dn, filenames in os.walk(input_folder) for d in dn])
# file_counter = 1
# for patient_folder in patient_folders:
# # 創建空的影像,用來合成所有器官
# combined_image = None
# # 獲取病人文件夾中的所有文件名,並轉換為小寫形式
# patient_files = {f.lower(): f for f in os.listdir(patient_folder)}
# filename = patient_folder.split('/')[-2]
# # 遍歷每個病人的所有影像文件
# for organ_name, label in labels.items():
# organ_filename = f'struct_{organ_name}.nii.gz'.lower()
# # 使用 difflib.get_close_matches 查找相似文件名
# possible_matches = difflib.get_close_matches(organ_filename, patient_files.keys(), n=1, cutoff=0.8)
# if possible_matches:
# matched_filename = patient_files[possible_matches[0]]
# organ_path = os.path.join(patient_folder, matched_filename)
# organ_image = sitk.ReadImage(organ_path)
# if combined_image is None:
# # 初始化合成影像
# combined_image = sitk.Image(organ_image.GetSize(), sitk.sitkUInt8)
# combined_image.CopyInformation(organ_image)
# # 重新取樣器官影像以匹配合成影像的大小
# resampled_organ_image = resample_image(organ_image, combined_image)
# # 將器官影像添加到合成影像中
# organ_array = sitk.GetArrayFromImage(resampled_organ_image)
# combined_array = sitk.GetArrayFromImage(combined_image)
# combined_array[organ_array > 0] = int(label)
# combined_image = sitk.GetImageFromArray(combined_array)
# combined_image.CopyInformation(resampled_organ_image)
# # 保存合成影像
# if combined_image:
# output_filename = f'{image_type}_label_{filename}.nii.gz'
# output_path = os.path.join(output_folder, output_filename)
# sitk.WriteImage(combined_image, output_path)
# print(f'Saved combined image to {output_path}')
# file_counter += 1
# # 處理 T1C 影像
# print("Processing T1C images...")
# process_images(T1C_folder_path, T1C_output_folder_path, 'T1C')
# # 處理 CT+CTC 影像
# print("Processing CT+CTC images...")
# process_images(CTCTC_folder_path, CTCTC_output_folder_path, 'CT+CTC')
# print("All processing completed.")
import os
import SimpleITK as sitk
import difflib
# 定义文件夹路径
T1_folder_path = '/mnt/1218/onlylian/sorted_OAR_files_test/T1C'
T1_output_folder_path = '/mnt/1218/onlylian/T1C_label_folder_test_2'
# 定义组织标签对应关系
labels = {
"background": "0",
"Brainstem": "1",
"Right_Eye": "2",
"Left_Eye": "3",
"Optic_Chiasm": "4",
"Right_Optic_Nerve": "5",
"Left_Optic_Nerve": "6"
}
# 确保输出文件夹存在
os.makedirs(T1_output_folder_path, exist_ok=True)
def resample_image(image, reference_image):
resample = sitk.ResampleImageFilter()
resample.SetReferenceImage(reference_image)
resample.SetInterpolator(sitk.sitkNearestNeighbor)
resample.SetDefaultPixelValue(0)
return resample.Execute(image)
def process_images(input_folder, output_folder, image_type):
# 获取所有病人的文件夹路径
patient_folders = sorted([os.path.join(dp, d) for dp, dn, filenames in os.walk(input_folder) for d in dn])
file_counter = 1
for patient_folder in patient_folders:
# 创建空的图像,用来合成所有器官
combined_image = None
# 获取病人文件夹中的所有文件名,并转换为小写形式
patient_files = {f.lower(): f for f in os.listdir(patient_folder)}
filename = patient_folder.split('/')[-2]
# 遍历每个病人的所有图像文件
for organ_name, label in labels.items():
organ_filename = f'struct_{organ_name}.nii.gz'.lower()
# 使用 difflib.get_close_matches 查找相似文件名
possible_matches = difflib.get_close_matches(organ_filename, patient_files.keys(), n=1, cutoff=0.8)
if possible_matches:
matched_filename = patient_files[possible_matches[0]]
organ_path = os.path.join(patient_folder, matched_filename)
organ_image = sitk.ReadImage(organ_path)
if combined_image is None:
# 初始化合成图像
combined_image = sitk.Image(organ_image.GetSize(), sitk.sitkUInt8)
combined_image.CopyInformation(organ_image)
# 重新采样器官图像以匹配合成图像的大小
resampled_organ_image = resample_image(organ_image, combined_image)
# 将器官图像添加到合成图像中
organ_array = sitk.GetArrayFromImage(resampled_organ_image)
combined_array = sitk.GetArrayFromImage(combined_image)
combined_array[organ_array > 0] = int(label)
combined_image = sitk.GetImageFromArray(combined_array)
combined_image.CopyInformation(resampled_organ_image)
# 保存合成图像
if combined_image:
output_filename = f'{image_type}_label_{filename}.nii.gz'
output_path = os.path.join(output_folder, output_filename)
sitk.WriteImage(combined_image, output_path)
print(f'Saved combined image to {output_path}')
file_counter += 1
# 处理 T1C 图像
print("Processing T1C images...")
process_images(T1_folder_path, T1_output_folder_path, 'T1C')
print("Processing completed.")