Пример #1
0
 def __init__(self, config, in_dat_folder, out_folder, ref_img,
              file_list_txt):
     super().__init__(config, in_dat_folder, file_list_txt)
     self._ref_img = ScanWrapper(ref_img)
     self._out_data_folder = DataFolder.get_data_folder_obj(
         config, out_folder, data_list_txt=file_list_txt)
     self._jacobian_tool = config['deedsBCV_jacobian']
Пример #2
0
    def _run_single_scan(self, idx):
        in_file_path = self._in_data_folder.get_file_path(idx)
        in_data = ScanWrapper(in_file_path)

        in_img = in_data.get_data()
        # self._data_matrix[idx, :] = in_img.reshape(in_data.get_number_voxel())
        self._data_matrix[idx, :] = convert_3d_2_flat(in_img)
Пример #3
0
 def __init__(self, config, in_folder, ref_img, batch_size, file_list=None):
     super().__init__(config, in_folder, file_list)
     self._ref_img = ScanWrapper(self._in_data_folder.get_file_path(0))
     self._chunk_list = self._in_data_folder.get_chunks_list_batch_size(
         batch_size)
     self._data_matrix = []
     self._cur_idx = 0
Пример #4
0
    def plot_pc(self, out_png):
        fig = plt.figure(figsize=(self._num_show_pc * 20,
                                  self._num_clip * self._num_view * 15))
        gs = gridspec.GridSpec(1, self._num_show_pc)

        sub_gs_list = []
        for idx_pc in range(self._num_show_pc):
            sub_gs = gs[idx_pc].subgridspec(self._num_clip * self._num_view, 1)
            sub_gs_list.append(sub_gs)

        for idx_pc in range(self._num_show_pc):
            img_data_obj = ScanWrapper(
                self._pc_folder_obj.get_file_path(idx_pc))
            img_data = img_data_obj.get_data()
            img_name = os.path.basename(
                self._pc_folder_obj.get_file_path(idx_pc)).replace(
                    '.nii.gz', '')
            logger.info(
                f'Reading image {self._pc_folder_obj.get_file_path(idx_pc)}')
            self._plot_one_pc(img_data, sub_gs_list[idx_pc], f'{img_name}')

        # out_eps = out_png.replace('.png', '.eps')
        logger.info(f'Save fig to {out_png}')
        # plt.savefig(out_eps, bbox_inches='tight', pad_inches=0, dpi=self._out_dpi, format='pdf')
        plt.savefig(out_png,
                    bbox_inches='tight',
                    pad_inches=0,
                    dpi=self._out_dpi)
        plt.close(fig=fig)
Пример #5
0
class JacobianAffineCorrection(AbstractParallelRoutine):
    def __init__(self, config, in_jac_folder, in_affine_mat_folder, out_folder,
                 ref_img, file_list_txt):
        super().__init__(config, in_jac_folder, file_list_txt)
        self._ref_img = ScanWrapper(ref_img)
        self._in_affine_mat_folder = DataFolder.get_data_folder_obj(
            config, in_affine_mat_folder, data_list_txt=file_list_txt)
        self._out_data_folder = DataFolder.get_data_folder_obj(
            config, out_folder, data_list_txt=file_list_txt)

    def _run_single_scan(self, idx):
        in_data_path = self._in_data_folder.get_file_path(idx)
        in_affine_mat_path = self._in_affine_mat_folder.get_file_path(
            idx).replace('.nii.gz', '.txt')
        out_file_path = self._out_data_folder.get_file_path(idx)

        in_image = ScanWrapper(in_data_path)
        affine_mat = self._get_affine_matrix(in_affine_mat_path)

        new_log_jacobian_det = in_image.get_data() + np.log(
            np.linalg.det(affine_mat))

        self._ref_img.save_scan_same_space(out_file_path, new_log_jacobian_det)

    def _get_affine_matrix(self, mat_path):
        return np.loadtxt(mat_path)
Пример #6
0
class MaskIntersection(AbstractParallelRoutine):
    def __init__(self, config, in_folder, out_img_path, file_list_txt):
        super().__init__(config, in_folder, file_list_txt)
        self._out_img_path = out_img_path
        self._ref_img = ScanWrapper(self._in_data_folder.get_first_path())

    def run(self):
        result_list = self.run_parallel()
        out_mask = self._get_intersect_mask(result_list)

        self._ref_img.save_scan_same_space(self._out_img_path, out_mask)

    def _run_single_scan(self, idx):
        in_img = ScanWrapper(self._in_data_folder.get_file_path(idx))
        return in_img.get_data()

    def _run_chunk(self, chunk_list):
        result_list = []
        inter_mask = np.ones(self._ref_img.get_shape())
        for idx in chunk_list:
            self._in_data_folder.print_idx(idx)
            mask = self._run_single_scan(idx)
            inter_mask = np.multiply(inter_mask, mask)

        result_list.append(inter_mask)
        return result_list

    def _get_intersect_mask(self, mask_list):
        inter_mask = np.ones(self._ref_img.get_shape())
        for mask in mask_list:
            inter_mask = np.multiply(inter_mask, mask)

        return inter_mask
Пример #7
0
 def __init__(self, config, in_folder, mask_img, out_png_folder, file_list_txt):
     super().__init__(config, in_folder, file_list_txt)
     self._mask_img = ScanWrapper(mask_img)
     self._out_png_folder = DataFolder.get_data_folder_obj(config, out_png_folder, data_list_txt=file_list_txt)
     self._out_png_folder.change_suffix('.png')
     self._vmax = 500
     self._vmin = -1000
Пример #8
0
 def __init__(self, config, in_jac_folder, in_affine_mat_folder, out_folder,
              ref_img, file_list_txt):
     super().__init__(config, in_jac_folder, file_list_txt)
     self._ref_img = ScanWrapper(ref_img)
     self._in_affine_mat_folder = DataFolder.get_data_folder_obj(
         config, in_affine_mat_folder, data_list_txt=file_list_txt)
     self._out_data_folder = DataFolder.get_data_folder_obj(
         config, out_folder, data_list_txt=file_list_txt)
Пример #9
0
    def _run_single_scan(self, idx):
        in_img = ScanWrapper(self._in_data_folder.get_file_path(idx))
        out_mask_path = self._out_folder.get_file_path(idx)

        in_img_data = in_img.get_data()
        non_nan_mask = in_img_data == in_img_data

        logger.info(f'Save non-nan mask to {out_mask_path}')
        in_img.save_scan_same_space(out_mask_path, non_nan_mask.astype(int))
Пример #10
0
    def _run_single_scan(self, idx):
        in_file_1_path = self._in_data_folder.get_file_path(idx)
        in_file_2_path = self._in_data_folder_2.get_file_path(idx)

        in_img_1 = ScanWrapper(in_file_1_path).get_data()
        in_img_2 = ScanWrapper(in_file_2_path).get_data()

        nrmse = compare_nrmse(np.abs(in_img_1), np.abs(in_img_2))
        self._nrmse_diff.append(nrmse)
Пример #11
0
 def __init__(self,
              config,
              in_folder,
              out_folder,
              average_img,
              file_list_txt=None):
     super().__init__(config, in_folder, file_list_txt=file_list_txt)
     self._out_data_folder = DataFolder.get_data_folder_obj(
         config, out_folder, data_list_txt=file_list_txt)
     mkdir_p(out_folder)
     self._average_img = ScanWrapper(average_img)
Пример #12
0
 def __init__(self,
              config,
              in_folder=None,
              data_file_txt=None,
              in_data_folder_obj=None):
     self._data_folder = None
     if in_data_folder_obj is None:
         self._data_folder = DataFolder(in_folder, data_file_txt)
     else:
         self._data_folder = in_data_folder_obj
     self._standard_ref = ScanWrapper(self._data_folder.get_first_path())
     self._num_processes = config['num_processes']
Пример #13
0
    def _plot_pc_one_view(self, idx_view, out_png_path):
        view_config_list = self._get_view_config()
        clip_plane = view_config_list[idx_view]['clip plane']

        num_files = self._pc_folder_obj.num_files()
        num_lines = int(num_files / self._num_show_pc)

        fig = plt.figure(figsize=(self._num_show_pc * 15, num_lines * 12))
        gs = gridspec.GridSpec(num_lines, self._num_show_pc)
        gs.update(wspace=0.025, hspace=0.025)

        for idx_row in range(num_lines):
            # if idx_row != 0:
            #     continue
            for idx_column in range(self._num_show_pc):
                # if idx_column != 0:
                #     continue
                idx_file = idx_column + self._num_show_pc * idx_row
                logger.info(
                    f'Plot scan {self._pc_folder_obj.get_file_path(idx_file)}')
                img_data_obj = ScanWrapper(
                    self._pc_folder_obj.get_file_path(idx_file))
                img_data = img_data_obj.get_data()

                range_norm = np.max([np.min(img_data), np.max(img_data)])
                # vmin = - 0.5 * range_norm
                # vmax = 0.5 * range_norm
                vmin = -0.0015
                vmax = 0.0015

                clip = self._clip_image(img_data, clip_plane, 0)

                ax = plt.subplot(gs[idx_row, idx_column])
                plt.axis('off')
                im = plt.imshow(clip,
                                interpolation='none',
                                cmap=self._cm,
                                norm=colors.Normalize(vmin=vmin, vmax=vmax))

                # divider = make_axes_locatable(ax)
                # cax = divider.append_axes("right", size="5%", pad=0.05)
                #
                # cb = plt.colorbar(im, cax=cax)
                # # cb.set_label('Intensity of eigen image')
                # cb.ax.tick_params(labelsize=self._sub_title_font_size / 2)

        logger.info(f'Save plot to {out_png_path}')
        plt.savefig(out_png_path,
                    bbox_inches='tight',
                    pad_inches=0.1,
                    dpi=self._out_dpi)
        plt.close(fig=fig)
Пример #14
0
    def _run_single_scan(self, idx):
        in_ori_data = ScanWrapper(
            self._in_data_folder.get_file_path(idx)).get_data()
        in_jac_data = ScanWrapper(
            self._in_jac_folder.get_file_path(idx)).get_data()

        self._data_matrix[self._cur_idx, :self._ref_ori.get_number_voxel(
        )] = convert_3d_2_flat(in_ori_data)
        self._data_matrix[
            self._cur_idx,
            self._ref_ori.get_number_voxel():] = convert_3d_2_flat(in_jac_data)

        self._cur_idx += 1
Пример #15
0
 def __init__(self,
              config,
              in_scan_folder,
              in_region_mask_folder,
              file_list_txt,
              out_average_img,
              ambient=-5000):
     super().__init__(config, in_scan_folder, file_list_txt)
     self._in_region_mask_folder = DataFolder.get_data_folder_obj(
         config, in_region_mask_folder, data_list_txt=file_list_txt)
     self._out_img_path = out_average_img
     self._ref_img = ScanWrapper(self._in_data_folder.get_first_path())
     self._ambient = ambient
Пример #16
0
    def _run_single_scan(self, idx):
        in_data_path = self._in_data_folder.get_file_path(idx)
        in_affine_mat_path = self._in_affine_mat_folder.get_file_path(
            idx).replace('.nii.gz', '.txt')
        out_file_path = self._out_data_folder.get_file_path(idx)

        in_image = ScanWrapper(in_data_path)
        affine_mat = self._get_affine_matrix(in_affine_mat_path)

        new_log_jacobian_det = in_image.get_data() + np.log(
            np.linalg.det(affine_mat))

        self._ref_img.save_scan_same_space(out_file_path, new_log_jacobian_det)
Пример #17
0
 def __init__(self,
              mask_img_path,
              config,
              in_ori_folder,
              in_jac_folder,
              batch_size,
              file_list_txt=None):
     super().__init__(config, in_ori_folder, in_jac_folder, batch_size,
                      file_list_txt)
     self._mask_img = ScanWrapper(mask_img_path)
     self._masked_ref_ori = ScanWrapperWithMask(
         self._in_data_folder.get_file_path(0), self._mask_img.get_path())
     self._masked_ref_jac = ScanWrapperWithMask(
         self._in_jac_folder.get_file_path(0), self._mask_img.get_path())
Пример #18
0
 def __init__(self,
              config,
              in_ori_folder,
              in_jac_folder,
              batch_size,
              file_list_txt=None):
     super().__init__(config, in_ori_folder, file_list_txt)
     self._in_jac_folder = DataFolder(in_jac_folder, file_list_txt)
     self._ref_ori = ScanWrapper(self._in_data_folder.get_file_path(0))
     self._ref_jac = ScanWrapper(self._in_jac_folder.get_file_path(0))
     self._chunk_list = self._in_data_folder.get_chunks_list_batch_size(
         batch_size)
     self._data_matrix = []
     self._cur_idx = 0
Пример #19
0
    def clip_plot(self, out_png_folder):
        in_img_obj = ScanWrapper(self._in_img_path)
        in_back_obj = ScanWrapper(self._in_back_img_path)

        in_img_data = in_img_obj.get_data()
        in_back_data = in_back_obj.get_data()

        masked_img_data = None
        masked_back_data = None

        if self._in_mask_path is not None:
            in_mask_obj = ScanWrapper(self._in_mask_path)
            in_mask_data = in_mask_obj.get_data()

            masked_img_data = np.zeros(in_img_data.shape, dtype=float)
            masked_img_data.fill(np.nan)
            masked_img_data[in_mask_data == 1] = in_img_data[in_mask_data == 1]

            masked_back_data = np.zeros(in_back_data.shape, dtype=float)
            masked_back_data.fill(np.nan)
            masked_back_data[in_mask_data == 1] = in_back_data[in_mask_data == 1]
        else:
            masked_img_data = in_img_data
            masked_back_data = in_back_data

        self._plot_stacked_view(
            self._num_clip,
            self._step_axial,
            masked_img_data,
            masked_back_data,
            'axial',
            out_png_folder,
            1
        )

        self._plot_stacked_view(
            self._num_clip,
            self._step_sagittal,
            masked_img_data,
            masked_back_data,
            'sagittal',
            out_png_folder,
            5.23438 / 2.28335
        )

        self._plot_stacked_view(
            self._num_clip,
            self._step_coronal,
            masked_img_data,
            masked_back_data,
            'coronal',
            out_png_folder,
            5.23438 / 2.17388
        )
Пример #20
0
def _get_slices_dim_list(pc_folder, file_list_txt):
    center_slices_x = []
    center_slices_y = []
    center_slices_z = []
    data_folder = DataFolder(pc_folder, file_list_txt)
    for file_idx in range(show_pc_number):
        data_folder.print_idx(file_idx)
        file_path = data_folder.get_file_path(file_idx)
        scan = ScanWrapper(file_path)
        slice_x, slice_y, slice_z = scan.get_center_slices()
        center_slices_x.append(slice_x)
        center_slices_y.append(slice_y)
        center_slices_z.append(slice_z)

    return center_slices_x, center_slices_y, center_slices_z
Пример #21
0
def main():
    parser = argparse.ArgumentParser(description='Load a saved pca object')
    parser.add_argument('--load-pca-bin-path', type=str,
                        help='Location of the pca bin')
    parser.add_argument('--in-folder', type=str)
    parser.add_argument('--out-folder', type=str)
    parser.add_argument('--mask-img', type=str)
    parser.add_argument('--num-mode', type=int)
    parser.add_argument('--file-list-txt', type=str)
    parser.add_argument('--num-process', type=int, default=10)
    args = parser.parse_args()

    in_folder_obj = DataFolder(args.in_folder, args.file_list_txt)
    out_folder_obj = DataFolder(args.out_folder, args.file_list_txt)
    mask_img_obj = ScanWrapper(args.mask_img)

    paral_obj = ParalGetResidual(
        args.load_pca_bin_path,
        in_folder_obj,
        out_folder_obj,
        mask_img_obj,
        args.num_mode,
        args.num_process
    )

    paral_obj.run_parallel()
Пример #22
0
class ScanFolderFlatReader(AbstractParallelRoutine):
    def __init__(self, config, in_folder, ref_img):
        super().__init__(config, in_folder)
        self._ref_img = ScanWrapper(ref_img)
        self._data_matrix = []

    def read_data(self):
        print(f'Reading scan from folder {self._in_data_folder.get_folder()}')
        tic = time.perf_counter()
        self._data_matrix = self._init_data_matrix()
        self.run_non_parallel()
        # self.run_parallel()
        toc = time.perf_counter()
        print(f'Done. {toc - tic:0.4f} (s)')

    def get_data_matrix(self):
        return self._data_matrix

    def _run_single_scan(self, idx):
        in_file_path = self._in_data_folder.get_file_path(idx)
        in_data = ScanWrapper(in_file_path)

        in_img = in_data.get_data()
        # self._data_matrix[idx, :] = in_img.reshape(in_data.get_number_voxel())
        self._data_matrix[idx, :] = convert_3d_2_flat(in_img)

    def _init_data_matrix(self):
        num_features = self._ref_img.get_number_voxel()
        num_sample = self.num_files()

        data_matrix = np.zeros((num_sample, num_features))
        return data_matrix
Пример #23
0
    def _run_chunk(self, chunk_list):
        pca_nii_3d = PCA_NII_3D(None, None, 1)
        pca_nii_3d.load_pca(self._pca_bin_path)

        result_list = []
        for idx in chunk_list:
            self._in_data_folder.print_idx(idx)
            image_obj = ScanWrapper(self._in_data_folder.get_file_path(idx))
            jac_obj = ScanWrapper(self._in_jac_folder_obj.get_file_path(idx))
            low_dim_representation = pca_nii_3d.transform_concat(image_obj, jac_obj)
            result = {
                'scan_name': self._in_data_folder.get_file_name(idx),
                'low_dim': low_dim_representation
            }
            print(result)
            result_list.append(result)
        return result_list
Пример #24
0
 def __init__(self, config, in_folder, out_folder, ref_img, order=3):
     super().__init__(config, in_folder)
     self._out_data_folder = DataFolder.get_data_folder_obj(
         config, out_folder)
     self._ref_img = ScanWrapper(ref_img)
     self._order = order
     self._reg_resample = config['niftyreg_resample']
     self._reg_resmaple_ref = config['reg_resample_ref_img']
Пример #25
0
class ScanFolderConcatBatchReaderWithMask(ScanFolderConcatBatchReader):
    def __init__(self,
                 mask_img_path,
                 config,
                 in_ori_folder,
                 in_jac_folder,
                 batch_size,
                 file_list_txt=None):
        super().__init__(config, in_ori_folder, in_jac_folder, batch_size,
                         file_list_txt)
        self._mask_img = ScanWrapper(mask_img_path)
        self._masked_ref_ori = ScanWrapperWithMask(
            self._in_data_folder.get_file_path(0), self._mask_img.get_path())
        self._masked_ref_jac = ScanWrapperWithMask(
            self._in_jac_folder.get_file_path(0), self._mask_img.get_path())

    def save_flat_data(self, data_array, idx, out_folder):
        out_path_ori = os.path.join(out_folder, f'pc_ori_{idx}.nii.gz')
        out_path_jac = os.path.join(out_folder, f'pc_jac_{idx}.nii.gz')

        ori_data_flat = data_array[:self._get_number_of_voxel_ori()]
        jac_data_flat = data_array[self._get_number_of_voxel_ori():]

        self._masked_ref_ori.save_scan_flat_img(ori_data_flat, out_path_ori)
        self._masked_ref_jac.save_scan_flat_img(jac_data_flat, out_path_jac)

    def _run_single_scan(self, idx):
        in_ori_data_obj = ScanWrapperWithMask(
            self._in_data_folder.get_file_path(idx), self._mask_img.get_path())
        in_jac_data_obj = ScanWrapperWithMask(
            self._in_jac_folder.get_file_path(idx), self._mask_img.get_path())

        self._data_matrix[self._cur_idx, :self._get_number_of_voxel_ori(
        )] = in_ori_data_obj.get_data_flat()
        self._data_matrix[self._cur_idx,
                          self._get_number_of_voxel_ori(
                          ):] = in_jac_data_obj.get_data_flat()

        self._cur_idx += 1

    def _get_number_of_voxel_ori(self):
        return self._masked_ref_ori.get_data_flat().shape[0]

    def _get_number_of_voxel_jac(self):
        return self._masked_ref_jac.get_data_flat().shape[0]
Пример #26
0
    def _run_single_scan(self, idx):
        in_file_path = self._in_data_folder.get_file_path(idx)
        out_file_path = self._out_data_folder.get_file_path(idx)

        in_img = ScanWrapper(in_file_path).get_data()
        average_img = self._average_img.get_data()

        np.copyto(in_img, average_img, where=(in_img != in_img))
        np.copyto(in_img, 0, where=(in_img != in_img))
        self._average_img.save_scan_same_space(out_file_path, in_img)
    def _run_single_scan(self, idx):
        in_img = ScanWrapper(self._in_data_folder.get_file_path(idx))
        in_mask = ScanWrapper(self._in_mask_folder_obj.get_file_path(idx))

        in_img_data = in_img.get_data()
        in_mask_data = in_mask.get_data()

        mask_data = np.zeros(in_mask_data.shape, dtype=int)
        for lung_label in self._lung_label_list:
            mask_match_map = (in_mask_data == lung_label).astype(int)
            print(f'lung label: {lung_label}')
            print(f'match_map shape: {mask_match_map.shape}')
            print(f'num posi voxels: {np.sum(mask_match_map)}')
            mask_data += mask_match_map

        mask_data = ~mask_data.astype('bool')
        print(f'Final mask: {np.sum(mask_data)}')
        in_img_data_with_mask = np.ma.array(in_img_data, mask=mask_data.astype('bool'))

        mean_in_mask = in_img_data_with_mask.mean()
        file_name = self._in_data_folder.get_file_name(idx)

        result_dict = {
            'file_name': file_name,
            'mean': mean_in_mask
        }

        print(result_dict)

        return result_dict
Пример #28
0
    def _run_single_scan(self, idx):
        in_img_path = self._in_data_folder.get_file_path(idx)
        in_img = ScanWrapper(in_img_path)

        slice_in_img = self._clip_nifti(in_img.get_data())
        slice_mask_img = self._clip_nifti(self._mask_img.get_data())

        plt.figure(figsize=(15, 15))
        plt.axis('off')

        clip_x_nii_rescale = exposure.rescale_intensity(slice_in_img, in_range=(self._vmin, self._vmax), out_range=(0, 1))
        clip_x_nii_rgb = color.gray2rgb(clip_x_nii_rescale)
        plt.imshow(clip_x_nii_rgb, alpha=0.8)
        plt.imshow(slice_mask_img,
                   interpolation='none',
                   cmap='jet',
                   norm=colors.Normalize(vmin=0, vmax=1),
                   alpha=0.3)

        out_png_path = self._out_png_folder.get_file_path(idx)
        print(f'Saving image to {out_png_path}')
        plt.savefig(out_png_path, bbox_inches='tight', pad_inches=0)
Пример #29
0
class ScanFolderBatchWithMaskReader(ScanFolderBatchReader):
    def __init__(self, config, in_folder, mask_img, batch_size, file_list_txt):
        super().__init__(config, in_folder, None, batch_size, file_list_txt)
        self._mask_img = ScanWrapper(mask_img)
        self._masked_ref = ScanWrapperWithMask(
            self._in_data_folder.get_file_path(0), self._mask_img.get_path())

    def save_flat_data(self, data_array, idx, out_folder):
        out_path = os.path.join(out_folder, f'pc_{idx}.nii.gz')

        self._masked_ref.save_scan_flat_img(data_array, out_path)

    def _run_single_scan(self, idx):
        in_data = ScanWrapperWithMask(self._in_data_folder.get_file_path(idx),
                                      self._mask_img.get_path())

        self._data_matrix[self._cur_idx, :] = in_data.get_data_flat()

        self._cur_idx += 1

    def _get_number_of_voxel(self):
        return self._masked_ref.get_data_flat().shape[0]
Пример #30
0
def get_average_map(file_list, save_path):
    first_img = ScanWrapper(file_list[0])
    im_shape = first_img.get_shape()
    sum_map = np.zeros(im_shape, dtype=float)

    for idx_image in range(len(file_list)):
        img = ScanWrapper(file_list[idx_image])
        img_data = img.get_data()
        print(f'Adding {file_list[idx_image]} ({idx_image} / {len(file_list)})')
        print(f'Max intensity {np.max(img_data)}')
        sum_map += img_data

    average_map = sum_map / float(len(file_list))
    print(f'Average map max int {np.max(average_map)}')
    first_img.save_scan_same_space(save_path, average_map)