Last active
May 28, 2024 10:13
-
-
Save romainGuiet/3dc23527406205b36c41b1baf41240cc to your computer and use it in GitHub Desktop.
An ImageJ macro to determine False Positive threshold on control images. #BIOP #FIJI #Macro #Coloc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#@File image_path | |
#@Integer(value=1) ch_idx | |
#@Boolean(value=true) closeImages | |
table_name = "FP_thresholds"; | |
open(image_path ); | |
img_name = getTitle(); | |
print(img_name); | |
run("Duplicate...", "title=ch"+ch_idx+" duplicate channels="+ch_idx); | |
getDimensions(width, height, channels, slices, frames); | |
if ( bitDepth() == 8){ | |
greyValue = 256 ; | |
} else if ( bitDepth() == 16){ | |
greyValue = 65536 ; | |
} else { | |
return; | |
} | |
total_pixelNbr = width*height*slices ; | |
print ("Total Pixel Number : "+total_pixelNbr); | |
run("Clear Results"); | |
if (slices >1){ | |
Stack.setSlice( 1 ); | |
getHistogram(values, counts, greyValue); | |
for (slc = 2; slc <= slices; slc++) { | |
Stack.setSlice( slc ); | |
getHistogram(values, counts_v, greyValue); | |
for (i = 0; i < counts.length; i++) { | |
counts[i] += counts_v[i]; | |
} | |
} | |
}else{ | |
getHistogram(values, counts, greyValue); | |
} | |
// sum content of each bin | |
bins_sum = 0; | |
for ( bin_i = counts.length-1; bin_i >= 0; bin_i--) { | |
bins_sum += counts[bin_i]; | |
setResult("Bin", nResults, bin_i); | |
setResult("Count", nResults-1, counts[bin_i]); | |
setResult("Count (Sum)", nResults-1, bins_sum); | |
} | |
updateResults(); | |
bins_sum_array = Table.getColumn("Count (Sum)"); | |
bins_fromTop_array = Table.getColumn("Bin"); | |
// Find value for : False Positive ZERO | |
idx_FPZero = findThresholdValue(bins_sum_array, 0); | |
if ( idx_FPZero == 0 ){ | |
idx_FPZero = 1; | |
print ("False Positive ZERO : YOUR IMAGE IS SATURATED"); | |
}else{ | |
print( "False Positive ZERO : "+bins_fromTop_array[idx_FPZero-1]);// idy is the one who is above threshold, take idx-1 | |
} | |
// Find value for : False Positive Tolerance | |
tol1 = 0.1 ; | |
tol2 = 0.01 ; | |
tol3 = 0.001; | |
pixelCount_tol1 = round (width*height*slices*tol1 /100); | |
pixelCount_tol2 = round (width*height*slices*tol2 /100); | |
pixelCount_tol3 = round (width*height*slices*tol3 /100); | |
idx_FPTol1 = findThresholdValue(bins_sum_array, pixelCount_tol1 ); | |
idx_FPTol2 = findThresholdValue(bins_sum_array, pixelCount_tol2 ); | |
idx_FPTol3 = findThresholdValue(bins_sum_array, pixelCount_tol3 ); | |
if (isOpen(table_name)){ | |
selectWindow(table_name); | |
}else { | |
Table.create(table_name); | |
} | |
row = Table.size; | |
if (row < 0 ) row =0; | |
row = Table.size; | |
Table.set("Image name" , row, img_name); | |
Table.set("Channel" , row, ch_idx); | |
Table.set("False Positive - %" , row, tol1); | |
Table.set("False Positive - Pixel count" , row, pixelCount_tol1); | |
Table.set( "Threshold value " , row, bins_fromTop_array[idx_FPTol1-1]); | |
row = Table.size; | |
Table.set("Image name" , row, img_name); | |
Table.set("Channel" , row, ch_idx); | |
Table.set("False Positive - %" , row, tol2); | |
Table.set("False Positive - Pixel count" , row, pixelCount_tol2); | |
Table.set( "Threshold value " , row, bins_fromTop_array[idx_FPTol2-1]); | |
row = Table.size; | |
Table.set("Image name" , row, img_name); | |
Table.set("Channel" , row, ch_idx); | |
Table.set("False Positive - %" , row, tol3); | |
Table.set("False Positive - Pixel count" , row, pixelCount_tol3); | |
Table.set( "Threshold value " , row, bins_fromTop_array[idx_FPTol3-1]); | |
row = Table.size; | |
Table.set("Image name" , row, img_name); | |
Table.set("Channel" , row, ch_idx); | |
Table.set("False Positive - %" , row, 0); | |
Table.set("False Positive - Pixel count" , row, 0); | |
Table.set( "Threshold value " , row, bins_fromTop_array[idx_FPZero-1] ); | |
if (closeImages){ | |
run("Close All"); | |
} | |
/* | |
* | |
*/ | |
function findThresholdValue(array, threshold){ | |
continueSearch = true ; | |
idx = 0 ; | |
while ( continueSearch ){ | |
if ( bins_sum_array[idx] > threshold ) continueSearch = false ; | |
else idx++; | |
} | |
return idx; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment