Skip to content
Snippets Groups Projects
Commit 2ef8b8cc authored by Laurent Guerard's avatar Laurent Guerard
Browse files

Add compatibility with container files and formatting

parent 8ad0e271
No related branches found
No related tags found
No related merge requests found
...@@ -67,6 +67,7 @@ from ij.plugin import Duplicator, ImageCalculator, RoiEnlarger ...@@ -67,6 +67,7 @@ from ij.plugin import Duplicator, ImageCalculator, RoiEnlarger
from imcflibs import pathtools from imcflibs import pathtools
from imcflibs.imagej import bioformats as bf from imcflibs.imagej import bioformats as bf
from imcflibs.imagej import misc from imcflibs.imagej import misc
from loci.formats import ImageReader, MetadataTools
# ─── Functions ──────────────────────────────────────────────────────────────── # ─── Functions ────────────────────────────────────────────────────────────────
...@@ -625,6 +626,62 @@ def setup_defined_ij(rm, rt): ...@@ -625,6 +626,62 @@ def setup_defined_ij(rm, rt):
IJ.log("\\Clear") IJ.log("\\Clear")
def get_series_info_from_ome_metadata(path_to_file, skip_labels=False):
"""Get the Bio-Formates series count from a file on disk.
Useful to access a specific image in a container format like .czi, .nd2, .lif...
Parameters
----------
path_to_file : str
The full path to the image file.
Returns
-------
int
The number of Bio-Formats series detected in the image file metadata.
"""
if not skip_labels:
reader = ImageReader()
reader.setFlattenedResolutions(False)
ome_meta = MetadataTools.createOMEXMLMetadata()
reader.setMetadataStore(ome_meta)
reader.setId(path_to_file)
series_count = reader.getSeriesCount()
reader.close()
return series_count, range(series_count)
else:
reader = ImageReader()
# reader.setFlattenedResolutions(True)
ome_meta = MetadataTools.createOMEXMLMetadata()
reader.setMetadataStore(ome_meta)
reader.setId(path_to_file)
series_count = reader.getSeriesCount()
series_ids = []
series_names = []
x = 0
y = 0
for i in range(series_count):
reader.setSeries(i)
if reader.getSizeX() > x and reader.getSizeY() > y:
name = ome_meta.getImageName(i)
if name not in ["label image", "macro image"]:
series_ids.append(i)
series_names.append(name)
x = reader.getSizeX()
y = reader.getSizeY()
print(series_names)
return len(series_ids), series_ids
# ─── Main Code ──────────────────────────────────────────────────────────────── # ─── Main Code ────────────────────────────────────────────────────────────────
if __name__ == "__main__": if __name__ == "__main__":
...@@ -643,21 +700,69 @@ if __name__ == "__main__": ...@@ -643,21 +700,69 @@ if __name__ == "__main__":
# open image using Bio-Formats # open image using Bio-Formats
file_info = pathtools.parse_path(file) file_info = pathtools.parse_path(file)
misc.progressbar(index + 1, len(file_list), 1, "Opening : ") misc.progressbar(index + 1, len(file_list), 1, "Opening : ")
raw = bf.import_image(file_info["full"])[0]
# get image info
raw_image_calibration = raw.getCalibration()
raw_image_title = fix_BF_czi_imagetitle(raw)
print("raw image title: ", str(raw_image_title))
# take care of paths and directories _, series_index = get_series_info_from_ome_metadata(
output_dir = os.path.join( file_info["full"], skip_labels=True
out_dir_info["full"], str(raw_image_title), "1_identify_fibers"
) )
print("output_dir: ", str(output_dir)) print(series_index)
for list_index, serie_index in enumerate(series_index):
misc.progressbar(list_index + 1, len(series_index), 2, "Opening serie : ")
raw = bf.import_image(file_info["full"], series_number=serie_index)[0]
# get image info
raw_image_calibration = raw.getCalibration()
raw_image_title = fix_BF_czi_imagetitle(raw)
print("raw image title: ", str(raw_image_title))
# take care of paths and directories
output_dir = os.path.join(
out_dir_info["full"], str(raw_image_title), "1_identify_fibers"
)
print("output_dir: ", str(output_dir))
if not os.path.exists(str(output_dir)):
os.makedirs(str(output_dir))
# update the log for the user
misc.timed_log("Now working on " + str(raw_image_title))
if raw_image_calibration.scaled() is False:
IJ.log(
"Your image is not spatially calibrated! Size measurements are only possible in [px]."
)
# Only print settings once for the first file and first series
if index == 0 and serie_index == 0:
IJ.log(" -- settings used -- ")
IJ.log("area = " + str(minAr) + "-" + str(maxAr))
IJ.log("perimeter = " + str(minPer) + "-" + str(maxPer))
IJ.log("circularity = " + str(minCir) + "-" + str(maxCir))
IJ.log("ROI expansion [microns] = " + str(enlarge_radius))
IJ.log("Membrane channel = " + str(membrane_channel))
IJ.log("MHC positive fiber channel = " + str(fiber_channel))
# IJ.log("sub-tiling = " + str(tiling_factor))
IJ.log(" -- settings used -- ")
# image (pre)processing and segmentation (-> ROIs)# imp, firstC, lastC, firstZ,
# lastZ, firstT, lastT
membrane = Duplicator().run(
raw, membrane_channel, membrane_channel, 1, 1, 1, 1
)
if not os.path.exists(str(output_dir)): if not os.path.exists(str(output_dir)):
os.makedirs(str(output_dir)) os.makedirs(str(output_dir))
imp_bgd_corrected = do_background_correction(membrane)
IJ.run("Conversions...", "scale")
IJ.run(imp_bgd_corrected, "16-bit", "")
imp_result = run_tm(
imp_bgd_corrected,
1,
cellpose_dir.getPath(),
PretrainedModel.CYTO2,
30.0,
area_thresh=[minAr, maxAr],
circularity_thresh=[minCir, maxCir],
perimeter_thresh=[minPer, maxPer],
)
# update the log for the user # update the log for the user
misc.timed_log("Now working on " + str(raw_image_title)) misc.timed_log("Now working on " + str(raw_image_title))
...@@ -700,84 +805,126 @@ if __name__ == "__main__": ...@@ -700,84 +805,126 @@ if __name__ == "__main__":
os.path.join(output_dir, raw_image_title + "_all_fibers_binary"), os.path.join(output_dir, raw_image_title + "_all_fibers_binary"),
) )
command.run(Labels2CompositeRois, True, "rm", rm, "imp", imp_result).get() IJ.saveAs(
imp_result,
"Tiff",
os.path.join(
output_dir,
raw_image_title + "_" + str(serie_index) + "_all_fibers_binary",
),
)
enlarge_all_rois(enlarge_radius, rm, raw_image_calibration.pixelWidth) command.run(Labels2CompositeRois, True, "rm", rm, "imp", imp_result).get()
renumber_rois(rm)
save_all_rois(
rm, os.path.join(output_dir, raw_image_title + "_all_fiber_rois.zip")
)
# check for positive fibers enlarge_all_rois(enlarge_radius, rm, raw_image_calibration.pixelWidth)
if fiber_channel > 0: renumber_rois(rm)
if min_fiber_intensity == 0: save_all_rois(
min_fiber_intensity = get_threshold_from_method(
raw, fiber_channel, "Mean"
)[0]
IJ.log("automatic intensity threshold detection: True")
IJ.log("fiber intensity threshold: " + str(min_fiber_intensity))
change_all_roi_color(rm, "blue")
positive_fibers = select_positive_fibers(
raw, fiber_channel, rm, min_fiber_intensity
)
change_subset_roi_color(rm, positive_fibers, "magenta")
save_selected_rois(
rm, rm,
positive_fibers,
os.path.join( os.path.join(
output_dir, raw_image_title + "_mhc_positive_fiber_rois.zip" output_dir,
raw_image_title + "_" + str(serie_index) + "_all_fiber_rois.zip",
), ),
) )
# measure size & shape, save # check for positive fibers
IJ.run( if fiber_channel > 0:
"Set Measurements...", if min_fiber_intensity == 0:
"area perimeter shape feret's redirect=None decimal=4", min_fiber_intensity = get_threshold_from_method(
) raw, fiber_channel, "Mean"
IJ.run("Clear Results", "") )[0]
measure_in_all_rois(raw, membrane_channel, rm) IJ.log("automatic intensity threshold detection: True")
rt = ResultsTable.getResultsTable("Results") IJ.log("fiber intensity threshold: " + str(min_fiber_intensity))
change_all_roi_color(rm, "blue")
positive_fibers = select_positive_fibers(
raw, fiber_channel, rm, min_fiber_intensity
)
change_subset_roi_color(rm, positive_fibers, "magenta")
save_selected_rois(
rm,
positive_fibers,
os.path.join(
output_dir,
raw_image_title
+ "_"
+ str(serie_index)
+ "_mhc_positive_fiber_rois.zip",
),
)
# measure size & shape, save
IJ.run(
"Set Measurements...",
"area perimeter shape feret's redirect=None decimal=4",
)
IJ.run("Clear Results", "")
measure_in_all_rois(raw, membrane_channel, rm)
# print(rt.size()) rt = ResultsTable.getResultsTable("Results")
if fiber_channel > 0:
# print(rt.size())
preset_results_column(rt, "MHC Positive Fibers (magenta)", "NO")
# print(rt.size())
add_results(rt, "MHC Positive Fibers (magenta)", positive_fibers, "YES")
# print(rt.size()) # print(rt.size())
rt.save(os.path.join(output_dir, raw_image_title + "_all_fibers_results.csv")) if fiber_channel > 0:
# print("saved the all_fibers_results.csv") # print(rt.size())
# dress up the original image, save a overlay-png, present original to the user preset_results_column(rt, "MHC Positive Fibers (magenta)", "NO")
rm.show() # print(rt.size())
raw.show() add_results(rt, "MHC Positive Fibers (magenta)", positive_fibers, "YES")
show_all_rois_on_image(rm, raw) # print(rt.size())
raw.setDisplayMode(IJ.COMPOSITE)
enhance_contrast(raw) rt.save(
IJ.run( os.path.join(
"From ROI Manager", "" output_dir,
) # ROIs -> overlays so they show up in the saved png raw_image_title
qc_duplicate = raw.duplicate() + "_"
IJ.saveAs( + str(serie_index)
qc_duplicate, "PNG", output_dir + "/" + raw_image_title + "_all_fibers" + "_all_fibers_results.csv",
) )
qc_duplicate.close() )
wm.toFront(raw.getWindow()) # print("saved the all_fibers_results.csv")
IJ.run("Remove Overlay", "") # dress up the original image, save a overlay-png, present original to the user
raw.setDisplayMode(IJ.GRAYSCALE) rm.show()
show_all_rois_on_image(rm, raw) raw.show()
show_all_rois_on_image(rm, raw)
IJ.selectWindow("Log") raw.setDisplayMode(IJ.COMPOSITE)
IJ.saveAs("Text", str(output_dir + "/" + raw_image_title + "_all_fibers_Log")) enhance_contrast(raw)
membrane.close() IJ.run(
imp_bgd_corrected.close() "From ROI Manager", ""
imp_result.close() ) # ROIs -> overlays so they show up in the saved png
qc_duplicate = raw.duplicate()
if close_raw == True: IJ.saveAs(
raw.close() qc_duplicate,
"PNG",
output_dir
+ "/"
+ raw_image_title
+ "_"
+ str(serie_index)
+ "_all_fibers",
)
qc_duplicate.close()
wm.toFront(raw.getWindow())
IJ.run("Remove Overlay", "")
raw.setDisplayMode(IJ.GRAYSCALE)
show_all_rois_on_image(rm, raw)
IJ.selectWindow("Log")
IJ.saveAs(
"Text",
str(
output_dir
+ "/"
+ raw_image_title
+ "_"
+ str(serie_index)
+ "_all_fibers_Log"
),
)
membrane.close()
imp_bgd_corrected.close()
imp_result.close()
if close_raw == True:
raw.close()
total_execution_time_min = (time.time() - execution_start_time) / 60.0 total_execution_time_min = (time.time() - execution_start_time) / 60.0
IJ.log("total time in minutes: " + str(total_execution_time_min)) IJ.log("total time in minutes: " + str(total_execution_time_min))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment