diff --git a/myosoft-imcf_manual_rerun.py b/myosoft-imcf_manual_rerun.py new file mode 100644 index 0000000000000000000000000000000000000000..98c3c33ac7514c11646811c1e90a1da4b21d8ceb --- /dev/null +++ b/myosoft-imcf_manual_rerun.py @@ -0,0 +1,190 @@ +from ij import IJ, WindowManager as wm +from ij.gui import WaitForUserDialog +import os + +#@ ImagePlus raw +#@ RoiManager rm +#@ ResultsTable rt +#@ File (label="Select directory for output", style="directory") output_dir +#@ Integer (label="Measure in this channel", style="slider", min=1, max=5, value=1) measurement_channel + + +def fix_ij_dirs(path): + """use forward slashes in directory paths + + Parameters + ---------- + path : string + a directory path obtained from dialogue or script parameter + + Returns + ------- + string + a more robust path with forward slashes as + """ + + fixed_path = str(path).replace("\\", "/") + fixed_path = fixed_path + "/" + + return fixed_path + + +def fix_BF_czi_imagetitle(imp): + image_title = os.path.basename( imp.getTitle() ) + image_title = image_title.replace(".czi", "") + image_title = image_title.replace(" ", "_") + image_title = image_title.replace("_-_", "") + image_title = image_title.replace("__", "_") + image_title = image_title.replace("#", "Series") + + return image_title + + +def renumber_rois(rm): + """rename all ROIs in the RoiManager according to their number + + Parameters + ---------- + rm : RoiManager + a reference of the IJ-RoiManager + """ + number_of_rois = rm.getCount() + for roi in range( number_of_rois ): + rm.rename( roi, str(roi + 1) ) + + +def measure_in_all_rois( imp, channel, rm ): + """measures in all ROIS on a given channel of imp all parameters that are set in IJ "Set Measurements" + + Parameters + ---------- + imp : ImagePlus + the imp to measure on + channel : integer + the channel to measure in. starts at 1. + rm : RoiManager + a reference of the IJ-RoiManager + """ + imp.setC(channel) + rm.runCommand(imp,"Deselect") + rm.runCommand(imp,"Measure") + + +def extract_color_of_all_rois(rm): + """get the RGB color of ROIs in the RoiManager and match it to the colors name string + + Parameters + ---------- + rm : RoiManager + the IJ-RoiManager + + Returns + ------- + array + an array containing the corresponding color name string for each roi in the ROiManager + """ + rgb_color_lookup = { + -65536: "red", + -65281: "magenta", + -16711936: "green", + -256: "yellow", + -1: "white", + -16776961: "blue", + -16777216: "black", + -14336: "orange", + -16711681: "cyan" + } + + all_rois = rm.getRoisAsArray() + roi_colors = [] + for roi in all_rois: + if roi.getStrokeColor() == None: + roi_colors.append(rgb_color_lookup[roi.getColor().getRGB()]) + else: + roi_colors.append(rgb_color_lookup[roi.getStrokeColor().getRGB()]) + + return roi_colors + + +def save_all_rois(rm, target): + """save all ROIs in the RoiManager as zip to target path + + Parameters + ---------- + rm : RoiManager + a reference of the IJ-RoiManager + target : string + the path in to store the ROIs. e.g. /my-images/resulting_rois.zip + """ + rm.runCommand("Save", target) + + +def add_results_to_resultstable( rt, column, values ): + """add values to the ResultsTable starting from row 0 of a given column + + Parameters + ---------- + rt : ResultsTable + a reference of the IJ-ResultsTable + column : string + the column in which to add the values + values : array + tarray with values to be added + """ + for i in range( len( values ) ): + rt.setValue(column, i, values[i]) + + rt.show("Results") + + +def enhance_contrast( imp ): + """use "Auto" Contrast & Brightness settings in each channel of imp + + Parameters + ---------- + imp : ImagePlus + the imp on which to change C&B + """ + for channel in range( imp.getDimensions()[2] ): + imp.setC(channel + 1) # IJ channels start at 1 + IJ.run(imp, "Enhance Contrast", "saturated=0.35") + + +def show_all_rois_on_image(rm, imp): + """shows all ROIs in the ROiManager on imp + + Parameters + ---------- + rm : RoiManager + a reference of the IJ-RoiManager + imp : ImagePlus + the imp on which to show the ROIs + """ + imp.show() + rm.runCommand(imp,"Show All") + + +output_dir = fix_ij_dirs(output_dir) +rt.reset() +raw_image_title = fix_BF_czi_imagetitle(raw) +renumber_rois(rm) +save_all_rois( rm, output_dir + "manual_rerun_all_fiber_rois_color-coded.zip" ) +roi_colors = extract_color_of_all_rois(rm) +WaitForUserDialog("Choose measurements", "Set measurements in Analyze > Set Measurements, then click OK").show() +measure_in_all_rois(raw, measurement_channel, rm) +add_results_to_resultstable(rt, "ROI color", roi_colors ) +rt.save(output_dir + "manual_rerun_results.csv") + +# dress up the original image, save a overlay-png, present original to the user +raw.show() +show_all_rois_on_image( rm, raw ) +raw.setDisplayMode(IJ.COMPOSITE) +enhance_contrast( raw ) +IJ.run("From ROI Manager", "") # ROIs -> overlays so they show up in the saved png +qc_duplicate = raw.duplicate() +IJ.saveAs(qc_duplicate, "PNG", output_dir + raw_image_title + "_manual_rerun") +qc_duplicate.close() +wm.toFront( raw.getWindow() ) +IJ.run("Remove Overlay", "") +raw.setDisplayMode(IJ.GRAYSCALE) +show_all_rois_on_image( rm, raw ) \ No newline at end of file