MRtrix3 / mrtrix3

MRtrix3 provides a set of tools to perform various advanced diffusion MRI analyses, including constrained spherical deconvolution (CSD), probabilistic tractography, track-density imaging, and apparent fibre density
http://www.mrtrix.org
Mozilla Public License 2.0
294 stars 181 forks source link

ENH dwidenoise: Overcomplete local PCA #3024

Closed Lestropie closed 6 days ago

Lestropie commented 1 month ago

https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0073021

Currently, in dwidenoise, the reconstructed signal for a given voxel is determined exclusively by the reduced-rank PCA decomposition from the sliding spatial window kernel when centred at that voxel.

What can be done instead is that the output intensities for a given voxel can be a weighted average of the rank-reduced decompositions of multiple positions of the sliding spatial window kernel; ie. not exclusively when the sliding window is centred at that same voxel. In the article cited above these weights are determined based on the number of components of each decomposition; I could imagine hypothetically that spatial proximity of the output reconstructed voxel to the centre of the kernel could also be used. This might make denoised outputs less sensitive to threshold effects on preservation / rejection of particular components.

Would need to either:

The former is probably safer as RAM requirements could get quite large with the latter.

Lestropie commented 1 week ago

Given I've gotten myself hooked on denoising improvements over the last week, I think I'd like to take this on.

I am however interested to know if anybody has thoughts on what the recombination should look like. For each output image voxel, there is a set of denoising patches of which that voxel is a member. For each of those patches, there will be both an estimated signal rank, and a distance between the centre of the patch and the voxel. So one needs some algebraic expression that aggregates the reconstructed output intensities for that voxel from the different patches:

I suspect there will need to be support for multiple such expressions.

Also, in the scenario where no patch aggregation is performed, ideally the code should persist with the current optimisations where only the PCA projection of the signal in the voxel at the centre of the patch is computed, whereas for overcomplete variants the PCA projection for the whole patch will need to be computed.