Photobleaching Correction -3D time series

There are several IJ tools available for 2D time series bleaching correction, but seems not with 3D:

2D-t tools:

Among these, exponential decay method is theoretically clean (but in practice, timeseries are not teoretical…).


Anycase, there should be 3D-t bleach correction tool (and I need it NOW). I might make some quick solution using two methods, one using division of first frame and the other with exponential fitting.

By the way, bleaching corrected images cannot basically be used for intensity quantification (FRAP, on the other hands, correct bleaching after measuring the raw image). If you are analyzing shapes or positions, no problem for quantification.


here is the “ratio” version:

macro "Bleach Corection 3D-t by ratio"{
	run("Duplicate...", "title=bleach_corrected duplicate");
	getDimensions(width, height, channels, slices, frames);
	if (frames == 1) {
		uslices = getNumber("how many z slices/timepoint?", 1);
		if ((slices%uslices) !=0) exit("that slice number dows not match with the current stack");
		frames = slices / uslices;
	}
	tIntA = newArray(frames);
	setBatchMode(true);
	for(i=0; i<frames; i++){
		startf = (i*slices)+1;
		endf = (i+1)*slices;
		op ="start="+startf+" stop="+endf+" projection=[Sum Slices]";
		run("Z Project...", op);
		//print(op);
		getRawStatistics(nPixels, mean);
		if (i==0) tIntA[i] = mean;
		else tIntA[i] = mean/tIntA[0];
		close();
	}
	setBatchMode("exit and display");
	tIntA[0] =1;
	for(i=0; i<frames; i++){
		for(j=0; j<slices; j++){
			curframe = i*slices + j+1;
			setSlice(curframe);
			//print("frame"+curframe + " factor" + tIntA[i]);
			op = "value="+tIntA[i]+" slice";
			run("Divide...", op);
		}
		print("time point:"+i+1 + "  factor" + tIntA[i]);
	}	
}


Before Correction (each row is a time point, with 8 z-slices)
 Before each row is a time point Average intensity along stack slices. 5 peaks corresponds to 5 time points. Before


After Correction
After After