Created
September 3, 2020 16:52
-
-
Save lacan/ecbd3e836934d0f39022570130fd795d to your computer and use it in GitHub Desktop.
[Use of Hough Transform to locate incomplete circles in images] This script segments SEM images containing pores and tries to fit circles to the result
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
// Hough Transform to find circles, | |
// Author: Olivier Burri, from a request of the Image.sc forum: | |
// https://forum.image.sc/t/find-circles-with-incomplete-boundaries/42357 | |
// Due to the simple nature of this code, no copyright applies | |
#@ImagePlus image | |
#@Double hough_threshold (value=0.55) | |
// SOme housekeeping | |
original = getTitle(); | |
close("\\Others"); | |
roiManager("Reset"); | |
//Remove the bottom of the image | |
run("Specify...", "width=1024 height=884 x=0 y=0"); | |
run("Crop"); | |
// Prepare for Segmentation | |
run("Duplicate...", "title=[Hough]"); | |
run("Smooth"); | |
// Remove unvanted background using rolling ball algorithm | |
run("Subtract Background...", "rolling=10"); | |
run("Smooth"); | |
// Apply laplacian to enhance edges | |
run("FeatureJ Laplacian", "compute smoothing=2"); | |
// Auto-threshold and over-estimate particles | |
setAutoThreshold("Moments"); | |
// Remove particles smaller than 50px2 | |
run("Analyze Particles...", "size=50-Infinity show=Masks"); | |
// Use a Hough transform on the mask to find likely candidates | |
run("Hough Circle Transform","minRadius=10, maxRadius=24, inc=1, minCircles=1, maxCircles=500, threshold="+hough_threshold+", resolution=200, ratio=1.0, bandwidth=10, local_radius=10, reduce show_mask show_scores results_table"); | |
// BUG: ImageJ does not wait for the Hough plugin to finish, so we have to check and wait until it is done | |
// we do this by checking the existence of the 'Score map' image | |
done = false; | |
while (!done) { | |
done = isOpen("Score map"); | |
wait(500); | |
} | |
// Merge all images for easy viewing | |
selectImage(image); | |
// Need to make all 32-bit to match score image | |
run("32-bit"); | |
selectImage("Mask of Hough Laplacian"); | |
run("32-bit"); | |
// Give nice lookup table | |
selectImage("Score map"); | |
resetMinAndMax(); | |
run("mpl-viridis"); | |
// Merge and display as stack | |
run("Merge Channels...", "c1=["+original+"] c2=[Mask of Hough Laplacian] c3=[Score map] create keep"); | |
Stack.setDisplayMode("color"); | |
rename(orignal+"_Results"); | |
// Results table now contains number of circles and sizes |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Has anyone had the problem where the circle diameter is being underestimated?