I’m looking for a flexible way to correct for auto-fluorescence in images from confocal microscopy (e.g. the nematode C. elegans is known to contain auto-fluorescent material interfering with the emission spectrum of green fluorescent protein, GFP).
Consider images acquired simultaneously with a two-camera setup:
- using a band-pass filter for GFP in channel 1, and
- a long-pass filter recording the auto-fluorescence in channel 2.
I am aware of the Spectral Unmixing plugin, but was interested in alternative (and possibly more automatable) ways to separate the two fluorophores in case of auto-fluorescence. (The plugin requires selection of ROIs known to have signal originating from single fluorophores, whereas I suppose that the characteristics of auto-fluorescence could likely also be automatically detected from a 2D histogram of the two channels.)
My intended workflow would be something along these lines:
Get a 2D histogram (I don’t think there’s an op for it yet, is there?):
#@ Dataset input #@ OpService ops ch1 = ops.transform().hyperSliceView(input, 2, 0) ch2 = ops.transform().hyperSliceView(input, 2, 1) import net.imglib2.histogram.Integer1dBinMapper import net.imglib2.histogram.HistogramNd ch1mapper = new Integer1dBinMapper(0, 512, false) ch2mapper = new Integer1dBinMapper(0, 512, false) histogram = new HistogramNd([ch1, ch2], [ch1mapper, ch2mapper])
In the histogram image (since
HistogramNd implements Img<LongType>), we can select a region (manually or semi-automatically) that corresponds to our auto-fluorescent (= colocalizing) signal.
This is where I see some overlap with the coloc ops (like determining thresholds for both channels), right? @etadobson, @ctrueden
From the selected region in the histogram, we should be able to fit a (linear?) function (how can we do this?)
In the original image, using the derived function, we subtract (using ops) the auto-fluorescence from the GFP signal, which gives us the (single) channel of interest. (with
image.equation? or using a sequence of
Does this workflow make sense? Does anybody have different solutions (scriptable or not)?
I’d be happy to see what others think.