Spaces:
Sleeping
Sleeping
| import os | |
| from pathlib import Path | |
| import numpy as np | |
| import pydicom | |
| from PIL import Image | |
| from pydicom.dataset import Dataset, FileMetaDataset | |
| from pydicom.uid import ExplicitVRLittleEndian | |
| def to_dicom(input, output_path, plane="axial"): | |
| """Converts a png image to a dicom image. Written with assistance from ChatGPT.""" | |
| if isinstance(input, str) or isinstance(input, Path): | |
| png_path = input | |
| dicom_path = os.path.join( | |
| output_path, os.path.basename(png_path).replace(".png", ".dcm") | |
| ) | |
| image = Image.open(png_path) | |
| image_array = np.array(image) | |
| image_array = image_array[:, :, :3] | |
| else: | |
| image_array = input | |
| dicom_path = output_path | |
| meta = FileMetaDataset() | |
| meta.MediaStorageSOPClassUID = "1.2.840.10008.5.1.4.1.1.7" | |
| meta.MediaStorageSOPInstanceUID = pydicom.uid.generate_uid() | |
| meta.TransferSyntaxUID = ExplicitVRLittleEndian | |
| meta.ImplementationClassUID = pydicom.uid.PYDICOM_IMPLEMENTATION_UID | |
| ds = Dataset() | |
| ds.file_meta = meta | |
| ds.is_little_endian = True | |
| ds.is_implicit_VR = False | |
| ds.SOPClassUID = "1.2.840.10008.5.1.4.1.1.7" | |
| ds.SOPInstanceUID = pydicom.uid.generate_uid() | |
| ds.PatientName = "John Doe" | |
| ds.PatientID = "123456" | |
| ds.Modality = "OT" | |
| ds.SeriesInstanceUID = pydicom.uid.generate_uid() | |
| ds.StudyInstanceUID = pydicom.uid.generate_uid() | |
| ds.FrameOfReferenceUID = pydicom.uid.generate_uid() | |
| ds.BitsAllocated = 8 | |
| ds.BitsStored = 8 | |
| ds.HighBit = 7 | |
| ds.PhotometricInterpretation = "RGB" | |
| ds.PixelRepresentation = 0 | |
| ds.Rows = image_array.shape[0] | |
| ds.Columns = image_array.shape[1] | |
| ds.SamplesPerPixel = 3 | |
| ds.PlanarConfiguration = 0 | |
| if plane.lower() == "axial": | |
| ds.ImageOrientationPatient = [1, 0, 0, 0, 1, 0] | |
| elif plane.lower() == "sagittal": | |
| ds.ImageOrientationPatient = [0, 1, 0, 0, 0, -1] | |
| elif plane.lower() == "coronal": | |
| ds.ImageOrientationPatient = [1, 0, 0, 0, 0, -1] | |
| else: | |
| raise ValueError( | |
| "Invalid plane value. Must be 'axial', 'sagittal', or 'coronal'." | |
| ) | |
| ds.PixelData = image_array.tobytes() | |
| pydicom.filewriter.write_file(dicom_path, ds, write_like_original=False) | |
| # Example usage | |
| if __name__ == "__main__": | |
| png_path = "../../figures/spine_example.png" | |
| output_path = "./" | |
| plane = "sagittal" | |
| to_dicom(png_path, output_path, plane) | |