From 10ce0544a76b1051e2ad5421bf6dd87f02184cc4 Mon Sep 17 00:00:00 2001 From: Tamino Huxohl <thuxohl@techfak.uni-bielefeld.de> Date: Thu, 17 Nov 2022 13:44:46 +0100 Subject: [PATCH] rename conversion script and add capability to convert without writing file --- mu_map/file/dicom2interfile.py | 49 --------------------------- mu_map/file/dicom_to_interfile.py | 56 +++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 49 deletions(-) delete mode 100644 mu_map/file/dicom2interfile.py create mode 100644 mu_map/file/dicom_to_interfile.py diff --git a/mu_map/file/dicom2interfile.py b/mu_map/file/dicom2interfile.py deleted file mode 100644 index aed5541..0000000 --- a/mu_map/file/dicom2interfile.py +++ /dev/null @@ -1,49 +0,0 @@ -import argparse -import os - -import numpy as np -import pydicom - -from mu_map.file.dicom import load_dcm -from mu_map.file.interfile import HEADER_TEMPLATE - -DCM_TAG_PIXEL_SCALE_FACTOR = 0x00331038 - - -parser = argparse.ArgumentParser( - description="convert a DICOM image to the INTERFILE format" -) -parser.add_argument("--dcm", type=str, required=True, help="the DICOM image to convert") -parser.add_argument( - "--out", - type=str, - help="the filename for the resulting INTERFILE format. If not specified it defaults to the input name with different extensions.", -) -args = parser.parse_args() - -args.out = args.dcm if args.out is None else args.out -args.out = os.path.splitext(args.out)[ - 0 -] # make sure the output file does not have an extension - -dcm, image = load_dcm(args.dcm) - -datafile = f"{args.out}.v" -data = image.astype(np.float32) -with open(datafile, mode="wb") as f: - f.write(data.tobytes()) - -header = HEADER_TEMPLATE.replace("{DATA_FILE}", os.path.basename(datafile)) -header = header.replace("{ROWS}", str(dcm.Rows)) -header = header.replace("{SPACING_X}", f"{dcm.PixelSpacing[0]:.4f}") -header = header.replace("{COLUMNS}", str(dcm.Columns)) -header = header.replace("{SPACING_Y}", f"{dcm.PixelSpacing[1]:.4f}") -header = header.replace("{SLICES}", str(dcm.NumberOfSlices)) -header = header.replace("{SPACING_Z}", f"{dcm.SliceThickness:.4f}") -header = header.replace("{OFFSET_X}", str(-0.5 * dcm.Rows * dcm.PixelSpacing[0])) -header = header.replace("{OFFSET_Y}", str(-0.5 * dcm.Columns * dcm.PixelSpacing[1])) -header = header.strip() - -headerfile = f"{args.out}.hv" -with open(headerfile, mode="w") as f: - f.write(header) diff --git a/mu_map/file/dicom_to_interfile.py b/mu_map/file/dicom_to_interfile.py new file mode 100644 index 0000000..5c8005f --- /dev/null +++ b/mu_map/file/dicom_to_interfile.py @@ -0,0 +1,56 @@ +from typing import Dict, Tuple + +import numpy as np +from pydicom.dataset import FileDataset as DCMImage + +from mu_map.file.interfile import HEADER_TEMPLATE, parse_interfile_header_str + + +def to_interfile(dcm: DCMImage, image: np.ndarray) -> Tuple[Dict[str, str], np.ndarray]: + """ + Convert a DICOM image to INTERFILE format. + + :param dcm: the DICOM image + :param image: the image as a numpy array + :return: the header and image in INTERFILE format + """ + header = HEADER_TEMPLATE.replace("{ROWS}", str(dcm.Rows)) + header = header.replace("{SPACING_X}", f"{dcm.PixelSpacing[0]:.4f}") + header = header.replace("{COLUMNS}", str(dcm.Columns)) + header = header.replace("{SPACING_Y}", f"{dcm.PixelSpacing[1]:.4f}") + header = header.replace("{SLICES}", str(dcm.NumberOfSlices)) + header = header.replace("{SPACING_Z}", f"{dcm.SliceThickness:.4f}") + header = header.replace("{OFFSET_X}", str(-0.5 * dcm.Rows * dcm.PixelSpacing[0])) + header = header.replace("{OFFSET_Y}", str(-0.5 * dcm.Columns * dcm.PixelSpacing[1])) + header = parse_interfile_header_str(header) + return header, image.astype(np.float32) + + +if __name__ == "__main__": + import argparse + import os + + from mu_map.file.dicom import load_dcm + from mu_map.file.interfile import write_interfile + + parser = argparse.ArgumentParser( + description="convert a DICOM image to the INTERFILE format" + ) + parser.add_argument( + "--dcm", type=str, required=True, help="the DICOM image to convert" + ) + parser.add_argument( + "--out", + type=str, + help="the filename for the resulting INTERFILE format. If not specified it defaults to the input name with different extensions.", + ) + args = parser.parse_args() + + args.out = args.dcm if args.out is None else args.out + args.out = os.path.splitext(args.out)[ + 0 + ] # make sure the output file does not have an extension + + dcm, image = load_dcm(args.dcm) + header, image = to_interfile(dcm, image) + write_interfile(args.out, header, image) -- GitLab