1.4. Phase diversity¶
1.4.1. Introduction¶
If only one object is used but observed with two cameras, one of them with a defocus, the phase diversity technique can be used to recover the phase of the object.
1.4.2. Example¶
This example shows the deconvolution of IMaX data. Since the telescope is barely affected by the Earth atmosphere turbulence, we deconvolve the whole field of view with a single PSF. Mosaicking can be used to allow for changes in the PSF across the field of view. First we define a configuration file that controls the general behavior of the deconvolution. This configuration file can also be defined in the code as a dictionary:
telescope:
diameter: 100.0
central_obscuration : 0.0
images:
n_pixel : 952
pix_size : 0.055
apodization_border : 0
object1:
wavelength: 5250.0
image_filter: tophat
cutoff: [0.75, 0.80]
optimization:
gpu : 0
transform : softplus
softplus_scale : 1.0
lr_obj : 0.02
lr_modes : 0.08
regularization:
iuwt1:
variable : object
lambda : 0.00
nbands : 5
psf:
model : zernike
nmax_modes : 44
initialization:
object : contrast
modes_std : 0.0
annealing:
type: sigmoid
start_pct : 0.0
end_pct : 0.85
The deconvolution can be carried out by the following code, where we calculate the diversity as
f = fits.open('imax_focus.fits')
im_focus = f[0].data
f.close()
f = fits.open('imax_defocus.fits')
im_defocus = f[0].data
f.close()
# ns, nf, nx, ny
nx, ny = im_focus.shape
frames_focus = np.zeros((1, 1, nx, ny))
frames_defocus = np.zeros((1, 1, nx, ny))
frames_focus[0, 0, :, :] = im_focus
frames_defocus[0, 0, :, :] = im_defocus
mn = np.mean(frames_focus, axis=(-1, -2), keepdims=True)
frames_focus /= mn
frames_defocus /= mn
frames_focus = torch.tensor(frames_focus.astype('float32'))
frames_defocus = torch.tensor(frames_defocus.astype('float32'))
sigma = torchmfbd.compute_noise(frames_focus)
sigma = torch.tensor(sigma.astype('float32'))
decSI = torchmfbd.Deconvolution('imax.yaml')
div = torchmfbd.get_diversity(defocus=1.0, FD=45.0, wavelength=5250.0)
decSI.add_frames(frames_focus, sigma, id_object=0, id_diversity=0, diversity=0.0)
decSI.add_frames(frames_defocus, sigma, id_object=0, id_diversity=1, diversity=div)
decSI.deconvolve(infer_object=False,
optimizer='first',
simultaneous_sequences=1,
n_iterations=100)
We have used the torchmfbd.get_diversity
function to return the diversity coefficient