123/onlylian/test2.py

193 lines
6.1 KiB
Python
Raw Normal View History

2025-02-01 07:57:22 +00:00
import surfa as sf
ct = sf.load_volume('0/ct.nii.gz')
clipped = ct.clip(0, 80)
clipped.save('0/clipped.nii.gz')
exit()
from typing import Optional
import os
import SimpleITK as sitk
from pyradise.data import (Subject, IntensityImage, SegmentationImage,
Modality, Organ, Annotator)
from pyradise.fileio.extraction import SimpleModalityExtractor
import pyradise.data as ps_data
import pyradise.fileio as ps_io
# from nii_to_dicom import convert_subject_to_dicom_rtss
DCM_CT = '/nn/7295866/20250127/CT/a'
label_file = '/nn/7295866/20250127/output/processed_7_3D_SAG_T1_MPRAGE_+C_20250127132612.nii.gz'
segdir = '/nn/7295866/20250127/seg'
os.makedirs(segdir, exist_ok=True)
output_dir_path = '/nn/7295866/20250127/pyradise'
os.makedirs(output_dir_path, exist_ok=True)
rtss_file = '/nn/7295866/20250127/CT/a-rtss2.dcm'
class ExampleModalityExtractor(ps_io.ModalityExtractor):
def extract_from_dicom(self,
path: str
) -> Optional[ps_data.Modality]:
# Extract the necessary attributes from the DICOM file
tags = (ps_io.Tag((0x0008, 0x0060)), # Modality
ps_io.Tag((0x0008, 0x103e))) # Series Description
dataset_dict = self._load_dicom_attributes(tags, path)
# Identify the modality rule-based
modality = dataset_dict.get('Modality', {}).get('value', None)
series_desc = dataset_dict.get('Series Description', {}).get('value', '')
if modality == 'MR':
if 't1' in series_desc.lower():
return ps_data.Modality('T1')
elif 't2' in series_desc.lower():
return ps_data.Modality('T2')
else:
return None
elif modality == 'CT':
return ps_data.Modality('CT')
else:
return None
def extract_from_path(self,
path: str
) -> Optional[ps_data.Modality]:
if 'CT' in path:
return ps_data.Modality('CT')
# Identify the discrete image file's modality rule-based
filename = os.path.basename(path)
# Check if the image contains an img prefix
# (i.e., it is a intensity image)
if not filename.startswith('img'):
return None
# Check if the image contains a modality search string
if 'T1' in filename:
return ps_data.Modality('T1')
elif 'T2' in filename:
return ps_data.Modality('T2')
else:
return None
reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(DCM_CT)
reader.SetFileNames(dicom_names)
reader.MetaDataDictionaryArrayUpdateOn()
reader.LoadPrivateTagsOn()
image = reader.Execute()
final_image = sitk.ReadImage(label_file)
final_image = sitk.Resample(
final_image,
image,
sitk.Transform(),
sitk.sitkNearestNeighbor
)
lss = sitk.LabelShapeStatisticsImageFilter()
lss.Execute(final_image)
images = []
images.append(IntensityImage(image, Modality('CT')))
for label in lss.GetLabels():
segfile = os.path.join(segdir, 'seg-%d.nii.gz'%label)
print(segfile)
# sitk.WriteImage(final_image==label, segfile)
images.append(SegmentationImage(final_image==label, str(label)))
subject = Subject('7295866', images)
dcm_crawler = ps_io.SubjectDicomCrawler(DCM_CT,
# modality_extractor=SimpleModalityExtractor(['CT']),
modality_extractor=ExampleModalityExtractor(),
)
dicom_series_info = dcm_crawler.execute()
print(dicom_series_info[0])
print(dicom_series_info[0].get_modality())
print(dicom_series_info[0].get_path())
print(dicom_series_info[0].get_patient_id())
print(dicom_series_info[0].get_patient_name())
# exit()
reference_modality = 'CT'
use_3d_conversion = True
if use_3d_conversion:
conv_conf = ps_io.RTSSConverter3DConfiguration()
else:
conv_conf = ps_io.RTSSConverter2DConfiguration()
meta_data = ps_io.RTSSMetaData(
# patient_size='180',
# patient_weight='80',
# patient_age='050Y',
series_description='Converted from NIfTI')
converter = ps_io.SubjectToRTSSConverter(subject,
dicom_series_info,
reference_modality,
conv_conf,
meta_data)
rtss = converter.convert()
# Write the DICOM-RTSS to a separate subject directory
# and include the DICOM files crawled before
# Note: If you want to output just a subset of the
# original DICOM files you may use additional selectors
writer = ps_io.DicomSeriesSubjectWriter()
rtss_filename = rtss_file
rtss_combination = ((rtss_filename, rtss),)
writer.write(rtss_combination, output_dir_path,
subject.get_name(), dicom_series_info)
'''
pip install git+https://github.com/adalca/neurite.git git+https://github.com/freesurfer/surfa.git git+https://github.com/voxelmorph/voxelmorph.git
mri_synthmorph/mri_synthmorph '/nn/7295866/20250127/output/processed_7_3D_SAG_T1_MPRAGE_+C_20250127132612.nii.gz' -m affine -t trans.lta -o out-aff.nii.gz moving.nii.gz clipped.nii.gz -g
time FREESURFER_HOME=/123/onlylian/mri_synthmorph mri_synthmorph/mri_synthmorph -m affine -t trans.lta -o out-aff.nii.gz '/nn/7295866/20250127/nii/a_1.1_CyberKnife_head(MAR)_20250127111447_5.nii.gz' '/nn/7295866/20250127/nii/7_3D_SAG_T1_MPRAGE_+C_20250127132612_100.nii.gz' -g
###models
wget https://surfer.nmr.mgh.harvard.edu/docs/synthmorph/synthmorph.affine.2.h5
wget https://surfer.nmr.mgh.harvard.edu/docs/synthmorph/synthmorph.deform.3.h5
wget https://surfer.nmr.mgh.harvard.edu/docs/synthmorph/synthmorph.rigid.1.h5
time FREESURFER_HOME=/123/onlylian/mri_synthmorph mri_synthmorph/mri_synthmorph -m affine -t trans.lta -o out-aff.nii.gz t1c.nii.gz ct.nii.gz -g
time FREESURFER_HOME=/123/onlylian/mri_synthmorph mri_synthmorph/mri_synthmorph -m affine -t 0/trans.lta -o 0/out-aff.nii.gz 0/t1c.nii.gz 0/clipped.nii.gz -g
time FREESURFER_HOME=/123/onlylian/mri_synthmorph mri_synthmorph/mri_synthmorph -o 0/out.nii.gz 0/t1c.nii.gz 0/clipped.nii.gz -g
'''