Organ-aware 3D lesion segmentation dataset and pipeline for abdominal CT analysis (ACM Multimedia 2025 candidate)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

generate_mask.py 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import os
  2. import nibabel as nib
  3. import numpy as np
  4. import cv2
  5. import glob
  6. from natsort import natsorted
  7. from organList import * # لیست اندام‌ها مانند Organ = ['liver', 'spleen', ...]
  8. # اندام‌های مورد نظر برای استخراج ماسک
  9. target_organs = ["liver", "spleen", "kidney_right", "kidney_left", "gallbladder", "stomach", "pancreas"]
  10. # مسیرها
  11. NIFTI_data_dir = '/media/external_10T/mehran_advand/segment/myenv/monai_wholeBody_ct_segmentation/Segmentation_Output'
  12. DCM_data_dir = '/media/external_10T/mehran_advand/DeepLesion/Images_dicom_test'
  13. output_dir = 'MONAI/'
  14. # دریافت لیست بیماران (فولدرهایی مثل 000001_01_01)
  15. patient_folders = natsorted(os.listdir(NIFTI_data_dir))
  16. for patient_id in patient_folders:
  17. # if patient_id != '000053_06_01':
  18. # continue
  19. print(f"\n🧾 Processing patient: {patient_id}")
  20. # ساخت مسیر فایل NIfTI و فولدر DICOM
  21. nii_path = os.path.join(NIFTI_data_dir, patient_id, f"{patient_id}_trans.nii.gz")
  22. dcm_folder = os.path.join(DCM_data_dir, patient_id)
  23. if not os.path.isfile(nii_path):
  24. print(f"❌ NIfTI file not found for {patient_id}")
  25. continue
  26. dcm_files = glob.glob(os.path.join(dcm_folder, "*.dcm"))
  27. if not dcm_files:
  28. print(f"❌ No DICOM files found for {patient_id}")
  29. continue
  30. dcm_files = natsorted(dcm_files)
  31. # بارگذاری داده‌ی NIfTI
  32. print(f"📥 Reading NIfTI: {nii_path}")
  33. nii = nib.load(nii_path)
  34. label_data = nii.get_fdata()
  35. # بررسی و تصحیح محورها بر اساس affine
  36. if nii.affine[0, 0] > 0:
  37. label_data = np.flip(label_data, axis=0)
  38. if nii.affine[1, 1] > 0:
  39. label_data = np.flip(label_data, axis=1)
  40. if nii.affine[2, 2] > 0:
  41. label_data = np.flip(label_data, axis=2)
  42. label_data = np.transpose(label_data, (2, 1, 0)) # Z, Y, X
  43. num_slices = min(len(label_data), len(dcm_files))
  44. # پردازش هر اندام
  45. for target_organ in target_organs:
  46. if target_organ not in Organ:
  47. print(f"⚠️ Organ '{target_organ}' not in Organ list. Skipping...")
  48. continue
  49. organ_index = Organ.index(target_organ)
  50. print(f"🧠 Processing organ: {target_organ} (index {organ_index})")
  51. for idx in range(num_slices):
  52. binary_mask = (label_data[idx] == organ_index).astype(np.uint8) * 255
  53. #if np.any(binary_mask):
  54. dcm_path = dcm_files[idx]
  55. out_path = dcm_path.replace(DCM_data_dir, output_dir)
  56. out_path = out_path.replace(patient_id, f"{patient_id}/MONAI_{target_organ}")
  57. out_path = out_path.replace('.dcm', '_OUT.png')
  58. out_path = out_path.replace('\\', '/')
  59. os.makedirs(os.path.dirname(out_path), exist_ok=True)
  60. cv2.imwrite(out_path, binary_mask)