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