import math from ijutils import * import ij.process.Blitter as Blitter FILL_STRATEGY = "mask" #"mask", "bits", "none" OPEN_STRATEGY = "both" #"black", "white", "both", "none" DIAM_1 = 84 DIAM_2 = 550 DETECT_THRESHOLD = 10 #PIXELS FRAMES = 1 MASK_SIZE = 0.8 # of DIAM_2 renderer=show_panel(image) renderer.setMarker(None); start = time.time() #Image Loading if FRAMES>1: ig = integrate_frames(samples = FRAMES) else: ip = load_image(image.output, title="Image") ig = grayscale(ip, in_place=False) #Threshoolding it = auto_threshold(ig, dark_background=True, in_place=False) w, h = it.getWidth(), it.getHeight() #it.show() if OPEN_STRATEGY in ("black", "both"): #Refine inner binary_open(it, dark_background=True, iterations=1, count=1); if OPEN_STRATEGY in ("white", "both"): #Refine outter binary_open(it, dark_background=False, iterations=1, count=1); #it.repaintWindow() #Detect outer white circle px = int(pow(DIAM_2/2,2) * math.pi) (res2,out2)=analyse_particles(it, px/2, px*2, \ fill_holes = True, exclude_edges = True, print_table=True, \ output_image = "outlines", minCirc = 0.8, maxCirc = 1.0) if res2.size() == 1: x2,y2 = res2.getValue("XM", 0), res2.getValue("YM", 0) invert(it, in_place=True) ip = it.getProcessor() dist = DIAM_2 * (MASK_SIZE/2.0) if FILL_STRATEGY == "bits": for y in range(h): for x in range(w): distance = math.hypot(x - x2, y - y2) if distance >dist: ip.putPixel(x, y, 0) elif FILL_STRATEGY == "mask": mask = ip.createProcessor(w, h) # Creates a new blank ImageProcessor mask.setColor(255) # Set the drawing color to white (255) mask.fillOval(int(x2 - dist), int(y2 - dist), int(2 * dist), int(2 * dist)) # Draw the circular ROI mask.autoThreshold() # Ensures the mask is binary (if needed) ip.copyBits(mask, 0, 0, Blitter.AND) # Apply the mask using a bitwise AND #it.show() px = int(pow(DIAM_1/2,2) * math.pi) (res1,out1)=analyse_particles(it, px/2, px*2, \ fill_holes = FILL_STRATEGY!="none", exclude_edges = True, print_table=True, \ output_image = "outlines", minCirc = 0.8, maxCirc = 1.0) if res1.size() == res2.size() == 1: x1,y1 = res1.getValue("XM", 0), res1.getValue("YM", 0) if abs(x1-x2) <= DETECT_THRESHOLD and abs(y1-y2) <= DETECT_THRESHOLD: print("Detected: ", (x1, y1)) renderer=show_panel(image) p = Point(int(x1),int(y1)) ov = Overlays.Crosshairs(renderer.getPenProfile(), p, Dimension(-1, -1)) renderer.setMarker(ov); print "Processing time:", time.time()-start