Exemplo n.º 1
0
    def test_save(self):
        filepath = get_testdata_file("MR_small.dcm")
        dr = DicomReader(group_by=None)
        mv_base = dr.load(filepath)[0]

        out_dir = os.path.join(self.data_dirpath, "test_save_sort_by")
        dw = DicomWriter()
        dw.save(mv_base, out_dir, sort_by="InstanceNumber")
        mv2 = dr.load(filepath)[0]
        assert mv2.is_identical(mv_base)

        out_dir = os.path.join(self.data_dirpath, "test_save_no_headers")
        mv = MedicalVolume(np.ones((10, 10, 10)), np.eye(4))
        dw = DicomWriter()
        with self.assertRaises(ValueError):
            dw.save(mv, out_dir)
Exemplo n.º 2
0
    def test_save_different_bits(self):
        """Test writing volume where bit depth has changed."""
        filepath = get_testdata_file("MR_small.dcm")
        dr = DicomReader(group_by=None)
        mv_base = dr.load(filepath)[0]

        arr = (np.random.rand(*mv_base.shape) > 0.5).astype(np.uint8) * 255
        mv = mv_base._partial_clone(volume=arr)

        dw = DicomWriter()
        out_dir = os.path.join(self.data_dirpath, "test_write_different_bits")
        dw.save(mv, dir_path=out_dir)

        dr = DicomReader(group_by=None)
        mv2 = dr.load(out_dir)[0]
        assert mv2.is_identical(mv)
Exemplo n.º 3
0
    def from_dicom(
        cls,
        dir_or_files,
        group_by=None,
        ignore_ext: bool = False,
        num_workers: int = 0,
        verbose: bool = False,
        **kwargs,
    ):
        """Load scan from dicom files.

        Args:
            dir_or_files (str): The path to dicom directory or files.
            group_by: DICOM field tag name or tag number used to group dicoms. Defaults
                to scan's ``__DEFAULT_SPLIT_BY__``.
            ignore_ext (bool, optional): If `True`, ignore extension (`.dcm`)
                when loading dicoms from directory.
            num_workers (int, optional): Number of workers to use for loading.
            verbose (bool, optional): If ``True``, enable verbose logging for dicom loading.
            kwargs: Other keywords required to construct scan.

        Returns:
            The scan.
        """
        dr = DicomReader(num_workers, verbose)
        if group_by is None:
            group_by = cls.__DEFAULT_SPLIT_BY__
        volumes = dr.load(dir_or_files, group_by, ignore_ext)

        if isinstance(dir_or_files, (str, Path, os.PathLike)):
            dir_or_files = os.path.abspath(dir_or_files)
        else:
            dir_or_files = type(dir_or_files)(
                [os.path.abspath(x) for x in dir_or_files])

        scan = cls(volumes, **kwargs)
        scan._from_file_args = {
            "dir_or_files": dir_or_files,
            "ignore_ext": ignore_ext,
            "group_by": group_by,
            "_type": "dicom",
        }

        return scan
Exemplo n.º 4
0
    def test_init_params(self):
        """Test reading/writing works with passing values to constructor."""
        dp = ututils.get_scan_dirpath("qdess")
        # Echo 1 only
        fp = ututils.get_read_paths(dp, self.data_format)[0]

        e1_expected = self.dr.load(fp, group_by=None, sort_by="InstanceNumber", ignore_ext=False)[0]
        dr = DicomReader(group_by=None, sort_by="InstanceNumber", ignore_ext=False)
        e1 = dr.load(fp)[0]
        e1_expected.orientation

        assert e1.is_identical(e1_expected)

        write_path = os.path.join(ututils.get_write_path(dp, self.data_format), "out-init-params")
        dw = DicomWriter(fname_fmt="I%05d.dcm", sort_by="InstanceNumber")
        dw.save(e1_expected, write_path, sort_by="InstanceNumber")

        files = [_f for _f in os.listdir(write_path) if _f.endswith(".dcm")]
        assert len(files) == e1_expected.shape[-1]
Exemplo n.º 5
0
    def test_load_pydicom_data(self):
        filepath = get_testdata_file("MR_small.dcm")
        dr = DicomReader(group_by=None)
        mv = dr.load(filepath)[0]

        # CT does not have EchoNumbers field in header.
        with self.assertRaises(KeyError):
            dr.load(get_testdata_file("CT_small.dcm"), group_by="EchoNumbers")
        with self.assertRaises(KeyError):
            dr.load(get_testdata_file("CT_small.dcm"), sort_by="EchoNumbers")

        # Multiprocessing
        dr_mp = DicomReader(group_by=None, num_workers=1)
        mv2 = dr_mp.load(filepath)[0]
        assert mv2.is_identical(mv)

        dr_mp = DicomReader(group_by=None, num_workers=1, verbose=True)
        mv2 = dr_mp.load(filepath)[0]
        assert mv2.is_identical(mv)

        # sort by
        mv2 = dr.load(filepath, sort_by="InstanceNumber")[0]
        assert mv2.is_identical(mv)