From c429a141b2d6180fb0f0b7be131156ad3f5dcdf4 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Mon, 12 Sep 2022 17:04:23 -0600 Subject: [PATCH 01/30] Fix docs math for isotropic TV --- examples/scripts/ct_astra_tv_admm.py | 2 +- examples/scripts/ct_astra_weighted_tv_admm.py | 8 ++++---- examples/scripts/deconv_circ_tv_admm.py | 2 +- examples/scripts/deconv_tv_admm.py | 2 +- examples/scripts/denoise_l1tv_admm.py | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/scripts/ct_astra_tv_admm.py b/examples/scripts/ct_astra_tv_admm.py index 28b10d35f..6f4b0aeaa 100644 --- a/examples/scripts/ct_astra_tv_admm.py +++ b/examples/scripts/ct_astra_tv_admm.py @@ -14,7 +14,7 @@ variation (TV) regularization $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} - \|_2^2 + \lambda \| C \mathbf{x} \|_1 \;,$$ + \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ where $A$ is the Radon transform, $\mathbf{y}$ is the sinogram, $C$ is a 2D finite difference operator, and $\mathbf{x}$ is the desired diff --git a/examples/scripts/ct_astra_weighted_tv_admm.py b/examples/scripts/ct_astra_weighted_tv_admm.py index aa3adc658..cad15bf7e 100644 --- a/examples/scripts/ct_astra_weighted_tv_admm.py +++ b/examples/scripts/ct_astra_weighted_tv_admm.py @@ -14,10 +14,10 @@ variation (TV) regularization $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} - \|_W^2 + \lambda \| C \mathbf{x} \|_1 \;,$$ + \|_W^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ where $A$ is the Radon transform, $\mathbf{y}$ is the sinogram, $C$ is -a 2D Finite Difference operator, and $\mathbf{x}$ is the desired +a 2D finite difference operator, and $\mathbf{x}$ is the desired image. The weighted norm is an approximation to the Poisson negative log @@ -98,7 +98,7 @@ def postprocess(x): Set up and solve the un-weighted reconstruction problem $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} - \|_2^2 + \lambda \| C \mathbf{x} \|_1.$$ + \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} \;.$$ """ # Note that rho and lambda were selected via a parameter sweep (not # shown here). @@ -130,7 +130,7 @@ def postprocess(x): Set up and solve the weighted reconstruction problem $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} - \|_W^2 + \lambda \| C \mathbf{x} \|_1 \;,$$ + \|_W^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ where diff --git a/examples/scripts/deconv_circ_tv_admm.py b/examples/scripts/deconv_circ_tv_admm.py index 61ad39d70..8a5c8a596 100644 --- a/examples/scripts/deconv_circ_tv_admm.py +++ b/examples/scripts/deconv_circ_tv_admm.py @@ -14,7 +14,7 @@ regularization $$\mathrm{argmin}_{\mathbf{x}} \; \| \mathbf{y} - A \mathbf{x} \|_2^2 - + \lambda \| C \mathbf{x} \|_1 \;,$$ + + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ where $A$ is Toeplitz matrix, $\mathbf{y}$ is the blurred image, $C$ is a 2D Finite Difference operator, and $\mathbf{x}$ is the desired diff --git a/examples/scripts/deconv_tv_admm.py b/examples/scripts/deconv_tv_admm.py index c60889c15..13eef5d50 100644 --- a/examples/scripts/deconv_tv_admm.py +++ b/examples/scripts/deconv_tv_admm.py @@ -14,7 +14,7 @@ regularization $$\mathrm{argmin}_{\mathbf{x}} \; \| \mathbf{y} - A \mathbf{x} \|_2^2 - + \lambda \| C \mathbf{x} \|_1 \;,$$ + + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ where $A$ is Toeplitz matrix, $\mathbf{y}$ is the blurred image, $C$ is a 2D Finite Difference operator, and $\mathbf{x}$ is the desired diff --git a/examples/scripts/denoise_l1tv_admm.py b/examples/scripts/denoise_l1tv_admm.py index d73309eb2..c1d09a2e3 100644 --- a/examples/scripts/denoise_l1tv_admm.py +++ b/examples/scripts/denoise_l1tv_admm.py @@ -14,7 +14,7 @@ minimizing the functional $$\mathrm{argmin}_{\mathbf{x}} \; \| \mathbf{y} - \mathbf{x} - \|_1 + \lambda \| C \mathbf{x} \|_1 \;,$$ + \|_1 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ where $\mathbf{y}$ is the noisy image, $C$ is a 2D finite difference operator, and $\mathbf{x}$ is the denoised image. From 22e822b3df4512e0a168521b8e14ad969c4b9fdd Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Mon, 12 Sep 2022 17:14:58 -0600 Subject: [PATCH 02/30] Correct docs on isotropic/anisotripic --- examples/scripts/ct_astra_tv_admm.py | 2 +- examples/scripts/ct_astra_weighted_tv_admm.py | 2 +- examples/scripts/deconv_tv_admm.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/scripts/ct_astra_tv_admm.py b/examples/scripts/ct_astra_tv_admm.py index 6f4b0aeaa..25a7fb55b 100644 --- a/examples/scripts/ct_astra_tv_admm.py +++ b/examples/scripts/ct_astra_tv_admm.py @@ -10,7 +10,7 @@ This example demonstrates the use of class [admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve a few-view CT reconstruction problem with anisotropic total +solve a few-view CT reconstruction problem with isotropic total variation (TV) regularization $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} diff --git a/examples/scripts/ct_astra_weighted_tv_admm.py b/examples/scripts/ct_astra_weighted_tv_admm.py index cad15bf7e..8b77a4bb2 100644 --- a/examples/scripts/ct_astra_weighted_tv_admm.py +++ b/examples/scripts/ct_astra_weighted_tv_admm.py @@ -10,7 +10,7 @@ This example demonstrates the use of class [admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve a low-dose CT reconstruction problem with anisotropic total +solve a low-dose CT reconstruction problem with isotropic total variation (TV) regularization $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} diff --git a/examples/scripts/deconv_tv_admm.py b/examples/scripts/deconv_tv_admm.py index 13eef5d50..81bd7aa80 100644 --- a/examples/scripts/deconv_tv_admm.py +++ b/examples/scripts/deconv_tv_admm.py @@ -10,7 +10,7 @@ This example demonstrates the use of class [admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to solve -an image deconvolution problem with anisotropic total variation (TV) +an image deconvolution problem with isotropic total variation (TV) regularization $$\mathrm{argmin}_{\mathbf{x}} \; \| \mathbf{y} - A \mathbf{x} \|_2^2 From a93c363185aaa5a799f727d237f2742d4a28305b Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Mon, 12 Sep 2022 17:19:52 -0600 Subject: [PATCH 03/30] Correct example title --- examples/scripts/denoise_tv_admm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/scripts/denoise_tv_admm.py b/examples/scripts/denoise_tv_admm.py index cf6608821..3d9b211a3 100644 --- a/examples/scripts/denoise_tv_admm.py +++ b/examples/scripts/denoise_tv_admm.py @@ -5,7 +5,7 @@ # with the package. r""" -Isotropic Total Variation (ADMM) +Total Variation Denoising (ADMM) ================================ This example compares denoising via isotropic and anisotropic total From e92c0f91336e32903151ee60c273cbd05065f33c Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Mon, 12 Sep 2022 17:36:27 -0600 Subject: [PATCH 04/30] Improve some titles and header descriptions --- examples/scripts/ct_abel_tv_admm.py | 19 ++++++++++++++----- examples/scripts/ct_abel_tv_admm_tune.py | 4 ++-- examples/scripts/ct_svmbir_tv_multi.py | 11 +++++++++-- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/examples/scripts/ct_abel_tv_admm.py b/examples/scripts/ct_abel_tv_admm.py index b8dd4a9a3..7c9f775ab 100644 --- a/examples/scripts/ct_abel_tv_admm.py +++ b/examples/scripts/ct_abel_tv_admm.py @@ -5,13 +5,22 @@ # with the package. r""" -Regularized Abel Inversion -========================== +TV Regularized Abel Inversion +============================= -This example demonstrates a TV-regularized Abel inversion using -an Abel projector based on PyAbel :cite:`pyabel-2022` +This example demonstrates a TV-regularized Abel inversion by solving the +problem + + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} + \|_2^2 + \lambda \| C \mathbf{x} \|_1\;,$$ + +where $A$ is the Abel projector (with an implementation based on a +projector from PyAbel :cite:`pyabel-2022`), $\mathbf{y}$ is the measured +data, $C$ is a 2D finite difference operator, and $\mathbf{x}$ is the +desired image. """ + import numpy as np import scico.numpy as snp @@ -29,7 +38,7 @@ """ -Set up the forward operator and create a test measurement +Set up the forward operator and create a test measurement. """ A = AbelProjector(x_gt.shape) y = A @ x_gt diff --git a/examples/scripts/ct_abel_tv_admm_tune.py b/examples/scripts/ct_abel_tv_admm_tune.py index fc7eb7d84..bef1f7140 100644 --- a/examples/scripts/ct_abel_tv_admm_tune.py +++ b/examples/scripts/ct_abel_tv_admm_tune.py @@ -5,8 +5,8 @@ # with the package. r""" -Regularized Abel Inversion Tuning Demo -====================================== +TV Regularized Abel Inversion Tuning Demo +========================================= This example demonstrates the use of [scico.ray.tune](../_autosummary/scico.ray.tune.rst) to tune diff --git a/examples/scripts/ct_svmbir_tv_multi.py b/examples/scripts/ct_svmbir_tv_multi.py index 7af299dd9..4758bbc7f 100644 --- a/examples/scripts/ct_svmbir_tv_multi.py +++ b/examples/scripts/ct_svmbir_tv_multi.py @@ -9,8 +9,15 @@ ======================================== This example demonstrates the use of different optimization algorithms to -solve the TV-regularized CT problem, using SVMBIR :cite:`svmbir-2020` for -tomographic projection. +solve the TV-regularized CT problem + + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} + \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ + +where $A$ is the Radon transform (implemented using the SVMBIR +:cite:`svmbir-2020` tomographic projection), $\mathbf{y}$ is the sinogram, +$C$ is a 2D finite difference operator, and $\mathbf{x}$ is the desired +image. """ import numpy as np From da79467d92f0e71aa0204de7caf1d4d977bad029 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 08:14:43 -0600 Subject: [PATCH 05/30] Minor edit --- examples/scripts/ct_abel_tv_admm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/scripts/ct_abel_tv_admm.py b/examples/scripts/ct_abel_tv_admm.py index 7c9f775ab..ac209fd0c 100644 --- a/examples/scripts/ct_abel_tv_admm.py +++ b/examples/scripts/ct_abel_tv_admm.py @@ -12,7 +12,7 @@ problem $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} - \|_2^2 + \lambda \| C \mathbf{x} \|_1\;,$$ + \|_2^2 + \lambda \| C \mathbf{x} \|_1 \;,$$ where $A$ is the Abel projector (with an implementation based on a projector from PyAbel :cite:`pyabel-2022`), $\mathbf{y}$ is the measured From 1afaecb4df261dae6d0e546ec5cfa452bbdd6b76 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 08:17:13 -0600 Subject: [PATCH 06/30] Rename example --- examples/scripts/{ct_astra_pcg.py => ct_astra_noreg_pcg.py} | 0 examples/scripts/index.rst | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename examples/scripts/{ct_astra_pcg.py => ct_astra_noreg_pcg.py} (100%) diff --git a/examples/scripts/ct_astra_pcg.py b/examples/scripts/ct_astra_noreg_pcg.py similarity index 100% rename from examples/scripts/ct_astra_pcg.py rename to examples/scripts/ct_astra_noreg_pcg.py diff --git a/examples/scripts/index.rst b/examples/scripts/index.rst index eb5130f8f..446d43c06 100644 --- a/examples/scripts/index.rst +++ b/examples/scripts/index.rst @@ -10,7 +10,7 @@ Computed Tomography ^^^^^^^^^^^^^^^^^^^ - ct_abel_tv_admm.py - - ct_astra_pcg.py + - ct_astra_noreg_pcg.py - ct_astra_tv_admm.py - ct_astra_weighted_tv_admm.py - ct_svmbir_ppp_bm3d_admm_cg.py @@ -158,4 +158,4 @@ PGM PCG ^^^ - - ct_astra_pcg.py + - ct_astra_noreg_pcg.py From c288d93ef5ea1cdff8df40e6c438d8dc85504f98 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 08:19:51 -0600 Subject: [PATCH 07/30] Correct example title --- examples/scripts/denoise_cplx_tv_pdhg.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/scripts/denoise_cplx_tv_pdhg.py b/examples/scripts/denoise_cplx_tv_pdhg.py index 121223102..45c0477ff 100644 --- a/examples/scripts/denoise_cplx_tv_pdhg.py +++ b/examples/scripts/denoise_cplx_tv_pdhg.py @@ -5,7 +5,7 @@ # with the package. r""" -Complex Total Variation Denoising (ADMM) +Complex Total Variation Denoising (PDHG) ======================================== This example demonstrates solution of a problem of the form @@ -29,7 +29,6 @@ real and imaginary components of the complex image. """ -import jax from mpl_toolkits.axes_grid1 import make_axes_locatable from xdesign import SiemensStar, discrete_phantom From a464d86e51ec49848c517592154ccda64ae5ddb3 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 09:12:55 -0600 Subject: [PATCH 08/30] Clean up titles and header descriptions --- examples/scripts/ct_astra_noreg_pcg.py | 15 +++++++++++---- examples/scripts/ct_astra_tv_admm.py | 10 ++++------ examples/scripts/ct_astra_weighted_tv_admm.py | 17 +++++++---------- .../scripts/ct_fan_svmbir_ppp_bm3d_admm_prox.py | 17 ++++++++--------- examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py | 15 +++++++-------- .../scripts/ct_svmbir_ppp_bm3d_admm_prox.py | 11 +++++------ examples/scripts/ct_svmbir_tv_multi.py | 4 ++-- 7 files changed, 44 insertions(+), 45 deletions(-) diff --git a/examples/scripts/ct_astra_noreg_pcg.py b/examples/scripts/ct_astra_noreg_pcg.py index e69b92d27..b0b7e2372 100644 --- a/examples/scripts/ct_astra_noreg_pcg.py +++ b/examples/scripts/ct_astra_noreg_pcg.py @@ -5,11 +5,18 @@ # with the package. r""" -CT with Preconditioned Conjugate Gradient -========================================= +CT Reconstruction with CG and PCG +================================= -This example demonstrates the use of preconditioner to efficiently -solve a CT reconstruction problem. +This example demonstrates a simple iterative CT reconstruction using +conjugate gradient (CG) and preconditioned conjugate gradient (PCG) +algorithms to solve the problem + + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} + \|_2^2 \;,$$ + +where $A$ is the Radon transform, $\mathbf{y}$ is the sinogram, and +$\mathbf{x}$ is the reconstructed image. """ from time import time diff --git a/examples/scripts/ct_astra_tv_admm.py b/examples/scripts/ct_astra_tv_admm.py index 25a7fb55b..5efd6e951 100644 --- a/examples/scripts/ct_astra_tv_admm.py +++ b/examples/scripts/ct_astra_tv_admm.py @@ -5,13 +5,11 @@ # with the package. r""" -Few-View CT (ADMM w/ Total Variation) -===================================== +TV Regularized Few-View CT Reconstruction +========================================= -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve a few-view CT reconstruction problem with isotropic total -variation (TV) regularization +This example demonstrates solution of a few-view CT reconstruction problem +with isotropic total variation (TV) regularization $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ diff --git a/examples/scripts/ct_astra_weighted_tv_admm.py b/examples/scripts/ct_astra_weighted_tv_admm.py index 8b77a4bb2..97f0e8f09 100644 --- a/examples/scripts/ct_astra_weighted_tv_admm.py +++ b/examples/scripts/ct_astra_weighted_tv_admm.py @@ -5,23 +5,20 @@ # with the package. r""" -Low-Dose CT (ADMM w/ Total Variation) -===================================== +TV Regularized Low-Dose CT Reconstruction +========================================= -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve a low-dose CT reconstruction problem with isotropic total -variation (TV) regularization +This example demonstrates solution of a low-dose CT reconstruction problem +with isotropic total variation (TV) regularization $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} \|_W^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ -where $A$ is the Radon transform, $\mathbf{y}$ is the sinogram, $C$ is +where $A$ is the Radon transform, $\mathbf{y}$ is the sinogram, the norm +weighting $W$ is chosen so that the weighted norm is an approximation to +the Poisson negative log likelihood :cite:`sauer-1993-local`, $C$ is a 2D finite difference operator, and $\mathbf{x}$ is the desired image. - -The weighted norm is an approximation to the Poisson negative log -likelihood :cite:`sauer-1993-local`. """ import numpy as np diff --git a/examples/scripts/ct_fan_svmbir_ppp_bm3d_admm_prox.py b/examples/scripts/ct_fan_svmbir_ppp_bm3d_admm_prox.py index c11fbf21d..4e71e3f9f 100644 --- a/examples/scripts/ct_fan_svmbir_ppp_bm3d_admm_prox.py +++ b/examples/scripts/ct_fan_svmbir_ppp_bm3d_admm_prox.py @@ -5,17 +5,16 @@ # with the package. """ -Fan-beam CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+Prox) -=========================================================================== - -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve a fan-beam tomographic reconstruction problem using -the Plug-and-Play Priors framework :cite:`venkatakrishnan-2013-plugandplay2`, -using BM3D :cite:`dabov-2008-image` as a denoiser and SVMBIR +PPP (with BM3D) Fan-Beam CT Reconstruction +========================================== + +This example demonstrates solution of a fan-beam tomographic reconstruction +problem using the Plug-and-Play Priors framework +:cite:`venkatakrishnan-2013-plugandplay2`, using BM3D +:cite:`dabov-2008-image` as a denoiser and SVMBIR :cite:`svmbir-2020` for tomographic projection. -This version uses the data fidelity term as one of the ADMM $g$ +This example uses the data fidelity term as one of the ADMM $g$ functionals so that the optimization with respect to the data fidelity is able to exploit the internal prox of the `SVMBIRExtendedLoss` functional. diff --git a/examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py b/examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py index 8a11c09c5..3b9aa5b7e 100644 --- a/examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py +++ b/examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py @@ -5,19 +5,18 @@ # with the package. """ -CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+CG) -================================================================ +PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) +================================================================== -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve a tomographic reconstruction problem using the Plug-and-Play Priors -framework :cite:`venkatakrishnan-2013-plugandplay2`, using BM3D +This example demonstrates solution of a tomographic reconstruction problem +using the Plug-and-Play Priors framework +:cite:`venkatakrishnan-2013-plugandplay2`, using BM3D :cite:`dabov-2008-image` as a denoiser and SVMBIR :cite:`svmbir-2020` for tomographic projection. -This version uses the data fidelity term as the ADMM f, and thus the +This version uses the data fidelity term as the ADMM $f$, and thus the optimization with respect to the data fidelity uses CG rather than the -prox of the SVMBIRSquaredL2Loss functional. +prox of the `SVMBIRSquaredL2Loss` functional. """ import numpy as np diff --git a/examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py b/examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py index 58f00e678..d1cad9514 100644 --- a/examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py +++ b/examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py @@ -5,13 +5,12 @@ # with the package. """ -CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+Prox) -================================================================== +PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) +============================================================== -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve a tomographic reconstruction problem using the Plug-and-Play Priors -framework :cite:`venkatakrishnan-2013-plugandplay2`, using BM3D +This example demonstrates solution of a tomographic reconstruction +problem using the Plug-and-Play Priors framework +:cite:`venkatakrishnan-2013-plugandplay2`, using BM3D :cite:`dabov-2008-image` as a denoiser and SVMBIR :cite:`svmbir-2020` for tomographic projection. diff --git a/examples/scripts/ct_svmbir_tv_multi.py b/examples/scripts/ct_svmbir_tv_multi.py index 4758bbc7f..96d6e1e9d 100644 --- a/examples/scripts/ct_svmbir_tv_multi.py +++ b/examples/scripts/ct_svmbir_tv_multi.py @@ -5,8 +5,8 @@ # with the package. """ -CT Reconstruction with TV Regularization -======================================== +TV Regularized CT Reconstruction (Multiple Algorithms) +====================================================== This example demonstrates the use of different optimization algorithms to solve the TV-regularized CT problem From 16a346d9dc5420bedd20a02a774427629197295f Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 09:14:08 -0600 Subject: [PATCH 09/30] Update example index --- docs/source/examples.rst | 4 +-- examples/scripts/README.rst | 66 ++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/docs/source/examples.rst b/docs/source/examples.rst index 8ff1dd583..a6680e0f2 100644 --- a/docs/source/examples.rst +++ b/docs/source/examples.rst @@ -23,7 +23,7 @@ Computed Tomography :maxdepth: 1 examples/ct_abel_tv_admm - examples/ct_astra_pcg + examples/ct_astra_noreg_pcg examples/ct_astra_tv_admm examples/ct_astra_weighted_tv_admm examples/ct_svmbir_ppp_bm3d_admm_cg @@ -210,4 +210,4 @@ PCG .. toctree:: :maxdepth: 1 - examples/ct_astra_pcg + examples/ct_astra_noreg_pcg diff --git a/examples/scripts/README.rst b/examples/scripts/README.rst index abe55cb6b..f0e3f7106 100644 --- a/examples/scripts/README.rst +++ b/examples/scripts/README.rst @@ -10,21 +10,21 @@ Computed Tomography ^^^^^^^^^^^^^^^^^^^ `ct_abel_tv_admm.py `_ - Regularized Abel Inversion - `ct_astra_pcg.py `_ - CT with Preconditioned Conjugate Gradient + TV Regularized Abel Inversion + `ct_astra_noreg_pcg.py `_ + CT Reconstruction with CG and PCG `ct_astra_tv_admm.py `_ - Few-View CT (ADMM w/ Total Variation) + TV Regularized Few-View CT Reconstruction `ct_astra_weighted_tv_admm.py `_ - Low-Dose CT (ADMM w/ Total Variation) + TV Regularized Low-Dose CT Reconstruction `ct_svmbir_ppp_bm3d_admm_cg.py `_ - CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+CG) + PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) `ct_svmbir_ppp_bm3d_admm_prox.py `_ - CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+Prox) + PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ - Fan-beam CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+Prox) + PPP (with BM3D) Fan-Beam CT Reconstruction `ct_svmbir_tv_multi.py `_ - CT Reconstruction with TV Regularization + TV Regularized CT Reconstruction (Multiple Algorithms) Deconvolution @@ -67,11 +67,11 @@ Miscellaneous `demosaic_ppp_bm3d_admm.py `_ Image Demosaicing (ADMM Plug-and-Play Priors w/ BM3D) `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising (ADMM) + Complex Total Variation Denoising (PDHG) `denoise_l1tv_admm.py `_ ℓ1 Total Variation (ADMM) `denoise_tv_admm.py `_ - Isotropic Total Variation (ADMM) + Total Variation Denoising (ADMM) `denoise_tv_pgm.py `_ Isotropic Total Variation (Accelerated PGM) `denoise_tv_multi.py `_ @@ -90,11 +90,11 @@ Plug and Play Priors ^^^^^^^^^^^^^^^^^^^^ `ct_svmbir_ppp_bm3d_admm_cg.py `_ - CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+CG) + PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) `ct_svmbir_ppp_bm3d_admm_prox.py `_ - CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+Prox) + PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ - Fan-beam CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+Prox) + PPP (with BM3D) Fan-Beam CT Reconstruction `deconv_ppp_bm3d_admm.py `_ Image Deconvolution (ADMM Plug-and-Play Priors w/ BM3D) `deconv_ppp_bm3d_pgm.py `_ @@ -113,13 +113,13 @@ Total Variation ^^^^^^^^^^^^^^^ `ct_abel_tv_admm.py `_ - Regularized Abel Inversion + TV Regularized Abel Inversion `ct_astra_tv_admm.py `_ - Few-View CT (ADMM w/ Total Variation) + TV Regularized Few-View CT Reconstruction `ct_astra_weighted_tv_admm.py `_ - Low-Dose CT (ADMM w/ Total Variation) + TV Regularized Low-Dose CT Reconstruction `ct_svmbir_tv_multi.py `_ - CT Reconstruction with TV Regularization + TV Regularized CT Reconstruction (Multiple Algorithms) `deconv_circ_tv_admm.py `_ Image Deconvolution (ADMM w/ Total Variation and Circulant Blur) `deconv_microscopy_tv_admm.py `_ @@ -131,11 +131,11 @@ Total Variation `deconv_tv_admm_tune.py `_ Image Deconvolution Parameter Tuning `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising (ADMM) + Complex Total Variation Denoising (PDHG) `denoise_l1tv_admm.py `_ ℓ1 Total Variation (ADMM) `denoise_tv_admm.py `_ - Isotropic Total Variation (ADMM) + Total Variation Denoising (ADMM) `denoise_tv_pgm.py `_ Isotropic Total Variation (Accelerated PGM) `denoise_tv_multi.py `_ @@ -163,19 +163,19 @@ ADMM ^^^^ `ct_abel_tv_admm.py `_ - Regularized Abel Inversion + TV Regularized Abel Inversion `ct_astra_tv_admm.py `_ - Few-View CT (ADMM w/ Total Variation) + TV Regularized Few-View CT Reconstruction `ct_astra_weighted_tv_admm.py `_ - Low-Dose CT (ADMM w/ Total Variation) + TV Regularized Low-Dose CT Reconstruction `ct_svmbir_ppp_bm3d_admm_cg.py `_ - CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+CG) + PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) `ct_svmbir_ppp_bm3d_admm_prox.py `_ - CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+Prox) + PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ - Fan-beam CT Reconstruction (ADMM Plug-and-Play Priors w/ BM3D, SVMBIR+Prox) + PPP (with BM3D) Fan-Beam CT Reconstruction `ct_svmbir_tv_multi.py `_ - CT Reconstruction with TV Regularization + TV Regularized CT Reconstruction (Multiple Algorithms) `deconv_circ_tv_admm.py `_ Image Deconvolution (ADMM w/ Total Variation and Circulant Blur) `deconv_microscopy_tv_admm.py `_ @@ -197,7 +197,7 @@ ADMM `denoise_l1tv_admm.py `_ ℓ1 Total Variation (ADMM) `denoise_tv_admm.py `_ - Isotropic Total Variation (ADMM) + Total Variation Denoising (ADMM) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising `sparsecode_admm.py `_ @@ -212,7 +212,7 @@ Linearized ADMM ^^^^^^^^^^^^^^^ `ct_svmbir_tv_multi.py `_ - CT Reconstruction with TV Regularization + TV Regularized CT Reconstruction (Multiple Algorithms) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising @@ -221,9 +221,9 @@ PDHG ^^^^ `ct_svmbir_tv_multi.py `_ - CT Reconstruction with TV Regularization + TV Regularized CT Reconstruction (Multiple Algorithms) `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising (ADMM) + Complex Total Variation Denoising (PDHG) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising @@ -244,5 +244,5 @@ PGM PCG ^^^ - `ct_astra_pcg.py `_ - CT with Preconditioned Conjugate Gradient + `ct_astra_noreg_pcg.py `_ + CT Reconstruction with CG and PCG From 9a9c0538b586184afffebbcec90c44f9e4e53dbd Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 09:41:19 -0600 Subject: [PATCH 10/30] Move significant functions to a separate module --- examples/jnb.py | 104 ++++++++++++++++++++++++++++++++++++++ examples/makenotebooks.py | 92 --------------------------------- 2 files changed, 104 insertions(+), 92 deletions(-) create mode 100644 examples/jnb.py diff --git a/examples/jnb.py b/examples/jnb.py new file mode 100644 index 000000000..8f90a1f13 --- /dev/null +++ b/examples/jnb.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2022 by SCICO Developers +# All rights reserved. BSD 3-clause License. +# This file is part of the SCICO package. Details of the copyright and +# user license can be found in the 'LICENSE' file distributed with the +# package. + +"""Support functions for manipulating Jupyter notebooks.""" + + +import re +from timeit import default_timer as timer + +import nbformat +from nbconvert.preprocessors import CellExecutionError, ExecutePreprocessor +from py2jn.tools import py_string_to_notebook, write_notebook + + +def py_file_to_string(src): + """Preprocess example script file and return result as a string.""" + + with open(src, "r") as srcfile: + # Drop header comment + for line in srcfile: + if line[0] != "#": + break # assume first non-comment line is a newline that can be dropped + # Insert notebook plot config after last import + lines = [] + import_seen = False + for line in srcfile: + line = re.sub('^r"""', '"""', line) # remove r from r""" + line = re.sub(":cite:`([^`]+)`", r'', line) # fix cite format + if import_seen: + # Once an import statement has been seen, break on encountering a line that + # is neither an import statement nor a newline, nor a component of an import + # statement extended over multiple lines, nor an os.environ statement, nor + # components of a try/except construction (note that handling of these final + # two cases is probably not very robust). + if not re.match( + r"(^import|^from|^\n$|^\W+[^\W]|^\)$|^os.environ|^try:$|^except)", line + ): + lines.append(line) + break + else: + # Set flag indicating that an import statement has been seen once one has + # been encountered + if re.match("^(import|from)", line): + import_seen = True + lines.append(line) + # Backtrack through list of lines to find last import statement + n = 1 + for line in lines[-2::-1]: + if re.match("^(import|from)", line): + break + else: + n += 1 + # Insert notebook plotting config directly after last import statement + lines.insert(-n, "plot.config_notebook_plotting()\n") + + # Process remainder of source file + for line in srcfile: + if re.match("^input", line): # end processing when input statement encountered + break + line = re.sub('^r"""', '"""', line) # remove r from r""" + line = re.sub(":cite:\`([^`]+)\`", r'', line) # fix cite format + lines.append(line) + + # Backtrack through list of lines to remove trailing newlines + n = 0 + for line in lines[::-1]: + if re.match("^\n$", line): + n += 1 + else: + break + lines = lines[0:-n] + + return "".join(lines) + + +def script_to_notebook(src, dst): + """Convert a Python example script into a Jupyter notebook.""" + + s = py_file_to_string(src) + nb = py_string_to_notebook(s) + write_notebook(nb, dst) + + +def execute_notebook(fname): + """Execute the specified notebook file.""" + + with open(fname) as f: + nb = nbformat.read(f, as_version=4) + ep = ExecutePreprocessor() + try: + t0 = timer() + out = ep.preprocess(nb) + t1 = timer() + with open(fname, "w", encoding="utf-8") as f: + nbformat.write(nb, f) + except CellExecutionError: + print(f"ERROR executing {fname}") + return False + print(f"{fname} done in {(t1 - t0):.1e} s") + return True diff --git a/examples/makenotebooks.py b/examples/makenotebooks.py index e7d8849bd..65edee145 100755 --- a/examples/makenotebooks.py +++ b/examples/makenotebooks.py @@ -14,12 +14,8 @@ import signal import sys from pathlib import Path -from timeit import default_timer as timer -import nbformat import psutil -from nbconvert.preprocessors import CellExecutionError, ExecutePreprocessor -from py2jn.tools import py_string_to_notebook, write_notebook examples_dir = Path(__file__).resolve().parent # absolute path to ../scico/examples/ @@ -30,94 +26,6 @@ have_ray = False -def py_file_to_string(src): - """Preprocess example script file and return result as a string.""" - - with open(src, "r") as srcfile: - # Drop header comment - for line in srcfile: - if line[0] != "#": - break # assume first non-comment line is a newline that can be dropped - # Insert notebook plot config after last import - lines = [] - import_seen = False - for line in srcfile: - line = re.sub('^r"""', '"""', line) # remove r from r""" - line = re.sub(":cite:`([^`]+)`", r'', line) # fix cite format - if import_seen: - # Once an import statement has been seen, break on encountering a line that - # is neither an import statement nor a newline, nor a component of an import - # statement extended over multiple lines, nor an os.environ statement, nor - # components of a try/except construction (note that handling of these final - # two cases is probably not very robust). - if not re.match( - r"(^import|^from|^\n$|^\W+[^\W]|^\)$|^os.environ|^try:$|^except)", line - ): - lines.append(line) - break - else: - # Set flag indicating that an import statement has been seen once one has - # been encountered - if re.match("^(import|from)", line): - import_seen = True - lines.append(line) - # Backtrack through list of lines to find last import statement - n = 1 - for line in lines[-2::-1]: - if re.match("^(import|from)", line): - break - else: - n += 1 - # Insert notebook plotting config directly after last import statement - lines.insert(-n, "plot.config_notebook_plotting()\n") - - # Process remainder of source file - for line in srcfile: - if re.match("^input", line): # end processing when input statement encountered - break - line = re.sub('^r"""', '"""', line) # remove r from r""" - line = re.sub(":cite:\`([^`]+)\`", r'', line) # fix cite format - lines.append(line) - - # Backtrack through list of lines to remove trailing newlines - n = 0 - for line in lines[::-1]: - if re.match("^\n$", line): - n += 1 - else: - break - lines = lines[0:-n] - - return "".join(lines) - - -def script_to_notebook(src, dst): - """Convert a Python example script into a Jupyter notebook.""" - - s = py_file_to_string(src) - nb = py_string_to_notebook(s) - write_notebook(nb, dst) - - -def execute_notebook(fname): - """Execute the specified notebook file.""" - - with open(fname) as f: - nb = nbformat.read(f, as_version=4) - ep = ExecutePreprocessor() - try: - t0 = timer() - out = ep.preprocess(nb) - t1 = timer() - with open(fname, "w", encoding="utf-8") as f: - nbformat.write(nb, f) - except CellExecutionError: - print(f"ERROR executing {fname}") - return False - print(f"{fname} done in {(t1 - t0):.1e} s") - return True - - def script_uses_ray(fname): """Determine whether a script uses ray.""" From e55c014d23f8f0abdd38f57995873d735d3cc5bf Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 09:44:18 -0600 Subject: [PATCH 11/30] Fix imports --- examples/makenotebooks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/makenotebooks.py b/examples/makenotebooks.py index 65edee145..31e52d7d5 100755 --- a/examples/makenotebooks.py +++ b/examples/makenotebooks.py @@ -16,6 +16,7 @@ from pathlib import Path import psutil +from jnb import execute_notebook, script_to_notebook examples_dir = Path(__file__).resolve().parent # absolute path to ../scico/examples/ From c2d99d0299f8048873d8eca857ec5332e0c915e3 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 11:30:30 -0600 Subject: [PATCH 12/30] Add script to update notebook markdown without re-run --- examples/jnb.py | 119 ++++++++++++++++++++++++++++++++++++++++ examples/updatejnbmd.py | 33 +++++++++++ 2 files changed, 152 insertions(+) create mode 100755 examples/updatejnbmd.py diff --git a/examples/jnb.py b/examples/jnb.py index 8f90a1f13..26629fd93 100644 --- a/examples/jnb.py +++ b/examples/jnb.py @@ -85,6 +85,16 @@ def script_to_notebook(src, dst): write_notebook(nb, dst) +def read_notebook(fname): + """Read a notebook from the specified notebook file.""" + + try: + nb = nbformat.read(fname, as_version=4) + except (AttributeError, nbformat.reader.NotJSONError): + raise RuntimeError("Error reading notebook file %s." % fname) + return nb + + def execute_notebook(fname): """Execute the specified notebook file.""" @@ -102,3 +112,112 @@ def execute_notebook(fname): return False print(f"{fname} done in {(t1 - t0):.1e} s") return True + + +def notebook_executed(nbfn): + """Determine whether the notebook at `nbfn` has been executed.""" + + try: + nb = nbformat.read(nbfn, as_version=4) + except (AttributeError, nbformat.reader.NotJSONError): + raise RuntimeError("Error reading notebook file %s." % pth) + cells = nb["worksheets"][0]["cells"] + for n in range(len(nb["cells"])): + if cells[n].cell_type == "code" and cells[n].execution_count is None: + return False + return True + + +def same_notebook_code(nb1, nb2): + """Return ``True`` if the code cells of notebook objects `nb1` and `nb2` + are all the same. + """ + + if "cells" in nb1: + nb1c = nb1["cells"] + else: + nb1c = nb1["worksheets"][0]["cells"] + if "cells" in nb2: + nb2c = nb2["cells"] + else: + nb2c = nb2["worksheets"][0]["cells"] + + # Notebooks do not match if the number of cells differ + if len(nb1c) != len(nb2c): + return False + + # Iterate over cells in nb1 + for n in range(len(nb1c)): + # Notebooks do not match if corresponding cells have different + # types + if nb1c[n]["cell_type"] != nb2c[n]["cell_type"]: + return False + # Notebooks do not match if source of corresponding code cells + # differ + if nb1c[n]["cell_type"] == "code" and nb1c[n]["source"] != nb2c[n]["source"]: + return False + + return True + + +def same_notebook_markdown(nb1, nb2): + """Return ``True`` if the markdown cells of notebook objects `nb1` + and `nb2` are all the same. + """ + + if "cells" in nb1: + nb1c = nb1["cells"] + else: + nb1c = nb1["worksheets"][0]["cells"] + if "cells" in nb2: + nb2c = nb2["cells"] + else: + nb2c = nb2["worksheets"][0]["cells"] + + # Notebooks do not match if the number of cells differ + if len(nb1c) != len(nb2c): + return False + + # Iterate over cells in nb1 + for n in range(len(nb1c)): + # Notebooks do not match if corresponding cells have different + # types + if nb1c[n]["cell_type"] != nb2c[n]["cell_type"]: + return False + # Notebooks do not match if source of corresponding code cells + # differ + if nb1c[n]["cell_type"] == "markdown" and nb1c[n]["source"] != nb2c[n]["source"]: + return False + + return True + + +def replace_markdown_cells(src, dst): + """Overwrite markdown cells in notebook object `dst` with corresponding + cells in notebook object `src`. + """ + + if "cells" in src: + srccell = src["cells"] + else: + srccell = src["worksheets"][0]["cells"] + if "cells" in dst: + dstcell = dst["cells"] + else: + dstcell = dst["worksheets"][0]["cells"] + + # It is an error to attempt markdown replacement if src and dst + # have different numbers of cells + if len(srccell) != len(dstcell): + raise ValueError("Notebooks do not have the same number of cells.") + + # Iterate over cells in src + for n in range(len(srccell)): + # It is an error to attempt markdown replacement if any + # corresponding pair of cells have different type + if srccell[n]["cell_type"] != dstcell[n]["cell_type"]: + raise ValueError("Cell number %d of different type in src and dst.") + # If current src cell is a markdown cell, copy the src cell to + # the dst cell + if srccell[n]["cell_type"] == "markdown": + dstcell[n]["source"] = srccell[n]["source"] diff --git a/examples/updatejnbmd.py b/examples/updatejnbmd.py new file mode 100755 index 000000000..181e23fe9 --- /dev/null +++ b/examples/updatejnbmd.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# Update markdown cells in notebooks from corresponding scripts without +# the need to re-execute the notebook. Only applicable if the changes to +# the script since generation of the corresponding notebook only affect +# markdown cells. +# Run as +# python updatejnbmd.py + +import glob +import os + +from jnb import ( + py_file_to_string, + read_notebook, + replace_markdown_cells, + same_notebook_code, + same_notebook_markdown, +) +from py2jn.tools import py_string_to_notebook, write_notebook + +for src in glob.glob(os.path.join("scripts", "*.py")): + dst = os.path.join("notebooks", os.path.splitext(os.path.basename(src))[0] + ".ipynb") + if os.path.exists(dst): + srcnb = py_string_to_notebook(py_file_to_string(src), nbver=4) + dstnb = read_notebook(dst) + if not same_notebook_code(srcnb, dstnb): + print(f"Non-markup changes in {src}") + continue + if not same_notebook_markdown(srcnb, dstnb): + print(f"Updating markdown in {dst}") + replace_markdown_cells(srcnb, dstnb) + write_notebook(dstnb, dst) From 86d53b33182632e06c08f99f7e4a3e813a032fea Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 11:33:35 -0600 Subject: [PATCH 13/30] Update readme --- examples/README.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/README.rst b/examples/README.rst index 071842d9a..7e7d68882 100644 --- a/examples/README.rst +++ b/examples/README.rst @@ -108,6 +108,9 @@ A number of files in this directory assist in the mangement of the usage example `makenotebooks.py `_ Auto-generate Jupyter notebooks from the example scripts. +`updatejnbmd.py `_ + Update markdown cells in notebooks from corresponding example scripts. + `makeindex.py `_ Auto-generate the docs example index ``docs/source/examples.rst`` from the example scripts index ``scripts/index.rst``. From b37095549e396c027c41f40b521fd810412c7e1d Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 11:52:25 -0600 Subject: [PATCH 14/30] Avoid duplicate label warnings --- docs/source/conf.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index bb687613f..401533984 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -172,7 +172,17 @@ def patched_parse(self): # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ["tmp", "*.tmp.*", "*.tmp", "index.ipynb", "exampledepend.rst"] +exclude_patterns = [ + "tmp", + "*.tmp.*", + "*.tmp", + "index.ipynb", + "exampledepend.rst", + "blockarray.rst", + "operator.rst", + "functional.rst", + "optimizer.rst", +] # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = False From 560cff7b3b41680b819201b1626bfaccf3d5cebd Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 12:30:38 -0600 Subject: [PATCH 15/30] Re-arrange examples in index --- examples/scripts/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/scripts/index.rst b/examples/scripts/index.rst index 446d43c06..2cdb1f4ee 100644 --- a/examples/scripts/index.rst +++ b/examples/scripts/index.rst @@ -23,14 +23,14 @@ Deconvolution ^^^^^^^^^^^^^ - deconv_circ_tv_admm.py + - deconv_tv_admm.py + - deconv_tv_admm_tune.py - deconv_microscopy_tv_admm.py - deconv_microscopy_allchn_tv_admm.py - deconv_ppp_bm3d_admm.py - deconv_ppp_bm3d_pgm.py - deconv_ppp_bm4d_admm.py - deconv_ppp_dncnn_admm.py - - deconv_tv_admm.py - - deconv_tv_admm_tune.py Sparse Coding From 32858dd80f75fa011e4613023e399e1d7fee0ab3 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 12:30:55 -0600 Subject: [PATCH 16/30] Clean up titles and header descriptions --- examples/scripts/README.rst | 60 +++++++++---------- examples/scripts/deconv_circ_tv_admm.py | 20 +++---- .../deconv_microscopy_allchn_tv_admm.py | 2 +- examples/scripts/deconv_microscopy_tv_admm.py | 2 +- examples/scripts/deconv_ppp_bm3d_admm.py | 15 +++-- examples/scripts/deconv_ppp_bm3d_pgm.py | 16 +++-- examples/scripts/deconv_ppp_bm4d_admm.py | 19 +++--- examples/scripts/deconv_ppp_dncnn_admm.py | 15 +++-- examples/scripts/deconv_tv_admm.py | 20 +++---- examples/scripts/demosaic_ppp_bm3d_admm.py | 11 ++-- examples/scripts/denoise_l1tv_admm.py | 4 +- examples/scripts/denoise_tv_pgm.py | 14 ++--- examples/scripts/sparsecode_admm.py | 11 ++-- examples/scripts/sparsecode_pgm.py | 12 ++-- examples/scripts/sparsecode_poisson_pgm.py | 6 +- examples/scripts/superres_ppp_dncnn_admm.py | 9 +-- examples/scripts/video_rpca_admm.py | 4 +- 17 files changed, 113 insertions(+), 127 deletions(-) diff --git a/examples/scripts/README.rst b/examples/scripts/README.rst index f0e3f7106..84593fd95 100644 --- a/examples/scripts/README.rst +++ b/examples/scripts/README.rst @@ -31,34 +31,34 @@ Deconvolution ^^^^^^^^^^^^^ `deconv_circ_tv_admm.py `_ - Image Deconvolution (ADMM w/ Total Variation and Circulant Blur) + Circulant Blur Image Deconvolution with TV Regularization + `deconv_tv_admm.py `_ + Image Deconvolution with TV Regularization + `deconv_tv_admm_tune.py `_ + Image Deconvolution Parameter Tuning `deconv_microscopy_tv_admm.py `_ Deconvolution Microscopy (Single Channel) `deconv_microscopy_allchn_tv_admm.py `_ Deconvolution Microscopy (All Channels) `deconv_ppp_bm3d_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Deconvolution (ADMM Solver) `deconv_ppp_bm3d_pgm.py `_ - Image Deconvolution (PGM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Deconvolution (APGM Solver) `deconv_ppp_bm4d_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ BM4D) + PPP (with BM4D) Volume Deconvolution (ADMM Solver) `deconv_ppp_dncnn_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ DnCNN) - `deconv_tv_admm.py `_ - Image Deconvolution (ADMM w/ Total Variation) - `deconv_tv_admm_tune.py `_ - Image Deconvolution Parameter Tuning + PPP (with DnCNN) Image Deconvolution (ADMM Solver) Sparse Coding ^^^^^^^^^^^^^ `sparsecode_admm.py `_ - Non-negative Basis Pursuit DeNoising (ADMM) + Non-Negative Basis Pursuit DeNoising (ADMM) `sparsecode_pgm.py `_ - Basis Pursuit DeNoising (Accelerated PGM) + Basis Pursuit DeNoising (APGM) `sparsecode_poisson_pgm.py `_ - Non-negative Poisson Loss Reconstruction (APGM w/ adaptive PGMStepSize) + Non-negative Poisson Loss Reconstruction (APGM) Miscellaneous @@ -96,13 +96,13 @@ Plug and Play Priors `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ PPP (with BM3D) Fan-Beam CT Reconstruction `deconv_ppp_bm3d_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Deconvolution (ADMM Solver) `deconv_ppp_bm3d_pgm.py `_ - Image Deconvolution (PGM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Deconvolution (APGM Solver) `deconv_ppp_bm4d_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ BM4D) + PPP (with BM4D) Volume Deconvolution (ADMM Solver) `deconv_ppp_dncnn_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ DnCNN) + PPP (with DnCNN) Image Deconvolution (ADMM Solver) `demosaic_ppp_bm3d_admm.py `_ Image Demosaicing (ADMM Plug-and-Play Priors w/ BM3D) `superres_ppp_dncnn_admm.py `_ @@ -121,13 +121,13 @@ Total Variation `ct_svmbir_tv_multi.py `_ TV Regularized CT Reconstruction (Multiple Algorithms) `deconv_circ_tv_admm.py `_ - Image Deconvolution (ADMM w/ Total Variation and Circulant Blur) + Circulant Blur Image Deconvolution with TV Regularization `deconv_microscopy_tv_admm.py `_ Deconvolution Microscopy (Single Channel) `deconv_microscopy_allchn_tv_admm.py `_ Deconvolution Microscopy (All Channels) `deconv_tv_admm.py `_ - Image Deconvolution (ADMM w/ Total Variation) + Image Deconvolution with TV Regularization `deconv_tv_admm_tune.py `_ Image Deconvolution Parameter Tuning `denoise_cplx_tv_pdhg.py `_ @@ -146,11 +146,11 @@ Sparsity ^^^^^^^^ `sparsecode_admm.py `_ - Non-negative Basis Pursuit DeNoising (ADMM) + Non-Negative Basis Pursuit DeNoising (ADMM) `sparsecode_pgm.py `_ - Basis Pursuit DeNoising (Accelerated PGM) + Basis Pursuit DeNoising (APGM) `sparsecode_poisson_pgm.py `_ - Non-negative Poisson Loss Reconstruction (APGM w/ adaptive PGMStepSize) + Non-negative Poisson Loss Reconstruction (APGM) `video_rpca_admm.py `_ Video Decomposition via Robust PCA @@ -177,19 +177,19 @@ ADMM `ct_svmbir_tv_multi.py `_ TV Regularized CT Reconstruction (Multiple Algorithms) `deconv_circ_tv_admm.py `_ - Image Deconvolution (ADMM w/ Total Variation and Circulant Blur) + Circulant Blur Image Deconvolution with TV Regularization `deconv_microscopy_tv_admm.py `_ Deconvolution Microscopy (Single Channel) `deconv_microscopy_allchn_tv_admm.py `_ Deconvolution Microscopy (All Channels) `deconv_ppp_bm3d_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Deconvolution (ADMM Solver) `deconv_ppp_bm4d_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ BM4D) + PPP (with BM4D) Volume Deconvolution (ADMM Solver) `deconv_ppp_dncnn_admm.py `_ - Image Deconvolution (ADMM Plug-and-Play Priors w/ DnCNN) + PPP (with DnCNN) Image Deconvolution (ADMM Solver) `deconv_tv_admm.py `_ - Image Deconvolution (ADMM w/ Total Variation) + Image Deconvolution with TV Regularization `deconv_tv_admm_tune.py `_ Image Deconvolution Parameter Tuning `demosaic_ppp_bm3d_admm.py `_ @@ -201,7 +201,7 @@ ADMM `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising `sparsecode_admm.py `_ - Non-negative Basis Pursuit DeNoising (ADMM) + Non-Negative Basis Pursuit DeNoising (ADMM) `superres_ppp_dncnn_admm.py `_ Image Superresolution (ADMM Plug-and-Play Priors w/ DnCNN) `video_rpca_admm.py `_ @@ -232,13 +232,13 @@ PGM ^^^ `deconv_ppp_bm3d_pgm.py `_ - Image Deconvolution (PGM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Deconvolution (APGM Solver) `denoise_tv_pgm.py `_ Isotropic Total Variation (Accelerated PGM) `sparsecode_pgm.py `_ - Basis Pursuit DeNoising (Accelerated PGM) + Basis Pursuit DeNoising (APGM) `sparsecode_poisson_pgm.py `_ - Non-negative Poisson Loss Reconstruction (APGM w/ adaptive PGMStepSize) + Non-negative Poisson Loss Reconstruction (APGM) PCG diff --git a/examples/scripts/deconv_circ_tv_admm.py b/examples/scripts/deconv_circ_tv_admm.py index 8a5c8a596..d4676a4b6 100644 --- a/examples/scripts/deconv_circ_tv_admm.py +++ b/examples/scripts/deconv_circ_tv_admm.py @@ -5,20 +5,18 @@ # with the package. r""" -Image Deconvolution (ADMM w/ Total Variation and Circulant Blur) -================================================================ +Circulant Blur Image Deconvolution with TV Regularization +========================================================= -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve an image deconvolution problem with isotropic total variation (TV) -regularization +This example demonstrates the solution of an image deconvolution problem +with isotropic total variation (TV) regularization - $$\mathrm{argmin}_{\mathbf{x}} \; \| \mathbf{y} - A \mathbf{x} \|_2^2 - + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} + \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ -where $A$ is Toeplitz matrix, $\mathbf{y}$ is the blurred image, $C$ -is a 2D Finite Difference operator, and $\mathbf{x}$ is the desired -image. +where $A$ is a circular convolution operator, $\mathbf{y}$ is the blurred +image, $C$ is a 2D finite difference operator, and $\mathbf{x}$ is the +deconvolved image. """ diff --git a/examples/scripts/deconv_microscopy_allchn_tv_admm.py b/examples/scripts/deconv_microscopy_allchn_tv_admm.py index a151567f2..244157f4f 100644 --- a/examples/scripts/deconv_microscopy_allchn_tv_admm.py +++ b/examples/scripts/deconv_microscopy_allchn_tv_admm.py @@ -18,7 +18,7 @@ solve an image deconvolution problem with isotropic total variation (TV) regularization - $$\mathrm{argmin}_{\mathbf{x}} \; \| M (\mathbf{y} - A \mathbf{x}) + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| M (\mathbf{y} - A \mathbf{x}) \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} + \iota_{\mathrm{NN}}(\mathbf{x}) \;,$$ diff --git a/examples/scripts/deconv_microscopy_tv_admm.py b/examples/scripts/deconv_microscopy_tv_admm.py index 02085b328..917f560fb 100644 --- a/examples/scripts/deconv_microscopy_tv_admm.py +++ b/examples/scripts/deconv_microscopy_tv_admm.py @@ -18,7 +18,7 @@ solve an image deconvolution problem with isotropic total variation (TV) regularization - $$\mathrm{argmin}_{\mathbf{x}} \; \| M (\mathbf{y} - A \mathbf{x}) + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| M (\mathbf{y} - A \mathbf{x}) \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} + \iota_{\mathrm{NN}}(\mathbf{x}) \;,$$ diff --git a/examples/scripts/deconv_ppp_bm3d_admm.py b/examples/scripts/deconv_ppp_bm3d_admm.py index 4c23bc8c1..818b45fbd 100644 --- a/examples/scripts/deconv_ppp_bm3d_admm.py +++ b/examples/scripts/deconv_ppp_bm3d_admm.py @@ -5,14 +5,13 @@ # with the package. """ -Image Deconvolution (ADMM Plug-and-Play Priors w/ BM3D) -======================================================= - -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve an image deconvolution problem using the Plug-and-Play Priors -framework :cite:`venkatakrishnan-2013-plugandplay2`, using BM3D -:cite:`dabov-2008-image` as a denoiser. +PPP (with BM3D) Image Deconvolution (ADMM Solver) +================================================= + +This example demonstrates the solution of an image deconvolution problem +using the ADMM Plug-and-Play Priors (PPP) algorithm +:cite:`venkatakrishnan-2013-plugandplay2`, with the BM3D +:cite:`dabov-2008-image` denoiser. """ import numpy as np diff --git a/examples/scripts/deconv_ppp_bm3d_pgm.py b/examples/scripts/deconv_ppp_bm3d_pgm.py index 199709163..c9178decb 100644 --- a/examples/scripts/deconv_ppp_bm3d_pgm.py +++ b/examples/scripts/deconv_ppp_bm3d_pgm.py @@ -5,15 +5,13 @@ # with the package. """ -Image Deconvolution (PGM Plug-and-Play Priors w/ BM3D) -====================================================== - -This example demonstrates the use of class -[pgm.AcceleratedPGM](../_autosummary/scico.optimize.rst#scico.optimize.AcceleratedPGM) -to solve an image deconvolution problem using the Plug-and-Play Priors -framework :cite:`venkatakrishnan-2013-plugandplay2` -:cite:`kamilov-2017-plugandplay`, using BM3D :cite:`dabov-2008-image` -as a denoiser. +PPP (with BM3D) Image Deconvolution (APGM Solver) +================================================= + +This example demonstrates the solution of an image deconvolution problem +using the APGM Plug-and-Play Priors (PPP) algorithm +:cite:`kamilov-2017-plugandplay`, with the BM3D :cite:`dabov-2008-image` +denoiser. """ import numpy as np diff --git a/examples/scripts/deconv_ppp_bm4d_admm.py b/examples/scripts/deconv_ppp_bm4d_admm.py index 27f82c5f4..58121881a 100644 --- a/examples/scripts/deconv_ppp_bm4d_admm.py +++ b/examples/scripts/deconv_ppp_bm4d_admm.py @@ -5,17 +5,14 @@ # with the package. """ -Image Deconvolution (ADMM Plug-and-Play Priors w/ BM4D) -======================================================= - -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve a 3D image deconvolution problem using the Plug-and-Play Priors -framework :cite:`venkatakrishnan-2013-plugandplay2`, using BM4D -:cite:`maggioni-2012-nonlocal` as a denoiser. - -The 3D deconvolution problem is the task of recovering a 3D image -that has been convolved with a 3D kernel and corrupted by noise. +PPP (with BM4D) Volume Deconvolution (ADMM Solver) +================================================== + +This example demonstrates the solution of a 3D image deconvolution problem +(involving recovering a 3D volume that has been convolved with a 3D kernel +and corrupted by noise) using the ADMM Plug-and-Play Priors (PPP) +algorithm :cite:`venkatakrishnan-2013-plugandplay2`, with the BM4D +:cite:`maggioni-2012-nonlocal` denoiser. """ import numpy as np diff --git a/examples/scripts/deconv_ppp_dncnn_admm.py b/examples/scripts/deconv_ppp_dncnn_admm.py index 0d9036f28..28961e2dc 100644 --- a/examples/scripts/deconv_ppp_dncnn_admm.py +++ b/examples/scripts/deconv_ppp_dncnn_admm.py @@ -5,14 +5,13 @@ # with the package. """ -Image Deconvolution (ADMM Plug-and-Play Priors w/ DnCNN) -======================================================== - -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve an image deconvolution problem using the Plug-and-Play Priors -framework :cite:`venkatakrishnan-2013-plugandplay2`, using DnCNN -:cite:`zhang-2017-dncnn` as a denoiser. +PPP (with DnCNN) Image Deconvolution (ADMM Solver) +================================================== + +This example demonstrates the solution of an image deconvolution problem +using the ADMM Plug-and-Play Priors (PPP) algorithm +:cite:`venkatakrishnan-2013-plugandplay2`, with the DnCNN +:cite:`zhang-2017-dncnn` denoiser. """ import numpy as np diff --git a/examples/scripts/deconv_tv_admm.py b/examples/scripts/deconv_tv_admm.py index 81bd7aa80..5e7e08838 100644 --- a/examples/scripts/deconv_tv_admm.py +++ b/examples/scripts/deconv_tv_admm.py @@ -5,20 +5,18 @@ # with the package. r""" -Image Deconvolution (ADMM w/ Total Variation) -============================================= +Image Deconvolution with TV Regularization +========================================== -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to solve -an image deconvolution problem with isotropic total variation (TV) -regularization +This example demonstrates the solution of an image deconvolution problem +with isotropic total variation (TV) regularization - $$\mathrm{argmin}_{\mathbf{x}} \; \| \mathbf{y} - A \mathbf{x} \|_2^2 - + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} + \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ -where $A$ is Toeplitz matrix, $\mathbf{y}$ is the blurred image, $C$ -is a 2D Finite Difference operator, and $\mathbf{x}$ is the desired -image. +where $A$ is a convolution operator, $\mathbf{y}$ is the blurred image, +$C$ is a 2D finite fifference operator, and $\mathbf{x}$ is the +deconvolved image. """ import jax diff --git a/examples/scripts/demosaic_ppp_bm3d_admm.py b/examples/scripts/demosaic_ppp_bm3d_admm.py index da60b1a9b..953b67e88 100644 --- a/examples/scripts/demosaic_ppp_bm3d_admm.py +++ b/examples/scripts/demosaic_ppp_bm3d_admm.py @@ -5,12 +5,13 @@ # with the package. """ -Image Demosaicing (ADMM Plug-and-Play Priors w/ BM3D) -===================================================== +PPP (with BM3D) Image Demosaicing +================================= -This example demonstrates the use of the ADMM Plug and Play Priors -(PPP) algorithm :cite:`venkatakrishnan-2013-plugandplay2` for solving -a raw image demosaicing problem. +This example demonstrates the use of the ADMM Plug and Play Priors (PPP) +algorithm :cite:`venkatakrishnan-2013-plugandplay2`, with the BM3D +:cite:`dabov-2008-image` denoiser, for solving a raw image demosaicing +problem. """ import numpy as np diff --git a/examples/scripts/denoise_l1tv_admm.py b/examples/scripts/denoise_l1tv_admm.py index c1d09a2e3..cb53cc450 100644 --- a/examples/scripts/denoise_l1tv_admm.py +++ b/examples/scripts/denoise_l1tv_admm.py @@ -5,8 +5,8 @@ # with the package. r""" -ℓ1 Total Variation (ADMM) -========================= +ℓ1 Total Variation Denoising (ADMM) +=================================== This example demonstrates impulse noise removal via ℓ1 total variation :cite:`alliney-1992-digital` :cite:`esser-2010-primal` (Sec. 2.4.4) diff --git a/examples/scripts/denoise_tv_pgm.py b/examples/scripts/denoise_tv_pgm.py index 6deb7ca01..2d3139bac 100644 --- a/examples/scripts/denoise_tv_pgm.py +++ b/examples/scripts/denoise_tv_pgm.py @@ -5,13 +5,11 @@ # with the package. r""" -Isotropic Total Variation (Accelerated PGM) -=========================================== +Total Variation Denoising with Constraint (APGM) +================================================ -This example demonstrates the use of class -[pgm.AcceleratedPGM](../_autosummary/scico.optimize.rst#scico.optimize.AcceleratedPGM) -to solve isotropic total variation (TV) regularization. It solves the -denoising problem +This example demonstrates the solution of the isotropic total variation +(TV) denoising problem $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - \mathbf{x} \|_2^2 + \lambda R(\mathbf{x}) + \iota_C(\mathbf{x}) \;,$$ @@ -22,9 +20,9 @@ $[0, 1]$. The problem is solved seperately with $R$ taken as isotropic and anisotropic TV regularization -The solution via PGM is based on the approach in :cite:`beck-2009-tv`, +The solution via APGM is based on the approach in :cite:`beck-2009-tv`, which involves constructing a dual for the constrained denoising problem. -The PGM solution minimizes the resulting dual. In this case, switching +The APGM solution minimizes the resulting dual. In this case, switching between the two regularizers corresponds to switching between two different projectors. """ diff --git a/examples/scripts/sparsecode_admm.py b/examples/scripts/sparsecode_admm.py index fcf7f77aa..ed500f60e 100644 --- a/examples/scripts/sparsecode_admm.py +++ b/examples/scripts/sparsecode_admm.py @@ -5,15 +5,14 @@ # with the package. r""" -Non-negative Basis Pursuit DeNoising (ADMM) +Non-Negative Basis Pursuit DeNoising (ADMM) =========================================== -This example demonstrates the use of class -[admm.ADMM](../_autosummary/scico.optimize.rst#scico.optimize.ADMM) to -solve the non-negative sparse coding problem problem +This example demonstrates the solution of a non-negative sparse coding +problem - $$\mathrm{argmin}_{\mathbf{x}} \; \| \mathbf{y} - D \mathbf{x} \|_2^2 - + \lambda \| \mathbf{x} \|_1 + I(\mathbf{x} \geq 0)\;,$$ + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - D \mathbf{x} \|_2^2 + + \lambda \| \mathbf{x} \|_1 + I(\mathbf{x} \geq 0) \;,$$ where $D$ the dictionary, $\mathbf{y}$ the signal to be represented, $\mathbf{x}$ is the sparse representation, and $I(\mathbf{x} \geq 0)$ diff --git a/examples/scripts/sparsecode_pgm.py b/examples/scripts/sparsecode_pgm.py index ef642f3c7..8cf0874c1 100644 --- a/examples/scripts/sparsecode_pgm.py +++ b/examples/scripts/sparsecode_pgm.py @@ -5,15 +5,13 @@ # with the package. r""" -Basis Pursuit DeNoising (Accelerated PGM) -========================================= +Basis Pursuit DeNoising (APGM) +============================== -This example demonstrates the use of class -[pgm.AcceleratedPGM](../_autosummary/scico.optimize.rst#scico.optimize.AcceleratedPGM) -to solve the sparse coding problem problem +This example demonstrates the solution of the the sparse coding problem - $$\mathrm{argmin}_{\mathbf{x}} \; \| \mathbf{y} - D \mathbf{x} \|_2^2 - + \lambda \| \mathbf{x} \|_1\;,$$ + $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - D \mathbf{x} + \|_2^2 + \lambda \| \mathbf{x} \|_1\;,$$ where $D$ the dictionary, $\mathbf{y}$ the signal to be represented, and $\mathbf{x}$ is the sparse representation. diff --git a/examples/scripts/sparsecode_poisson_pgm.py b/examples/scripts/sparsecode_poisson_pgm.py index 5b2ad8b96..b9f38b1b8 100644 --- a/examples/scripts/sparsecode_poisson_pgm.py +++ b/examples/scripts/sparsecode_poisson_pgm.py @@ -5,8 +5,8 @@ # with the package. r""" -Non-negative Poisson Loss Reconstruction (APGM w/ adaptive PGMStepSize) -======================================================================= +Non-negative Poisson Loss Reconstruction (APGM) +=============================================== This example demonstrates the use of class [pgm.PGMStepSize](../_autosummary/scico.optimize.pgm.rst#scico.optimize.pgm.PGMStepSize) @@ -15,7 +15,7 @@ $$\mathrm{argmin}_{\mathbf{x}} \; \frac{1}{2} \left ( A(\mathbf{x}) - \mathbf{y} \log\left( A(\mathbf{x}) \right) + \log(\mathbf{y}!) \right - ) + I(\mathbf{x}^{(0)} \geq 0)\;,$$ + ) + I(\mathbf{x}^{(0)} \geq 0) \;,$$ where $A$ is the forward operator, $\mathbf{y}$ is the measurement, $\mathbf{x}$ is the signal reconstruction, and diff --git a/examples/scripts/superres_ppp_dncnn_admm.py b/examples/scripts/superres_ppp_dncnn_admm.py index aba29a8af..fd06cd64a 100644 --- a/examples/scripts/superres_ppp_dncnn_admm.py +++ b/examples/scripts/superres_ppp_dncnn_admm.py @@ -5,12 +5,13 @@ # with the package. """ -Image Superresolution (ADMM Plug-and-Play Priors w/ DnCNN) -========================================================== +PPP (with DnCNN) Image Superresolution +====================================== This example demonstrates the use of the ADMM Plug and Play Priors -(PPP) algorithm :cite:`venkatakrishnan-2013-plugandplay2` for solving -a simple image superresolution problem. +(PPP) algorithm :cite:`venkatakrishnan-2013-plugandplay2`, with DnCNN +:cite:`zhang-2017-dncnn` denoiser, for solving a simple image +superresolution problem. """ import jax diff --git a/examples/scripts/video_rpca_admm.py b/examples/scripts/video_rpca_admm.py index 009aa0f00..81bc3617f 100644 --- a/examples/scripts/video_rpca_admm.py +++ b/examples/scripts/video_rpca_admm.py @@ -11,8 +11,8 @@ This example demonstrates video foreground/background separation via a variant of the Robust PCA problem - $$\mathrm{argmin}_{\mathbf{x}_0, \mathbf{x}_1} \; \| \mathbf{x}_0 + - \mathbf{x}_1 - \mathbf{y} \|_2^2 + \lambda_0 \| \mathbf{x}_0 \|_* + $$\mathrm{argmin}_{\mathbf{x}_0, \mathbf{x}_1} \; (1/2) \| \mathbf{x}_0 + + \mathbf{x}_1 - \mathbf{y} \|_2^2 + \lambda_0 \| \mathbf{x}_0 \|_* + \lambda_1 \| \mathbf{x}_1 \|_1 \;,$$ where $\mathbf{x}_0$ and $\mathbf{x}_1$ are respectively low-rank and From dd9d65737709731eba16600a85d623261c0b0efe Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 12:34:42 -0600 Subject: [PATCH 17/30] Updated example index --- docs/source/examples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/examples.rst b/docs/source/examples.rst index a6680e0f2..63b853aa2 100644 --- a/docs/source/examples.rst +++ b/docs/source/examples.rst @@ -39,14 +39,14 @@ Deconvolution :maxdepth: 1 examples/deconv_circ_tv_admm + examples/deconv_tv_admm + examples/deconv_tv_admm_tune examples/deconv_microscopy_tv_admm examples/deconv_microscopy_allchn_tv_admm examples/deconv_ppp_bm3d_admm examples/deconv_ppp_bm3d_pgm examples/deconv_ppp_bm4d_admm examples/deconv_ppp_dncnn_admm - examples/deconv_tv_admm - examples/deconv_tv_admm_tune Sparse Coding From d3ec9a0ddce4155306d962b30a466a277179186b Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 13:51:15 -0600 Subject: [PATCH 18/30] Update submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index 4921d81f9..6bebfc98a 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 4921d81f933c72c8b583916929e0e339cbe00c3e +Subproject commit 6bebfc98aa853e12d1ed14e4a48e6e744b4becb7 From de8b486db1bff1346dce1197b7bdb2fa567fa92d Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 14:48:26 -0600 Subject: [PATCH 19/30] Modify index and simplify some titles --- docs/source/examples.rst | 2 +- examples/scripts/README.rst | 44 +++++++++++------------ examples/scripts/deconv_ppp_bm4d_admm.py | 4 +-- examples/scripts/deconv_ppp_dncnn_admm.py | 4 +-- examples/scripts/denoise_cplx_tv_pdhg.py | 4 +-- examples/scripts/denoise_l1tv_admm.py | 4 +-- examples/scripts/index.rst | 2 +- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/docs/source/examples.rst b/docs/source/examples.rst index 63b853aa2..74313d003 100644 --- a/docs/source/examples.rst +++ b/docs/source/examples.rst @@ -45,8 +45,8 @@ Deconvolution examples/deconv_microscopy_allchn_tv_admm examples/deconv_ppp_bm3d_admm examples/deconv_ppp_bm3d_pgm - examples/deconv_ppp_bm4d_admm examples/deconv_ppp_dncnn_admm + examples/deconv_ppp_bm4d_admm Sparse Coding diff --git a/examples/scripts/README.rst b/examples/scripts/README.rst index 84593fd95..8c4630574 100644 --- a/examples/scripts/README.rst +++ b/examples/scripts/README.rst @@ -44,10 +44,10 @@ Deconvolution PPP (with BM3D) Image Deconvolution (ADMM Solver) `deconv_ppp_bm3d_pgm.py `_ PPP (with BM3D) Image Deconvolution (APGM Solver) - `deconv_ppp_bm4d_admm.py `_ - PPP (with BM4D) Volume Deconvolution (ADMM Solver) `deconv_ppp_dncnn_admm.py `_ - PPP (with DnCNN) Image Deconvolution (ADMM Solver) + PPP (with DnCNN) Image Deconvolution + `deconv_ppp_bm4d_admm.py `_ + PPP (with BM4D) Volume Deconvolution Sparse Coding @@ -65,19 +65,19 @@ Miscellaneous ^^^^^^^^^^^^^ `demosaic_ppp_bm3d_admm.py `_ - Image Demosaicing (ADMM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Demosaicing `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising (PDHG) + Complex Total Variation Denoising `denoise_l1tv_admm.py `_ - ℓ1 Total Variation (ADMM) + ℓ1 Total Variation Denoising `denoise_tv_admm.py `_ Total Variation Denoising (ADMM) `denoise_tv_pgm.py `_ - Isotropic Total Variation (Accelerated PGM) + Total Variation Denoising with Constraint (APGM) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising `superres_ppp_dncnn_admm.py `_ - Image Superresolution (ADMM Plug-and-Play Priors w/ DnCNN) + PPP (with DnCNN) Image Superresolution `video_rpca_admm.py `_ Video Decomposition via Robust PCA @@ -100,13 +100,13 @@ Plug and Play Priors `deconv_ppp_bm3d_pgm.py `_ PPP (with BM3D) Image Deconvolution (APGM Solver) `deconv_ppp_bm4d_admm.py `_ - PPP (with BM4D) Volume Deconvolution (ADMM Solver) + PPP (with BM4D) Volume Deconvolution `deconv_ppp_dncnn_admm.py `_ - PPP (with DnCNN) Image Deconvolution (ADMM Solver) + PPP (with DnCNN) Image Deconvolution `demosaic_ppp_bm3d_admm.py `_ - Image Demosaicing (ADMM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Demosaicing `superres_ppp_dncnn_admm.py `_ - Image Superresolution (ADMM Plug-and-Play Priors w/ DnCNN) + PPP (with DnCNN) Image Superresolution Total Variation @@ -131,13 +131,13 @@ Total Variation `deconv_tv_admm_tune.py `_ Image Deconvolution Parameter Tuning `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising (PDHG) + Complex Total Variation Denoising `denoise_l1tv_admm.py `_ - ℓ1 Total Variation (ADMM) + ℓ1 Total Variation Denoising `denoise_tv_admm.py `_ Total Variation Denoising (ADMM) `denoise_tv_pgm.py `_ - Isotropic Total Variation (Accelerated PGM) + Total Variation Denoising with Constraint (APGM) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising @@ -185,17 +185,17 @@ ADMM `deconv_ppp_bm3d_admm.py `_ PPP (with BM3D) Image Deconvolution (ADMM Solver) `deconv_ppp_bm4d_admm.py `_ - PPP (with BM4D) Volume Deconvolution (ADMM Solver) + PPP (with BM4D) Volume Deconvolution `deconv_ppp_dncnn_admm.py `_ - PPP (with DnCNN) Image Deconvolution (ADMM Solver) + PPP (with DnCNN) Image Deconvolution `deconv_tv_admm.py `_ Image Deconvolution with TV Regularization `deconv_tv_admm_tune.py `_ Image Deconvolution Parameter Tuning `demosaic_ppp_bm3d_admm.py `_ - Image Demosaicing (ADMM Plug-and-Play Priors w/ BM3D) + PPP (with BM3D) Image Demosaicing `denoise_l1tv_admm.py `_ - ℓ1 Total Variation (ADMM) + ℓ1 Total Variation Denoising `denoise_tv_admm.py `_ Total Variation Denoising (ADMM) `denoise_tv_multi.py `_ @@ -203,7 +203,7 @@ ADMM `sparsecode_admm.py `_ Non-Negative Basis Pursuit DeNoising (ADMM) `superres_ppp_dncnn_admm.py `_ - Image Superresolution (ADMM Plug-and-Play Priors w/ DnCNN) + PPP (with DnCNN) Image Superresolution `video_rpca_admm.py `_ Video Decomposition via Robust PCA @@ -223,7 +223,7 @@ PDHG `ct_svmbir_tv_multi.py `_ TV Regularized CT Reconstruction (Multiple Algorithms) `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising (PDHG) + Complex Total Variation Denoising `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising @@ -234,7 +234,7 @@ PGM `deconv_ppp_bm3d_pgm.py `_ PPP (with BM3D) Image Deconvolution (APGM Solver) `denoise_tv_pgm.py `_ - Isotropic Total Variation (Accelerated PGM) + Total Variation Denoising with Constraint (APGM) `sparsecode_pgm.py `_ Basis Pursuit DeNoising (APGM) `sparsecode_poisson_pgm.py `_ diff --git a/examples/scripts/deconv_ppp_bm4d_admm.py b/examples/scripts/deconv_ppp_bm4d_admm.py index 58121881a..e56584c98 100644 --- a/examples/scripts/deconv_ppp_bm4d_admm.py +++ b/examples/scripts/deconv_ppp_bm4d_admm.py @@ -5,8 +5,8 @@ # with the package. """ -PPP (with BM4D) Volume Deconvolution (ADMM Solver) -================================================== +PPP (with BM4D) Volume Deconvolution +==================================== This example demonstrates the solution of a 3D image deconvolution problem (involving recovering a 3D volume that has been convolved with a 3D kernel diff --git a/examples/scripts/deconv_ppp_dncnn_admm.py b/examples/scripts/deconv_ppp_dncnn_admm.py index 28961e2dc..a91dc16d2 100644 --- a/examples/scripts/deconv_ppp_dncnn_admm.py +++ b/examples/scripts/deconv_ppp_dncnn_admm.py @@ -5,8 +5,8 @@ # with the package. """ -PPP (with DnCNN) Image Deconvolution (ADMM Solver) -================================================== +PPP (with DnCNN) Image Deconvolution +==================================== This example demonstrates the solution of an image deconvolution problem using the ADMM Plug-and-Play Priors (PPP) algorithm diff --git a/examples/scripts/denoise_cplx_tv_pdhg.py b/examples/scripts/denoise_cplx_tv_pdhg.py index 45c0477ff..68d6d79eb 100644 --- a/examples/scripts/denoise_cplx_tv_pdhg.py +++ b/examples/scripts/denoise_cplx_tv_pdhg.py @@ -5,8 +5,8 @@ # with the package. r""" -Complex Total Variation Denoising (PDHG) -======================================== +Complex Total Variation Denoising +================================= This example demonstrates solution of a problem of the form diff --git a/examples/scripts/denoise_l1tv_admm.py b/examples/scripts/denoise_l1tv_admm.py index cb53cc450..d69168418 100644 --- a/examples/scripts/denoise_l1tv_admm.py +++ b/examples/scripts/denoise_l1tv_admm.py @@ -5,8 +5,8 @@ # with the package. r""" -ℓ1 Total Variation Denoising (ADMM) -=================================== +ℓ1 Total Variation Denoising +============================ This example demonstrates impulse noise removal via ℓ1 total variation :cite:`alliney-1992-digital` :cite:`esser-2010-primal` (Sec. 2.4.4) diff --git a/examples/scripts/index.rst b/examples/scripts/index.rst index 2cdb1f4ee..6db1e009f 100644 --- a/examples/scripts/index.rst +++ b/examples/scripts/index.rst @@ -29,8 +29,8 @@ Deconvolution - deconv_microscopy_allchn_tv_admm.py - deconv_ppp_bm3d_admm.py - deconv_ppp_bm3d_pgm.py - - deconv_ppp_bm4d_admm.py - deconv_ppp_dncnn_admm.py + - deconv_ppp_bm4d_admm.py Sparse Coding From 8165b563d889083483a42b2f98e5b466054f7192 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 15:05:30 -0600 Subject: [PATCH 20/30] Fix bug in notebook build functions --- examples/jnb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jnb.py b/examples/jnb.py index 26629fd93..80d61db18 100644 --- a/examples/jnb.py +++ b/examples/jnb.py @@ -59,7 +59,7 @@ def py_file_to_string(src): # Process remainder of source file for line in srcfile: - if re.match("^input", line): # end processing when input statement encountered + if re.match("^input\(", line): # end processing when input statement encountered break line = re.sub('^r"""', '"""', line) # remove r from r""" line = re.sub(":cite:\`([^`]+)\`", r'', line) # fix cite format From c0f12f7c2f0af46ff4645a99b56fb7de712d6fa5 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 15:06:48 -0600 Subject: [PATCH 21/30] Update submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index 6bebfc98a..c9a08657f 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 6bebfc98aa853e12d1ed14e4a48e6e744b4becb7 +Subproject commit c9a08657f435da58eb577565accb4384ef1f23a3 From a857a9d3d03067f80541c0d6965cc8641adc2f81 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 15:13:55 -0600 Subject: [PATCH 22/30] Update submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index c9a08657f..594df64ff 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit c9a08657f435da58eb577565accb4384ef1f23a3 +Subproject commit 594df64ff9bf9238fd7574ac0f05042668d26cf6 From e4e5d8fb114edb085fd66c1ebaaaeab3b58908f2 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 15:22:55 -0600 Subject: [PATCH 23/30] Update index --- docs/source/examples.rst | 2 +- examples/scripts/README.rst | 4 ++-- examples/scripts/index.rst | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/examples.rst b/docs/source/examples.rst index 74313d003..934e73af4 100644 --- a/docs/source/examples.rst +++ b/docs/source/examples.rst @@ -67,12 +67,12 @@ Miscellaneous :maxdepth: 1 examples/demosaic_ppp_bm3d_admm + examples/superres_ppp_dncnn_admm examples/denoise_cplx_tv_pdhg examples/denoise_l1tv_admm examples/denoise_tv_admm examples/denoise_tv_pgm examples/denoise_tv_multi - examples/superres_ppp_dncnn_admm examples/video_rpca_admm diff --git a/examples/scripts/README.rst b/examples/scripts/README.rst index 8c4630574..e4f1f8c7d 100644 --- a/examples/scripts/README.rst +++ b/examples/scripts/README.rst @@ -66,6 +66,8 @@ Miscellaneous `demosaic_ppp_bm3d_admm.py `_ PPP (with BM3D) Image Demosaicing + `superres_ppp_dncnn_admm.py `_ + PPP (with DnCNN) Image Superresolution `denoise_cplx_tv_pdhg.py `_ Complex Total Variation Denoising `denoise_l1tv_admm.py `_ @@ -76,8 +78,6 @@ Miscellaneous Total Variation Denoising with Constraint (APGM) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising - `superres_ppp_dncnn_admm.py `_ - PPP (with DnCNN) Image Superresolution `video_rpca_admm.py `_ Video Decomposition via Robust PCA diff --git a/examples/scripts/index.rst b/examples/scripts/index.rst index 6db1e009f..1d2b0fbbe 100644 --- a/examples/scripts/index.rst +++ b/examples/scripts/index.rst @@ -45,12 +45,12 @@ Miscellaneous ^^^^^^^^^^^^^ - demosaic_ppp_bm3d_admm.py + - superres_ppp_dncnn_admm.py - denoise_cplx_tv_pdhg.py - denoise_l1tv_admm.py - denoise_tv_admm.py - denoise_tv_pgm.py - denoise_tv_multi.py - - superres_ppp_dncnn_admm.py - video_rpca_admm.py From 971c1f8a817da52e9e533236e446460d71c3f6e0 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 16:28:24 -0600 Subject: [PATCH 24/30] Improve index order --- examples/scripts/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/scripts/index.rst b/examples/scripts/index.rst index 1d2b0fbbe..2a22256d7 100644 --- a/examples/scripts/index.rst +++ b/examples/scripts/index.rst @@ -13,10 +13,10 @@ Computed Tomography - ct_astra_noreg_pcg.py - ct_astra_tv_admm.py - ct_astra_weighted_tv_admm.py + - ct_svmbir_tv_multi.py - ct_svmbir_ppp_bm3d_admm_cg.py - ct_svmbir_ppp_bm3d_admm_prox.py - ct_fan_svmbir_ppp_bm3d_admm_prox.py - - ct_svmbir_tv_multi.py Deconvolution @@ -46,11 +46,11 @@ Miscellaneous - demosaic_ppp_bm3d_admm.py - superres_ppp_dncnn_admm.py - - denoise_cplx_tv_pdhg.py - denoise_l1tv_admm.py - denoise_tv_admm.py - denoise_tv_pgm.py - denoise_tv_multi.py + - denoise_cplx_tv_pdhg.py - video_rpca_admm.py From 08641047d15d37f1404bd69e7de40568e7e5214f Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 16:40:34 -0600 Subject: [PATCH 25/30] Improve index order --- docs/source/examples.rst | 28 +++++++++---------- examples/scripts/README.rst | 56 ++++++++++++++++++------------------- examples/scripts/index.rst | 24 ++++++++-------- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/docs/source/examples.rst b/docs/source/examples.rst index 934e73af4..d09c8a67f 100644 --- a/docs/source/examples.rst +++ b/docs/source/examples.rst @@ -26,10 +26,10 @@ Computed Tomography examples/ct_astra_noreg_pcg examples/ct_astra_tv_admm examples/ct_astra_weighted_tv_admm + examples/ct_svmbir_tv_multi examples/ct_svmbir_ppp_bm3d_admm_cg examples/ct_svmbir_ppp_bm3d_admm_prox examples/ct_fan_svmbir_ppp_bm3d_admm_prox - examples/ct_svmbir_tv_multi Deconvolution @@ -68,11 +68,11 @@ Miscellaneous examples/demosaic_ppp_bm3d_admm examples/superres_ppp_dncnn_admm - examples/denoise_cplx_tv_pdhg examples/denoise_l1tv_admm examples/denoise_tv_admm examples/denoise_tv_pgm examples/denoise_tv_multi + examples/denoise_cplx_tv_pdhg examples/video_rpca_admm @@ -94,8 +94,8 @@ Plug and Play Priors examples/ct_fan_svmbir_ppp_bm3d_admm_prox examples/deconv_ppp_bm3d_admm examples/deconv_ppp_bm3d_pgm - examples/deconv_ppp_bm4d_admm examples/deconv_ppp_dncnn_admm + examples/deconv_ppp_bm4d_admm examples/demosaic_ppp_bm3d_admm examples/superres_ppp_dncnn_admm @@ -111,15 +111,15 @@ Total Variation examples/ct_astra_weighted_tv_admm examples/ct_svmbir_tv_multi examples/deconv_circ_tv_admm - examples/deconv_microscopy_tv_admm - examples/deconv_microscopy_allchn_tv_admm examples/deconv_tv_admm examples/deconv_tv_admm_tune - examples/denoise_cplx_tv_pdhg + examples/deconv_microscopy_tv_admm + examples/deconv_microscopy_allchn_tv_admm examples/denoise_l1tv_admm examples/denoise_tv_admm examples/denoise_tv_pgm examples/denoise_tv_multi + examples/denoise_cplx_tv_pdhg Sparsity @@ -150,24 +150,24 @@ ADMM examples/ct_abel_tv_admm examples/ct_astra_tv_admm examples/ct_astra_weighted_tv_admm + examples/ct_svmbir_tv_multi examples/ct_svmbir_ppp_bm3d_admm_cg examples/ct_svmbir_ppp_bm3d_admm_prox examples/ct_fan_svmbir_ppp_bm3d_admm_prox - examples/ct_svmbir_tv_multi examples/deconv_circ_tv_admm + examples/deconv_tv_admm + examples/deconv_tv_admm_tune examples/deconv_microscopy_tv_admm examples/deconv_microscopy_allchn_tv_admm examples/deconv_ppp_bm3d_admm - examples/deconv_ppp_bm4d_admm examples/deconv_ppp_dncnn_admm - examples/deconv_tv_admm - examples/deconv_tv_admm_tune + examples/deconv_ppp_bm4d_admm + examples/sparsecode_admm examples/demosaic_ppp_bm3d_admm + examples/superres_ppp_dncnn_admm examples/denoise_l1tv_admm examples/denoise_tv_admm examples/denoise_tv_multi - examples/sparsecode_admm - examples/superres_ppp_dncnn_admm examples/video_rpca_admm @@ -188,8 +188,8 @@ PDHG :maxdepth: 1 examples/ct_svmbir_tv_multi - examples/denoise_cplx_tv_pdhg examples/denoise_tv_multi + examples/denoise_cplx_tv_pdhg PGM @@ -199,9 +199,9 @@ PGM :maxdepth: 1 examples/deconv_ppp_bm3d_pgm - examples/denoise_tv_pgm examples/sparsecode_pgm examples/sparsecode_poisson_pgm + examples/denoise_tv_pgm PCG diff --git a/examples/scripts/README.rst b/examples/scripts/README.rst index e4f1f8c7d..946d6dc6c 100644 --- a/examples/scripts/README.rst +++ b/examples/scripts/README.rst @@ -17,14 +17,14 @@ Computed Tomography TV Regularized Few-View CT Reconstruction `ct_astra_weighted_tv_admm.py `_ TV Regularized Low-Dose CT Reconstruction + `ct_svmbir_tv_multi.py `_ + TV Regularized CT Reconstruction (Multiple Algorithms) `ct_svmbir_ppp_bm3d_admm_cg.py `_ PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) `ct_svmbir_ppp_bm3d_admm_prox.py `_ PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ PPP (with BM3D) Fan-Beam CT Reconstruction - `ct_svmbir_tv_multi.py `_ - TV Regularized CT Reconstruction (Multiple Algorithms) Deconvolution @@ -68,8 +68,6 @@ Miscellaneous PPP (with BM3D) Image Demosaicing `superres_ppp_dncnn_admm.py `_ PPP (with DnCNN) Image Superresolution - `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising `denoise_l1tv_admm.py `_ ℓ1 Total Variation Denoising `denoise_tv_admm.py `_ @@ -78,6 +76,8 @@ Miscellaneous Total Variation Denoising with Constraint (APGM) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising + `denoise_cplx_tv_pdhg.py `_ + Complex Total Variation Denoising `video_rpca_admm.py `_ Video Decomposition via Robust PCA @@ -99,10 +99,10 @@ Plug and Play Priors PPP (with BM3D) Image Deconvolution (ADMM Solver) `deconv_ppp_bm3d_pgm.py `_ PPP (with BM3D) Image Deconvolution (APGM Solver) - `deconv_ppp_bm4d_admm.py `_ - PPP (with BM4D) Volume Deconvolution `deconv_ppp_dncnn_admm.py `_ PPP (with DnCNN) Image Deconvolution + `deconv_ppp_bm4d_admm.py `_ + PPP (with BM4D) Volume Deconvolution `demosaic_ppp_bm3d_admm.py `_ PPP (with BM3D) Image Demosaicing `superres_ppp_dncnn_admm.py `_ @@ -122,16 +122,14 @@ Total Variation TV Regularized CT Reconstruction (Multiple Algorithms) `deconv_circ_tv_admm.py `_ Circulant Blur Image Deconvolution with TV Regularization - `deconv_microscopy_tv_admm.py `_ - Deconvolution Microscopy (Single Channel) - `deconv_microscopy_allchn_tv_admm.py `_ - Deconvolution Microscopy (All Channels) `deconv_tv_admm.py `_ Image Deconvolution with TV Regularization `deconv_tv_admm_tune.py `_ Image Deconvolution Parameter Tuning - `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising + `deconv_microscopy_tv_admm.py `_ + Deconvolution Microscopy (Single Channel) + `deconv_microscopy_allchn_tv_admm.py `_ + Deconvolution Microscopy (All Channels) `denoise_l1tv_admm.py `_ ℓ1 Total Variation Denoising `denoise_tv_admm.py `_ @@ -140,6 +138,8 @@ Total Variation Total Variation Denoising with Constraint (APGM) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising + `denoise_cplx_tv_pdhg.py `_ + Complex Total Variation Denoising Sparsity @@ -168,42 +168,42 @@ ADMM TV Regularized Few-View CT Reconstruction `ct_astra_weighted_tv_admm.py `_ TV Regularized Low-Dose CT Reconstruction + `ct_svmbir_tv_multi.py `_ + TV Regularized CT Reconstruction (Multiple Algorithms) `ct_svmbir_ppp_bm3d_admm_cg.py `_ PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) `ct_svmbir_ppp_bm3d_admm_prox.py `_ PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ PPP (with BM3D) Fan-Beam CT Reconstruction - `ct_svmbir_tv_multi.py `_ - TV Regularized CT Reconstruction (Multiple Algorithms) `deconv_circ_tv_admm.py `_ Circulant Blur Image Deconvolution with TV Regularization + `deconv_tv_admm.py `_ + Image Deconvolution with TV Regularization + `deconv_tv_admm_tune.py `_ + Image Deconvolution Parameter Tuning `deconv_microscopy_tv_admm.py `_ Deconvolution Microscopy (Single Channel) `deconv_microscopy_allchn_tv_admm.py `_ Deconvolution Microscopy (All Channels) `deconv_ppp_bm3d_admm.py `_ PPP (with BM3D) Image Deconvolution (ADMM Solver) - `deconv_ppp_bm4d_admm.py `_ - PPP (with BM4D) Volume Deconvolution `deconv_ppp_dncnn_admm.py `_ PPP (with DnCNN) Image Deconvolution - `deconv_tv_admm.py `_ - Image Deconvolution with TV Regularization - `deconv_tv_admm_tune.py `_ - Image Deconvolution Parameter Tuning + `deconv_ppp_bm4d_admm.py `_ + PPP (with BM4D) Volume Deconvolution + `sparsecode_admm.py `_ + Non-Negative Basis Pursuit DeNoising (ADMM) `demosaic_ppp_bm3d_admm.py `_ PPP (with BM3D) Image Demosaicing + `superres_ppp_dncnn_admm.py `_ + PPP (with DnCNN) Image Superresolution `denoise_l1tv_admm.py `_ ℓ1 Total Variation Denoising `denoise_tv_admm.py `_ Total Variation Denoising (ADMM) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising - `sparsecode_admm.py `_ - Non-Negative Basis Pursuit DeNoising (ADMM) - `superres_ppp_dncnn_admm.py `_ - PPP (with DnCNN) Image Superresolution `video_rpca_admm.py `_ Video Decomposition via Robust PCA @@ -222,10 +222,10 @@ PDHG `ct_svmbir_tv_multi.py `_ TV Regularized CT Reconstruction (Multiple Algorithms) - `denoise_cplx_tv_pdhg.py `_ - Complex Total Variation Denoising `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising + `denoise_cplx_tv_pdhg.py `_ + Complex Total Variation Denoising PGM @@ -233,12 +233,12 @@ PGM `deconv_ppp_bm3d_pgm.py `_ PPP (with BM3D) Image Deconvolution (APGM Solver) - `denoise_tv_pgm.py `_ - Total Variation Denoising with Constraint (APGM) `sparsecode_pgm.py `_ Basis Pursuit DeNoising (APGM) `sparsecode_poisson_pgm.py `_ Non-negative Poisson Loss Reconstruction (APGM) + `denoise_tv_pgm.py `_ + Total Variation Denoising with Constraint (APGM) PCG diff --git a/examples/scripts/index.rst b/examples/scripts/index.rst index 2a22256d7..c14cf69d5 100644 --- a/examples/scripts/index.rst +++ b/examples/scripts/index.rst @@ -66,8 +66,8 @@ Plug and Play Priors - ct_fan_svmbir_ppp_bm3d_admm_prox.py - deconv_ppp_bm3d_admm.py - deconv_ppp_bm3d_pgm.py - - deconv_ppp_bm4d_admm.py - deconv_ppp_dncnn_admm.py + - deconv_ppp_bm4d_admm.py - demosaic_ppp_bm3d_admm.py - superres_ppp_dncnn_admm.py @@ -80,15 +80,15 @@ Total Variation - ct_astra_weighted_tv_admm.py - ct_svmbir_tv_multi.py - deconv_circ_tv_admm.py - - deconv_microscopy_tv_admm.py - - deconv_microscopy_allchn_tv_admm.py - deconv_tv_admm.py - deconv_tv_admm_tune.py - - denoise_cplx_tv_pdhg.py + - deconv_microscopy_tv_admm.py + - deconv_microscopy_allchn_tv_admm.py - denoise_l1tv_admm.py - denoise_tv_admm.py - denoise_tv_pgm.py - denoise_tv_multi.py + - denoise_cplx_tv_pdhg.py Sparsity @@ -110,24 +110,24 @@ ADMM - ct_abel_tv_admm.py - ct_astra_tv_admm.py - ct_astra_weighted_tv_admm.py + - ct_svmbir_tv_multi.py - ct_svmbir_ppp_bm3d_admm_cg.py - ct_svmbir_ppp_bm3d_admm_prox.py - ct_fan_svmbir_ppp_bm3d_admm_prox.py - - ct_svmbir_tv_multi.py - deconv_circ_tv_admm.py + - deconv_tv_admm.py + - deconv_tv_admm_tune.py - deconv_microscopy_tv_admm.py - deconv_microscopy_allchn_tv_admm.py - deconv_ppp_bm3d_admm.py - - deconv_ppp_bm4d_admm.py - deconv_ppp_dncnn_admm.py - - deconv_tv_admm.py - - deconv_tv_admm_tune.py + - deconv_ppp_bm4d_admm.py + - sparsecode_admm.py - demosaic_ppp_bm3d_admm.py + - superres_ppp_dncnn_admm.py - denoise_l1tv_admm.py - denoise_tv_admm.py - denoise_tv_multi.py - - sparsecode_admm.py - - superres_ppp_dncnn_admm.py - video_rpca_admm.py @@ -142,17 +142,17 @@ PDHG ^^^^ - ct_svmbir_tv_multi.py - - denoise_cplx_tv_pdhg.py - denoise_tv_multi.py + - denoise_cplx_tv_pdhg.py PGM ^^^ - deconv_ppp_bm3d_pgm.py - - denoise_tv_pgm.py - sparsecode_pgm.py - sparsecode_poisson_pgm.py + - denoise_tv_pgm.py PCG From de688993744a8c951c1b422774bdb9800f8ecca2 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Tue, 13 Sep 2022 16:44:06 -0600 Subject: [PATCH 26/30] Update submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index 594df64ff..914ec3b70 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 594df64ff9bf9238fd7574ac0f05042668d26cf6 +Subproject commit 914ec3b707de5301c84180bc3b2f220b78bf2428 From 26f85c4ed8874ee2eb74068cce8ad26363ef26b2 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Wed, 14 Sep 2022 11:43:55 -0600 Subject: [PATCH 27/30] Changes in response to PR review --- examples/scripts/ct_abel_tv_admm.py | 4 ++-- examples/scripts/ct_abel_tv_admm_tune.py | 2 +- examples/scripts/ct_astra_tv_admm.py | 8 ++++---- examples/scripts/ct_astra_weighted_tv_admm.py | 2 +- examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py | 8 +++++--- examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py | 16 ++++++++++------ examples/scripts/ct_svmbir_tv_multi.py | 2 +- 7 files changed, 24 insertions(+), 18 deletions(-) diff --git a/examples/scripts/ct_abel_tv_admm.py b/examples/scripts/ct_abel_tv_admm.py index ac209fd0c..71a07c02e 100644 --- a/examples/scripts/ct_abel_tv_admm.py +++ b/examples/scripts/ct_abel_tv_admm.py @@ -5,7 +5,7 @@ # with the package. r""" -TV Regularized Abel Inversion +TV-Regularized Abel Inversion ============================= This example demonstrates a TV-regularized Abel inversion by solving the @@ -103,7 +103,7 @@ ) plot.imview( x_tv, - title="TV Regularized Inversion: %.2f (dB)" % metric.psnr(x_gt, x_tv), + title="TV-Regularized Inversion: %.2f (dB)" % metric.psnr(x_gt, x_tv), cmap=plot.cm.Blues, fig=fig, ax=ax[1, 1], diff --git a/examples/scripts/ct_abel_tv_admm_tune.py b/examples/scripts/ct_abel_tv_admm_tune.py index bef1f7140..210b82e1a 100644 --- a/examples/scripts/ct_abel_tv_admm_tune.py +++ b/examples/scripts/ct_abel_tv_admm_tune.py @@ -5,7 +5,7 @@ # with the package. r""" -TV Regularized Abel Inversion Tuning Demo +TV-Regularized Abel Inversion Tuning Demo ========================================= This example demonstrates the use of diff --git a/examples/scripts/ct_astra_tv_admm.py b/examples/scripts/ct_astra_tv_admm.py index 5efd6e951..dc694eca6 100644 --- a/examples/scripts/ct_astra_tv_admm.py +++ b/examples/scripts/ct_astra_tv_admm.py @@ -5,11 +5,11 @@ # with the package. r""" -TV Regularized Few-View CT Reconstruction -========================================= +TV-Regularized Sparse-View CT Reconstruction +============================================ -This example demonstrates solution of a few-view CT reconstruction problem -with isotropic total variation (TV) regularization +This example demonstrates solution of a sparse-view CT reconstruction +problem with isotropic total variation (TV) regularization $$\mathrm{argmin}_{\mathbf{x}} \; (1/2) \| \mathbf{y} - A \mathbf{x} \|_2^2 + \lambda \| C \mathbf{x} \|_{2,1} \;,$$ diff --git a/examples/scripts/ct_astra_weighted_tv_admm.py b/examples/scripts/ct_astra_weighted_tv_admm.py index 97f0e8f09..abae983ce 100644 --- a/examples/scripts/ct_astra_weighted_tv_admm.py +++ b/examples/scripts/ct_astra_weighted_tv_admm.py @@ -5,7 +5,7 @@ # with the package. r""" -TV Regularized Low-Dose CT Reconstruction +TV-Regularized Low-Dose CT Reconstruction ========================================= This example demonstrates solution of a low-dose CT reconstruction problem diff --git a/examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py b/examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py index 3b9aa5b7e..24b4ddf02 100644 --- a/examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py +++ b/examples/scripts/ct_svmbir_ppp_bm3d_admm_cg.py @@ -14,9 +14,11 @@ :cite:`dabov-2008-image` as a denoiser and SVMBIR :cite:`svmbir-2020` for tomographic projection. -This version uses the data fidelity term as the ADMM $f$, and thus the -optimization with respect to the data fidelity uses CG rather than the -prox of the `SVMBIRSquaredL2Loss` functional. +There are two versions of this example, solving the same problem in two +different ways. This version uses the data fidelity term as the ADMM $f$, +and thus the optimization with respect to the data fidelity uses CG rather +than the prox of the `SVMBIRSquaredL2Loss` functional, as in the +[other version](ct_svmbir_ppp_bm3d_admm_prox.rst). """ import numpy as np diff --git a/examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py b/examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py index d1cad9514..584ff4bc0 100644 --- a/examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py +++ b/examples/scripts/ct_svmbir_ppp_bm3d_admm_prox.py @@ -5,7 +5,7 @@ # with the package. """ -PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) +PPP (with BM3D) CT Reconstruction (ADMM with Fast SVMBIR Prox) ============================================================== This example demonstrates solution of a tomographic reconstruction @@ -14,12 +14,16 @@ :cite:`dabov-2008-image` as a denoiser and SVMBIR :cite:`svmbir-2020` for tomographic projection. -This version uses the data fidelity term as one of the ADMM $g$ -functionals so that the optimization with respect to the data fidelity is -able to exploit the internal prox of the `SVMBIRExtendedLoss` and -`SVMBIRSquaredL2Loss` functionals. +There are two versions of this example, solving the same problem in two +different ways. This version uses the data fidelity term as one of the +ADMM $g$ functionals so that the optimization with respect to the data +fidelity is able to exploit the internal prox of the `SVMBIRExtendedLoss` +and `SVMBIRSquaredL2Loss` functionals. The +[other version](ct_svmbir_ppp_bm3d_admm_cg.rst) solves the ADMM subproblem +corresponding to the data fidelity term via CG. -We solve the problem in two different ways: +Two ways of exploiting the SVMBIR internal prox are explored in this +example: 1. Using the `SVMBIRSquaredL2Loss` together with the BM3D pseudo-functional and a non-negative indicator function, and 2. Using the `SVMBIRExtendedLoss`, which includes a non-negativity diff --git a/examples/scripts/ct_svmbir_tv_multi.py b/examples/scripts/ct_svmbir_tv_multi.py index 96d6e1e9d..83627acfd 100644 --- a/examples/scripts/ct_svmbir_tv_multi.py +++ b/examples/scripts/ct_svmbir_tv_multi.py @@ -5,7 +5,7 @@ # with the package. """ -TV Regularized CT Reconstruction (Multiple Algorithms) +TV-Regularized CT Reconstruction (Multiple Algorithms) ====================================================== This example demonstrates the use of different optimization algorithms to From a1a9ed6f40233943b5d2245ff50cbbecc3a02473 Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Wed, 14 Sep 2022 11:56:31 -0600 Subject: [PATCH 28/30] Update submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index 914ec3b70..10391e0e0 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 914ec3b707de5301c84180bc3b2f220b78bf2428 +Subproject commit 10391e0e0cd974f11b9ebcc9795dbcdf6447378d From 7d947b31003e92e1c92a19692e8f0b4f6531a19a Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Wed, 14 Sep 2022 16:24:09 -0600 Subject: [PATCH 29/30] Update index --- examples/scripts/README.rst | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/examples/scripts/README.rst b/examples/scripts/README.rst index 946d6dc6c..a82de9c18 100644 --- a/examples/scripts/README.rst +++ b/examples/scripts/README.rst @@ -10,19 +10,19 @@ Computed Tomography ^^^^^^^^^^^^^^^^^^^ `ct_abel_tv_admm.py `_ - TV Regularized Abel Inversion + TV-Regularized Abel Inversion `ct_astra_noreg_pcg.py `_ CT Reconstruction with CG and PCG `ct_astra_tv_admm.py `_ - TV Regularized Few-View CT Reconstruction + TV-Regularized Sparse-View CT Reconstruction `ct_astra_weighted_tv_admm.py `_ - TV Regularized Low-Dose CT Reconstruction + TV-Regularized Low-Dose CT Reconstruction `ct_svmbir_tv_multi.py `_ - TV Regularized CT Reconstruction (Multiple Algorithms) + TV-Regularized CT Reconstruction (Multiple Algorithms) `ct_svmbir_ppp_bm3d_admm_cg.py `_ PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) `ct_svmbir_ppp_bm3d_admm_prox.py `_ - PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) + PPP (with BM3D) CT Reconstruction (ADMM with Fast SVMBIR Prox) `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ PPP (with BM3D) Fan-Beam CT Reconstruction @@ -92,7 +92,7 @@ Plug and Play Priors `ct_svmbir_ppp_bm3d_admm_cg.py `_ PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) `ct_svmbir_ppp_bm3d_admm_prox.py `_ - PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) + PPP (with BM3D) CT Reconstruction (ADMM with Fast SVMBIR Prox) `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ PPP (with BM3D) Fan-Beam CT Reconstruction `deconv_ppp_bm3d_admm.py `_ @@ -113,13 +113,13 @@ Total Variation ^^^^^^^^^^^^^^^ `ct_abel_tv_admm.py `_ - TV Regularized Abel Inversion + TV-Regularized Abel Inversion `ct_astra_tv_admm.py `_ - TV Regularized Few-View CT Reconstruction + TV-Regularized Sparse-View CT Reconstruction `ct_astra_weighted_tv_admm.py `_ - TV Regularized Low-Dose CT Reconstruction + TV-Regularized Low-Dose CT Reconstruction `ct_svmbir_tv_multi.py `_ - TV Regularized CT Reconstruction (Multiple Algorithms) + TV-Regularized CT Reconstruction (Multiple Algorithms) `deconv_circ_tv_admm.py `_ Circulant Blur Image Deconvolution with TV Regularization `deconv_tv_admm.py `_ @@ -163,17 +163,17 @@ ADMM ^^^^ `ct_abel_tv_admm.py `_ - TV Regularized Abel Inversion + TV-Regularized Abel Inversion `ct_astra_tv_admm.py `_ - TV Regularized Few-View CT Reconstruction + TV-Regularized Sparse-View CT Reconstruction `ct_astra_weighted_tv_admm.py `_ - TV Regularized Low-Dose CT Reconstruction + TV-Regularized Low-Dose CT Reconstruction `ct_svmbir_tv_multi.py `_ - TV Regularized CT Reconstruction (Multiple Algorithms) + TV-Regularized CT Reconstruction (Multiple Algorithms) `ct_svmbir_ppp_bm3d_admm_cg.py `_ PPP (with BM3D) CT Reconstruction (ADMM with CG Subproblem Solver) `ct_svmbir_ppp_bm3d_admm_prox.py `_ - PPP (with BM3D) CT Reconstruction (ADMM with SVMBIR Fast Prox) + PPP (with BM3D) CT Reconstruction (ADMM with Fast SVMBIR Prox) `ct_fan_svmbir_ppp_bm3d_admm_prox.py `_ PPP (with BM3D) Fan-Beam CT Reconstruction `deconv_circ_tv_admm.py `_ @@ -212,7 +212,7 @@ Linearized ADMM ^^^^^^^^^^^^^^^ `ct_svmbir_tv_multi.py `_ - TV Regularized CT Reconstruction (Multiple Algorithms) + TV-Regularized CT Reconstruction (Multiple Algorithms) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising @@ -221,7 +221,7 @@ PDHG ^^^^ `ct_svmbir_tv_multi.py `_ - TV Regularized CT Reconstruction (Multiple Algorithms) + TV-Regularized CT Reconstruction (Multiple Algorithms) `denoise_tv_multi.py `_ Comparison of Optimization Algorithms for Total Variation Denoising `denoise_cplx_tv_pdhg.py `_ From 69a2c1a7178e288300307a078d6a066083cec9bb Mon Sep 17 00:00:00 2001 From: Brendt Wohlberg Date: Wed, 14 Sep 2022 16:24:25 -0600 Subject: [PATCH 30/30] Update submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index 10391e0e0..33f1e13ad 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 10391e0e0cd974f11b9ebcc9795dbcdf6447378d +Subproject commit 33f1e13ad122ff094ab81be8fac5c24e14bcd5e5