Exemplo n.º 1
0
    def single_sino(sino: np.ndarray,
                    cor: ScalarCoR,
                    proj_angles: ProjectionAngles,
                    recon_params: ReconstructionParameters,
                    progress: Optional[Progress] = None) -> np.ndarray:
        assert sino.ndim == 2, "Sinogram must be a 2D image"

        sino = BaseRecon.prepare_sinogram(sino, recon_params)
        image_width = sino.shape[1]

        if astra_mutex.locked():
            LOG.warning("Astra recon already in progress. Waiting")
        with astra_mutex:
            vectors = vec_geom_init2d(proj_angles, 1.0,
                                      cor.to_vec(image_width).value)
            vol_geom = astra.create_vol_geom((image_width, image_width))
            proj_geom = astra.create_proj_geom('parallel_vec', image_width,
                                               vectors)
            cfg = astra.astra_dict(recon_params.algorithm)
            cfg['FilterType'] = recon_params.filter_name

            with _managed_recon(sino, cfg, proj_geom,
                                vol_geom) as (alg_id, rec_id):
                astra.algorithm.run(alg_id, iterations=recon_params.num_iter)
                return astra.data2d.get(rec_id)
Exemplo n.º 2
0
    def single_sino(sino: np.ndarray, cor: ScalarCoR,
                    proj_angles: ProjectionAngles,
                    recon_params: ReconstructionParameters) -> np.ndarray:
        assert sino.ndim == 2, "Sinogram must be a 2D image"

        sino = BaseRecon.sino_recon_prep(sino)
        image_width = sino.shape[1]
        vectors = vec_geom_init2d(proj_angles, 1.0,
                                  cor.to_vec(image_width).value)
        vol_geom = astra.create_vol_geom((image_width, image_width))
        proj_geom = astra.create_proj_geom('parallel_vec', image_width,
                                           vectors)
        cfg = astra.astra_dict(recon_params.algorithm)
        cfg['FilterType'] = recon_params.filter_name
        with _managed_recon(sino, cfg, proj_geom,
                            vol_geom) as (alg_id, rec_id):
            astra.algorithm.run(alg_id, iterations=recon_params.num_iter)
            return astra.data2d.get(rec_id)
Exemplo n.º 3
0
    def single_sino(sino: np.ndarray, cor: ScalarCoR,
                    proj_angles: ProjectionAngles,
                    recon_params: ReconstructionParameters) -> np.ndarray:
        assert sino.ndim == 2, "Sinogram must be a 2D image"
        assert sino.shape[0] == len(
            proj_angles.value), f"Number of projection angles {len(proj_angles.value)} does not equal" \
                                f" the number of projections {sino.shape[0]}. This can happen if loading subset of" \
                                f" projections, and using projection angles from a log file."

        image_width = sino.shape[1]
        vectors = vec_geom_init2d(proj_angles, 1.0,
                                  cor.to_vec(image_width).value)
        vol_geom = astra.create_vol_geom((image_width, image_width))
        proj_geom = astra.create_proj_geom('parallel_vec', image_width,
                                           vectors)
        cfg = astra.astra_dict(recon_params.algorithm)
        cfg['FilterType'] = recon_params.filter_name
        with _managed_recon(sino, cfg, proj_geom,
                            vol_geom) as (alg_id, rec_id):
            astra.algorithm.run(alg_id, iterations=recon_params.num_iter)
            return astra.data2d.get(rec_id)