cabouman / svmbir

Fast code for parallel or fan beam tomographic reconstruction
BSD 3-Clause "New" or "Revised" License
19 stars 8 forks source link

Automated parameter selection #17

Closed cabouman closed 3 years ago

cabouman commented 4 years ago

I think we need to provide some help to users in setting parameters. The unit-less parameters have natural default values T = 1 p = 1.2 q = 2

However, it's really difficult for people to set sigma_x and sigma_y . Here is how we might handle it for the case when weight_type=0 and the weighting is just 1/sigma_y for all sinogram entries. It would need to be generalized to handle more general weightings.

We define the new svmbir input parameters: avg_y sigma_y_rel sigma_x sigma_x_rel

Given by

avg_y [ value>0, default = 1 , This parameter can be set by the user to the approximate average sinogram value] sigma_y_rel [ value>0, default = 1 ]

sigma_x [ value>0, default = (0.1 avg_y)/(delta_channel num_channels * min(img_size_x_rel, img_size_y_rel) ) ] sigma_x_rel [ value>0, default = 1 ]

Then we call the sv-mbir C code parameters to the following values:

SigmaY = avg_y * sigma_y_rel
SigmaX = sigma_x * sigma_x_rel

When they call svmbir, they would do something like:

sino_average = numpy.average(sino), x = svmbir.recon(sino, angles, weight, num_threads=20, avg_y = sino_average, center_offset=-6, img_downsamp=4, max_iterations=10)

This interface would default to reasonable parameter values as long as avg_y is equal to something close to the average sinogram value. Once they get a reasonable reconstruction, they can adjust the regularization by changing sigma_x_rel. Increasing sigma_x_rel >1 would make the reconstruction sharper, and decreasing 0< sigma_x_rel <1 would make it blurrier.

So for example, if they want to make the image sharper, they would do something like:

x = svmbir.recon(sino, angles, weight, num_threads=20, avg_y = sino_average, sigma_x_rel = 1.2, center_offset=-6, img_downsamp=4, max_iterations=10)

In addition, the interface would still support the original direct syntax of setting the value of sigma_x. For example:

x = svmbir.recon(sino, angles, weight, num_threads=20, avg_y = sino_average, sigma_x=0.6350, center_offset=-6, img_downsamp=4, max_iterations=10)

cabouman commented 3 years ago

Issue fixed by new interface