-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add dicom_utils, test upload_annotation
- Loading branch information
Showing
7 changed files
with
95 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
import json | ||
import os | ||
from pathlib import Path | ||
from shutil import copyfile | ||
from tempfile import TemporaryDirectory | ||
from typing import NamedTuple | ||
|
||
import SimpleITK as sitk | ||
|
||
|
||
def file_list_from_directory(directory, extension=".dcm"): | ||
"""Return a list of files with the given extension in the given directory.""" | ||
return [str(f) for f in Path(directory).glob(f"*{extension}")] | ||
|
||
|
||
def write_image_and_metadata(image, metadata, output_image_filename): | ||
"""Write the image to a file, along with the metadata.""" | ||
sitk.WriteImage(image, output_image_filename) | ||
p = Path(output_image_filename) | ||
metadata_filename = p.parent / (p.stem + "_SOPInstanceUIDs.json") | ||
with open(metadata_filename, "w") as f: | ||
json.dump(metadata, f, indent=2) | ||
|
||
|
||
class ImageAndMetadata(NamedTuple): | ||
image: sitk.Image | ||
metadata: dict | ||
|
||
|
||
def read_dicoms_into_volume(valid_dcm_file_list) -> ImageAndMetadata: | ||
"""Convert a list of DICOM files to a image volume. Also returns metadata | ||
(SOPInstanceUID) for each slice in the volume. | ||
The metadata generated by this function is a map from slice index to | ||
SOPInstanceUID. And can be used to upload annotations from non-dicom formats | ||
back to MDai, which requires the SOPInstanceUID to identify the slice. | ||
PRECONDTIION: the input dicom files are in the same series, they are | ||
valid DICOM files, with no SCOUTS or other special slices. | ||
""" | ||
# copy to temp directory in case multiple series occupy the same directory | ||
with TemporaryDirectory() as temp_dir: | ||
src_file_lookup = {} | ||
for src_file in valid_dcm_file_list: | ||
dst_file = os.path.join(temp_dir, os.path.basename(src_file)) | ||
copyfile(src_file, dst_file) | ||
src_file_lookup[dst_file] = src_file | ||
reader = sitk.ImageSeriesReader() | ||
# allow for reading of metadata | ||
reader.SetMetaDataDictionaryArrayUpdate(True) | ||
dicom_names = reader.GetGDCMSeriesFileNames(temp_dir) | ||
reader.SetFileNames(dicom_names) | ||
image = reader.Execute() | ||
uids = [reader.GetMetaData(idx, "0008|0018") for idx in range(len(dicom_names))] | ||
# keep info about slice, original file, and SOPInstanceUID | ||
metadata = { | ||
slice_idx: {"dicom_file": src_file_lookup[fn], "SOPInstanceUID": uid} | ||
for slice_idx, (fn, uid) in enumerate(zip(dicom_names, uids)) | ||
} | ||
return ImageAndMetadata(image=image, metadata=metadata) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,3 +3,4 @@ pydicom>=2.4.3 | |
itk>=5.3.0 | ||
bidict>=0.22.1 | ||
opencv-python>=4.8.1.78 | ||
simpleITK>=2.3.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,6 +10,6 @@ | |
"mdai_annotations_only": true, | ||
"mdai_no_fixing_metadata": false, | ||
"labels": [ | ||
"mylabel", | ||
"mylabel" | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters