"Fat-Tail" Richardson-Lucy Deconvolution in MaximDL

Deconvolution without Mottling



Quick Start

Download "Fat Tail" Richardson-Lucy script for MaximDL.

To install: right click above link and select "Save As". Then save the file anywhere you like on your computer. It is convenient to put it in a folder that is easy to navigate to from your image folders. Then, in MaximDL, first set up "User Defined Kernel Filter 12" as shown below. Then, click File->RunScript and select the script from the file selection window. The plug-in will prompt for three values...


BEFORE
~
AFTER
GAUSSIAN (10 iters)
AFTER
FAT-TAILED (10 iters)

For details read on...

I have made extensive use of the Richardson-Lucy deconvolution scripts I posted at deconv_MaximDL.html for quite some time. While the scripts posted there work very well, it is invariably the case that, if I push the algorithm for too many iterations, ugly "mottling" artifacts appear as shown in the middle image above. It turns out that the main cause of this mottling is that the point-spread function (PSF) I used for the deconvolution doesn't properly match the true PSF. Upon investigation, there seems to be at least two reasons for the PSF mismatch.

First Problem: Mismatch between FWHM and Radius in Gaussian Kernel

The first culprit is that often the "spread" of the PSF used for the algorithm simply doesn't match the correct PSF spread. Here's how I've been doing it. I use MaximDL's information window to read off the full-with half-max (FWHM) and provide this as input to the "Gaussian" deconvolution script. The script then takes half of this value to get an effective radius and then, as its key step, invokes the Gaussian kernel filter using this radius. To check the correctness of using one half of the FWHM, I made an artificial PSF using Edit Pixels to make a single white pixel on a black field and then I invoked the Gaussian kernel using a specific radius of 2.85 (which is half of the FWHM measured off of my Eagle nebula raw images). The resulting PSF is shown here (enlarged 400 percent for easier viewing)...

GAUSSIAN KERNEL
RADIUS 2.85
TRUE
FWHM 5.7

Here's the result of running the deconvolution algorithm for 10 iterations first declaring a FWHM of 5.7 and then declaring a smaller value (4.8) chosen to give the correct spread...

DECLARING FWHM=5.7
DECLARING FWHM=4.8

The second image is slightly better but it still has that ugly mottled look to it.

Second Problem: True PSF's are not Gaussian

True PSF's decay like the inverse of the distance squared whereas a Gaussian PSF decays exponentially fast. One can say that true PSF's have "fat tails" compared to Gaussians. So, I set out to make a deconvolution script that uses a PSF that more closely matches a truly fat tailed PSF. To do this in MaximDL, I set up "User Defined Kernel Filter 12" as follows...

In my new script, this kernel is call repeatedly to build up a fat-tailed PSF that matches a specified FWHM. Here's the result...

Note that the ugly mottling has all but disappeared.

It is interesting to compare the fat-tailed PSF with a closely matched Gaussian PSF...

Fat-Tailed PSF
Linear Stretch
Gaussian PSF
Linear Stretch
Difference
Fat-Gauss
Log stretch
Log stretch

The difference, shown in the third column, and the log stretches, shown in the bottom row, reveal that there is more to the difference between these PSF's than just fat-tailed vs. gaussian. The gaussian kernel in MaximDL is of course truncated at a certain window size (for efficiency sake). But, maybe it is truncated with a window that is too small. And, maybe that is the source of the mottling. Resolving this question is left for future investigations. For the moment, I'm happy that the new algorithm works much better than the old one.

Acknowledgement: Mark Crossley made improvements to the original version of this script. The basic formulas are the same, but the script now gives more user friendly feedback.