Hansen-Law

Introduction

The Hansen and Law transform is the work of E. W. Hansen and P.-L. Law [1].

From the abstract:

... new family of algorithms, principally for Abel inversion, that are recursive and hence computationally efficient. The methods are based on a linear, space-variant, state-variable model of the Abel transform. The model is the basis for deterministic algorithms, applicable when data are noise free, and least-squares estimation (Kalman filter) algorithms, which accommodate the noisy data case.

The key advantage of the algorithm is its computational simplicity that amounts to only a few lines of code.

How it works

projection diag

Projection geometry (Fig. 1 [1])

image function \(f(r)\), projected function \(g(R)\)

forward Abel transform

\[g(R) = 2 \int_R^\infty \frac{f(r) r}{\sqrt{r^2 - R^2}} dr\]

inverse Abel transform

\[f(r) = -\frac{1}{\pi} \int_r^\infty \frac{g^\prime(R)}{\sqrt{R^2 - r^2}} dR\]

The Hansen and Law method makes use of a coordinate transformation, which is used to model the Abel transform, and derive reconstruction filters. The Abel transform is treated as a system modeled by a set of linear differential equations. In this framework the forward Abel transform \(g(R)\) is the solution of a differential equation with \(f(r)\) as its driving function. Similarly, the Abel inversion \(f(r)\) is a solution of a differential equation with \(g^\prime(R)\) as its driving function.

recursion

Recursion: pixel value from adjacent outer-pixel

forward transform

\[\begin{split}x_{n+1} &= \Phi_n x_n + \Gamma_n f_n\end{split}\]\[\begin{split}g_n &= \tilde{C} x_n\end{split}\]

inverse transform

\[\begin{split}x_{n+1} &= \Phi_n x_n + \Gamma_n g^\prime_n\end{split}\]\[\begin{split}f_n &= \tilde{C} x_n\end{split}\]

Note the only difference between the forward and inverse algorithms is the exchange of \(f_n\) with \(g^\prime_n\) (or \(g_n\)).



\(\Phi_n\) and \(\Gamma_n\) are functions with predetermined parameter constants, all listed in [1].

The algorithm iterates along each individual row of the image, starting at the out edge, ending at the center-line. Since all rows in an image can be processed simultaneously, the operation can be easily vectorized and is therefore numerically efficient.

When to use it

The Hansen-Law algorithm offers one of the fastest, most robust methods for both the forward and inverse transforms. It requires reasonably fine sampling of the data to provide exact agreement with the analytical result, but otherwise this method is a hidden gem of the field.

How to use it

To complete the forward or inverse transform of a full image with the hansenlaw method, simply use the abel.Transform: class

abel.Transform(myImage, method='hansenlaw', direction='forward').transform
abel.Transform(myImage, method='hansenlaw', direction='inverse').transform

If you would like to access the Hansen-Law algorithm directly (to transform a right-side half-image), you can use abel.hansenlaw.hansenlaw_transform().

Tips

hansenlaw tends to perform better with images of large size \(n \gt 1001\) pixel width. For smaller images the angular_integration (speed) profile may look better if sub-pixel sampling is used via:

angular_integration_options=dict(dr=0.5)

Historical Note

The Hansen and Law algorithm was almost lost to the scientific community. It was rediscovered by Jason Gascooke (Flinders University, South Australia) for use in his velocity-map image analysis, and written up in his PhD thesis:

J. R. Gascooke, PhD Thesis: “Energy Transfer in Polyatomic-Rare Gas Collisions and Van Der Waals Molecule Dissociation”, Flinders University (2000). Available in PDF format <https://github.com/PyAbel/abel_info/blob/master/Gascooke_Thesis.pdf>