def trackEnds(imageID, maskID): index = RoiManager.getInstance2().getSelectedIndex() inputIMP = WindowManager.getImage(imageID) maskIMP = WindowManager.getImage(maskID) points1 = inputIMP.getOverlay().get(0).getContainedPoints()[index] points2 = inputIMP.getOverlay().get(1).getContainedPoints()[index] roi = maskIMP.getOverlay().get(index) outerBounds = roi.getBounds() impMT, innerBounds = duplicateMaskInRoi(maskIMP, roi, True) centroid = impMT.getOverlay().get(0).getContourCentroid() nr, endPoint1, endPoint2 = findEndPointsInSkeleton(impMT) track1 = trackEnd(impMT, endPoint1, centroid); track2 = trackEnd(impMT, endPoint2, centroid); impMT.changes=False impMT.close() newTrack1 = [] for point in track1: newTrack1.append((point.x + outerBounds.x + innerBounds.x - 1, point.y + outerBounds.y + innerBounds.y - 1)) newTrack2 = [] for point in track2: newTrack2.append((point.x + outerBounds.x + innerBounds.x - 1, point.y + outerBounds.y + innerBounds.y - 1)) track1X = [point[0] for point in newTrack1] track1Y = [point[1] for point in newTrack1] roiTrack1 = PolygonRoi(track1X, track1Y, Roi.POLYLINE) inputIMP.getOverlay().add(roiTrack1) track2X = [point[0] for point in newTrack2] track2Y = [point[1] for point in newTrack2] roiTrack2 = PolygonRoi(track2X, track2Y, Roi.POLYLINE) inputIMP.getOverlay().add(roiTrack2) inputIMP.repaintWindow()
def findEndPoints(imageID, maskID): endPoints1 = [] endPoints2 = [] imp = IJ.getImage() imp.setSlice(1); roiManager = RoiManager.getInstance2() rois = roiManager.getRoisAsArray() roisToBeRemoved = [] index = 0 for roi in rois: outerBounds = roi.getBounds() impMT, innerBounds = duplicateMaskInRoi(imp, roi) nr, endPoint1, endPoint2 = findEndPointsInSkeleton(impMT) if (nr==2): endPoint1.x = endPoint1.x + outerBounds.x + innerBounds.x - 1 endPoint1.y = endPoint1.y + outerBounds.y + innerBounds.y - 1 endPoint2.x = endPoint2.x + outerBounds.x + innerBounds.x - 1 endPoint2.y = endPoint2.y + outerBounds.y + innerBounds.y - 1 endPoints1.append(endPoint1) endPoints2.append(endPoint2) else: roisToBeRemoved.append(index) impMT.close() index = index + 1 if (len(roisToBeRemoved)>0): roiManager.setSelectedIndexes(roisToBeRemoved) roiManager.runCommand("Delete") roiManager.moveRoisToOverlay(WindowManager.getImage(maskID)) inputIMP = WindowManager.getImage(imageID) inputIMP.setOverlay(PointRoi([seq.x for seq in endPoints1], [seq.y for seq in endPoints1]), Color.magenta, 1, Color.magenta) otherPoints = PointRoi([seq.x for seq in endPoints2], [seq.y for seq in endPoints2]) otherPoints.setStrokeColor(Color.cyan) otherPoints.setFillColor(Color.cyan) inputIMP.getOverlay().add(otherPoints)
def process_image(imps, rois, ais_chno, nucleus_chno, bg_roino=3, sample_width=3, method='mean', dilations=3, average=1, threshold=0.1): """Opens a file and applies a Gaussian filter.""" orig_title = imps[ais_chno-1].getTitle() print ",".join([i.getTitle() for i in imps]) print "Processing", orig_title options = IS.MEAN | IS.MEDIAN # many others nucleus_imp = imps[nucleus_chno-1].duplicate() IJ.run(nucleus_imp, "Median...", "radius=10") IJ.setAutoThreshold(nucleus_imp, "Default"); IJ.run(nucleus_imp, "Make Binary", "") IJ.run(nucleus_imp, "Invert", "") IJ.run(nucleus_imp, "Options...", "iterations=1 count=1 black do=Nothing"); IJ.run(nucleus_imp, "Watershed", ""); IJ.run(nucleus_imp, "Analyze Particles...", "size=20-Infinity clear add"); rm = RoiManager.getInstance2() nuclei = rm.getRoisAsArray() ais_imp = imps[ais_chno-1].duplicate() print ais_imp.getTitle() IJ.run(ais_imp, "8-bit","") IJ.run(ais_imp, "Median...", "radius=1") bg = 0 for i in range(bg_roino): bg_roi = rois[i] ais_imp.setRoi(bg_roi) stats = ais_imp.getStatistics(options) bg += stats.mean print "Bg Roi %s, %s: %s" % (bg_roi.getName(), bg_roi, stats) background = (int)(bg / bg_roino) results = [] for i in range(bg_roino, len(rois)): roiresult = {} print i, rois[i].getName() mimp = ais_imp.duplicate() mimp.setTitle("%s-%s-AIS-Skeleton" % (orig_title, rois[i].getName())) # IJ.run(mimp, "Median...", "radius=3") mimp.setRoi(rois[i]) # IJ.setAutoThreshold(mimp, "Huang dark") IJ.run(mimp, "Auto Local Threshold", "method=Phansalkar radius=15 parameter_1=0 parameter_2=0 white") IJ.setBackgroundColor(0,0,0) IJ.run(mimp, "Clear Outside", "") Prefs.blackBackground = True for j in range(dilations): IJ.run(mimp, "Dilate", "") IJ.run(mimp, "Skeletonize", "") #IJ.run(mimp, "Analyze Skeleton (2D/3D)", "prune=none prune_0 calculate show display"); ais_skeleton, ais_points, points, orthogonals, ais_roi, nucleus_roi = create_skeleton(mimp, '%s-%s-AIS' % (orig_title, rois[i].getName()), nuclei_rois=nuclei, sample_width=sample_width) if ais_skeleton is None: print "Skipping -- AIS skeleton segmentation failed for ROI", rois[i].getName() continue #images['ais-skeleton-' + rois[i].getName()] = ais_skeleton # subtract background print "Subtracting background: bg=%d" % background IJ.run(ais_imp, "Subtract...", "value=%d" % int(background)) ais_imp.setRoi(ais_roi) ip = Straightener().straightenLine(ais_imp, sample_width) straight_imp = ImagePlus('%s-%s-AIS-Straight' % (orig_title, rois[i].getName()), ip) straight_imp.setCalibration(imps[ais_chno-1].getCalibration().copy()) IJ.run(straight_imp, "Green Fire Blue", "") roiresult = { 'roi-name': rois[i].getName(), 'ais-image': straight_imp, 'ais-roi': ais_roi, 'nucleus-roi': nucleus_roi, } # plot if len(points) > 1: if method == 'sum': threshold *= sample_width plot, rt = create_plot(straight_imp, method, average, threshold=threshold) roiresult['plot'] = plot roiresult['table'] = rt results.append(roiresult) return results, background