예제 #1
0
파일: fijipytools.py 프로젝트: soyers/OAD
    def apply_filter(imp, radius=5, filtertype='MEDIAN'):

        # initialize filter
        filter = RankFilters()

        # create filter dictionary for 2D rank filters
        filterdict = {}
        filterdict['MEAN'] = RankFilters.MEAN
        filterdict['MIN'] = RankFilters.MIN
        filterdict['MAX'] = RankFilters.MAX
        filterdict['MEDIAN'] = RankFilters.MEDIAN
        filterdict['VARIANCE'] = RankFilters.VARIANCE
        filterdict['OPEN'] = RankFilters.OPEN
        filterdict['DESPECKLE'] = RankFilters.DESPECKLE
        filterdict['Mean'] = RankFilters.MEAN
        filterdict['Min'] = RankFilters.MIN
        filterdict['Max'] = RankFilters.MAX
        filterdict['Median'] = RankFilters.MEDIAN
        filterdict['Variance'] = RankFilters.VARIANCE
        filterdict['Open'] = RankFilters.OPEN
        filterdict['Despeckle'] = RankFilters.DESPECKLE

        stack = imp.getStack()  # get the stack within the ImagePlus
        nslices = stack.getSize()  # get the number of slices

        # apply filter based on filtertype
        if filtertype in filterdict:
            for index in range(1, nslices + 1):
                ip = stack.getProcessor(index)
                filter.rank(ip, radius, filterdict[filtertype])
        else:
            print("Argument 'filtertype': {filtertype} not found")

        return imp
예제 #2
0
def apply_filter(imp,
                 radius=5,
                 filtertype='MEDIAN'):

    # initialize filter
    filter = RankFilters()

    # create filter dictionary
    filterdict = {}
    filterdict['MEAN'] = RankFilters.MEAN
    filterdict['MIN'] = RankFilters.MIN
    filterdict['MAX'] = RankFilters.MAX
    filterdict['MEDIAN'] = RankFilters.MEDIAN
    filterdict['VARIANCE'] = RankFilters.VARIANCE
    filterdict['OPEN'] = RankFilters.OPEN
    filterdict['DESPECKLE'] = RankFilters.DESPECKLE

    # get the stack and number of slices
    stack, nslices = getImageStack(imp)

    for index in range(1, nslices + 1):
        # get the image processor
        ip = stack.getProcessor(index)
        # apply filter based on filtertype
        filter.rank(ip, radius, filterdict[filtertype])

    return imp
def rankFilterMapImage(imp, radius=1.5, no=2):
  """clipNoisePixMapImage(imp, no=2)
  Clips noise pixels from an X-ray map image (typically a 16 bit gray image). 
  First, it sets the display range to a noise offset to max and removes the noise
  pixels (to get rid of isolated pixels), then converts to an 8 bit image that spans
  0 to 255 and returns an 8 bit gray scale. This is ready for a  hueLUT. It peforms
  this on a duplicate imp and returns the resultant imp. To the best of my understanding,
  this is how Oxford treats their maps w/o a 3x3 smooth. 
  Inputs:
  imp - the input ImagePlus object
  no  - the noise offset, default = 2, to remove noise pixels
  Returns:
  ret - an ImapePlus for the 8-bit, scaled, filtered image
  """
  stats = imp.getStatistics(Measurements.MIN_MAX)
  imp.setDisplayRange(0, stats.max)
  ret = imp.duplicate()
  ip = ret.getProcessor()
  data = ip.getPixels()
  l = len(data)
  for i in range(l):
    val = data[i]
    if val < no:
      data[i] = 0
  rf = RankFilters()
  rf.rank(ret.getProcessor(), radius, RankFilters.MEDIAN)
  IJ.run(ret, "8-bit", "")
  name = imp.getShortTitle()
  stats = ret.getStatistics(Measurements.MIN_MAX)
  ret.setDisplayRange(0, stats.max)
  ret.setTitle(name)
  return ret 
예제 #4
0
def apply_filter(imp,
                 radius=5,
                 filtertype='MEDIAN'):

    # initialize Rank filter
    filter = RankFilters()

    # create filter dictionary
    filterdict = {}
    filterdict['MEAN'] = RankFilters.MEAN
    filterdict['MIN'] = RankFilters.MIN
    filterdict['MAX'] = RankFilters.MAX
    filterdict['MEDIAN'] = RankFilters.MEDIAN
    filterdict['VARIANCE'] = RankFilters.VARIANCE
    filterdict['OPEN'] = RankFilters.OPEN
    filterdict['DESPECKLE'] = RankFilters.DESPECKLE

    # get the stack and number of slices
    stack = imp.getStack()  # get the stack within the ImagePlus
    nslices = stack.getSize()  # get the number of slices

    # apply filter based on filtertype
    if filtertype in filterdict:
        for index in range(1, nslices + 1):
            ip = stack.getProcessor(index)
            filter.rank(ip, radius, filterdict[filtertype])
    else:
        #log.log(LogLevel.INFO, "Argument 'filtertype':" + str(filtertype) + " not found")
        log.info("Argument 'filtertype': " + filtertype + " not found")
        log.info('Image will not be filtered')

    return imp
def stack_median_filter(imp, radius_um=5.0):
	"""perform 2D median filtering slicewise on a stack"""
	t1 = datetime.now();
	stack = imp.getStack();
	title = imp.getTitle();
	n_z = imp.getNSlices();
	progress_inc = 1 if n_z/20 < 1 else n_z/20;
	filt = RankFilters();
	for idx in range(n_z):
		#print("Median filtering stack, {} % complete...".format(100 * round(float(zidx)/n_z, 3)));
		ip = stack.getProcessor(idx+1);
		filt.rank(ip, radius_um, RankFilters.MEDIAN);
		IJ.showProgress(float(idx)/n_z);
		if idx%progress_inc==0:
			IJ.showStatus("Median filtering stack in 2D: {}/{}".format(idx, n_z));
	imp.updateAndDraw();
	imp.setTitle("Median filtered (r={}) {}".format(radius_um, imp.getTitle()).replace(".tif", ""));
	t2 = datetime.now();
	IJ.showProgress(1.0);
	print("Median filtering took {} s".format((t2-t1).total_seconds()));
	return imp;
예제 #6
0
def getCells(dicStack):
    outStack = ImageStack(W,H)

    cells = [None for t in range(T+1)]

    for t in range(1,T+1):
        mapp = dicStack.getProcessor(t).convertToFloatProcessor()

        mapp.subtract( mapp.getStatistics().mean )
        mapp.abs()

        RankFilters().rank(mapp, 1.0, RankFilters.VARIANCE)
        mapp.sqrt()

        mapp.blurGaussian(5)

        hist = mapp.getHistogram(256)
        stats = mapp.getStatistics()

        thresh = AutoThresholder().getThreshold( AutoThresholder.Method.Otsu, hist )
        thresh = (thresh/float(255)) * (stats.max-stats.min) + stats.min

        mask = ByteProcessor(W,H)
        for i in range(W*H):
            value = mapp.getf(i)
            bite = 255 if value>=thresh else 0
            mask.set(i, bite)

        fillHoles(mask)
        ed = 3
        for e in range(ed): mask.erode(1, 0)
        for d in range(ed): mask.dilate(1, 0)

        watershed(mask)

        minA = 5000 #px²

        mask.setThreshold(255,255, ImageProcessor.NO_LUT_UPDATE)
        composite = ThresholdToSelection().convert(mask)

        rois = ShapeRoi(composite).getRois()
        keep = []
        for roi in rois:
            if roi.getStatistics().area >= minA:
                if not onEdge(roi):
                    keep.append(roi)
                else:
                    edgeRoi = ShapeRoi(roi)
                    edgeRoi.setPosition(0,0,t)
                    edgeRoi.setStrokeColor(Color.YELLOW)
                    ol.add(edgeRoi)
        print("T"+str(t)+" using "+str(len(keep))+"/"+str(len(rois))+" ROIs")
        rois = keep
        #rois = [ roi for roi in rois if roi.getStatistics().area >= minA and not onEdge(roi) ]	#keep big enough and not on edges

        # if there is only one Roi, cut it along the fitted ellipse minor axis
        if len(rois)==1:
            el = EllipseFitter()
            mask.setRoi(rois[0])
            el.fit(mask, None)
            el.makeRoi(mask)
            theta = el.angle * (maths.pi/180.0)

            length = el.major/2.0
            dy = maths.sin(theta)* length
            dx = maths.cos(theta)* length

            #major axis
            lineX0 = el.xCenter - dx
            lineY0 = el.yCenter + dy
            lineX1 = el.xCenter + dx
            lineY1 = el.yCenter - dy
            line = Line(lineX0, lineY0, lineX1, lineY1)
            line.setStrokeColor(Color.BLUE)
            line.setStrokeWidth(1)
            line.setPosition(0,0,t)
            ol.add(line)

            #minor axis scaled length to make sure cut ends are outside Roi
            cutX0 = el.xCenter + dy*100
            cutY0 = el.xCenter + dx*100
            cutX1 = el.yCenter - dy*100
            cutY1 = el.yCenter - dx*100

            cut = Line(cutX0,cutY0, cutX1, cutY1)
            cut.setStrokeWidth(2)
            cut = PolygonRoi( cut.getFloatPolygon(), PolygonRoi.POLYGON )

            mask.setColor(0)
            mask.fill(cut)
            composite = ThresholdToSelection().convert(mask)

            rois = ShapeRoi(composite).getRois()
            rois = [ roi for roi in rois if roi.getStatistics().area >= minA ]
        print(str(t) + ":" + str(len(rois)))

        rois = [ PolygonRoi(roi.getInterpolatedPolygon(20, True), PolygonRoi.POLYGON) for roi in rois ]
        rois = [ PolygonRoi(roi.getConvexHull(), PolygonRoi.POLYGON) for roi in rois ]

        rois = sorted(list(rois), key=lambda roi:roi.getLength() )	#size order
        rois = rois[-2:]											#keep 2 biggest
        rois = sorted(list(rois), key=lambda roi:roi.getStatistics().xCentroid+roi.getStatistics().yCentroid )	#top left to bottom right order

        if len(rois)>0:
            rois[0].setStrokeColor(Color.RED)
            rois[0].setPosition(0, 0, t)
            ol.add(rois[0])
        if len(rois)>1:
            rois[1].setStrokeColor(Color.GREEN)
            rois[1].setPosition(0, 0, t)
            ol.add(rois[1])
            cells[t] = (rois[0], rois[1])


    return cells
예제 #7
0
from ij import IJ, ImagePlus
from ij.plugin.filter import RankFilters

imp = IJ.getImage()
ip = imp.getProcessor().convertToFloat()

# noise 제거를 위해서 media filter 적용
# radius = 2
radius = 2
# RankFilters class: mean, minimum, maximum, variance, outlier remval, despeckle 등이 구현됨.
# RankFilters(): 새로운 RankFilters instance 생성
#              .rank: RankFilters 내부 구현 method 호출.
# https://javadoc.scijava.org/ImageJ1/ij/plugin/filter/RankFilters.html
RankFilters().rank(ip, radius, RankFilters.MEDIAN)

imp2 = ImagePlus(imp.title + "median_filtered", ip)
imp2.show()
예제 #8
0
    return rois


imp = IJ.getImage()
cal = imp.getCalibration()
stack = imp.getStack()
z = imp.getSlice()

ipGFP = stack.getProcessor(imp.getStackIndex(1, z,
                                             1)).convertToFloatProcessor()
ipGFP.blurGaussian(4)
maskGFP = getMask(ipGFP, AutoThresholder.Method.Otsu)
roisGFP = getRois(maskGFP)

ipBF = stack.getProcessor(imp.getStackIndex(2, z, 1)).convertToFloatProcessor()
RankFilters().rank(ipBF, 1.0, RankFilters.VARIANCE)
ipBF.blurGaussian(5)
maskBF = getMask(ipBF, AutoThresholder.Method.Triangle)
roisBF = getRois(maskBF)

ipTomato = stack.getProcessor(imp.getStackIndex(3, z, 1)).duplicate()
sub = ipTomato.duplicate()
ipTomato.blurGaussian(5)
sub.blurGaussian(20)
ipTomato.copyBits(sub, 0, 0, Blitter.SUBTRACT)
maskTomato = getMask(ipTomato, AutoThresholder.Method.MaxEntropy)
roisTomato = getRois(maskTomato)

bfMeasure = stack.getProcessor(imp.getStackIndex(2, z, 1))
tomatoMeasure = stack.getProcessor(imp.getStackIndex(3, z, 1))
gfpMeasure = stack.getProcessor(imp.getStackIndex(1, z, 1))
예제 #9
0
  processor = frame.getProcessor()
  if(processor.getBitDepth() == 32):
    processor.setMinAndMax(0, 1.0)
  else:
    processor.setMinAndMax(0, processor.maxValue())

  frame = ImagePlus("Frame " + str(frame_i), processor)

  # Convert to 8-bit, grayscale
  converter = ImageConverter(frame)
  converter.convertToGray8()

  # Perform median filtering
  processor = frame.getProcessor()

  filters = RankFilters()
  filters.setup("median", frame)
  filters.rank(processor, filter_window, filters.MEDIAN)

  # Perform gamma correction
  processor.gamma(gamma)

  frame = ImagePlus("Frame " + str(frame_i), processor)

  # Rolling ball background subtraction
  processor = frame.getProcessor()

  bg_subtractor = BackgroundSubtracter()
  bg_subtractor.setup("", frame)
  bg_subtractor.rollingBallBackground(processor, rolling_ball_size/pixel_size, False, False, False, False, True)
예제 #10
0
def nucleusSegmentation(imp2):
    """ Segmentation of nucleus image. 
    Nucleus are selected that:
    1. No overlapping with dilated regions
    2. close to circular shape. Deformed nuclei are rejected.
    Outputs a binary image.
    """
#Convert to 8bit
    ImageConverter(imp2).convertToGray8()
#blur slightly using Gaussian Blur 
    radius = 2.0
    accuracy = 0.01
    GaussianBlur().blurGaussian( imp2.getProcessor(), radius, radius, accuracy)
# Auto Local Thresholding
    imps = ALT().exec(imp2, "Bernsen", 15, 0, 0, True)
    imp2 = imps[0]


#ParticleAnalysis 0: prefiltering by size and circularity
    rt = ResultsTable()
    paOpt = PA.CLEAR_WORKSHEET +\
                    PA.SHOW_MASKS +\
                    PA.EXCLUDE_EDGE_PARTICLES +\
                    PA.INCLUDE_HOLES #+ \
#		PA.SHOW_RESULTS 
    measOpt = PA.AREA + PA.STD_DEV + PA.SHAPE_DESCRIPTORS + PA.INTEGRATED_DENSITY
    MINSIZE = 20
    MAXSIZE = 10000
    pa0 = PA(paOpt, measOpt, rt, MINSIZE, MAXSIZE, 0.8, 1.0)
    pa0.setHideOutputImage(True)
    pa0.analyze(imp2)
    imp2 = pa0.getOutputImage() # Overwrite 
    imp2.getProcessor().invertLut()
#impNuc = imp2.duplicate()	## for the ring. 
    impNuc = Duplicator().run(imp2)

#Dilate the Nucleus Area
## this should be 40 pixels in Cihan's method, but should be smaller. 
#for i in range(20):
#	IJ.run(imp2, "Dilate", "")
    rf = RankFilters()
    rf.rank(imp2.getProcessor(), RIMSIZE, RankFilters.MAX)

#Particle Analysis 1: get distribution of sizes. 

    paOpt = PA.CLEAR_WORKSHEET +\
                    PA.SHOW_NONE +\
                    PA.EXCLUDE_EDGE_PARTICLES +\
                    PA.INCLUDE_HOLES #+ \
#		PA.SHOW_RESULTS 
    measOpt = PA.AREA + PA.STD_DEV + PA.SHAPE_DESCRIPTORS + PA.INTEGRATED_DENSITY
    rt1 = ResultsTable()
    MINSIZE = 20
    MAXSIZE = 10000
    pa = PA(paOpt, measOpt, rt1, MINSIZE, MAXSIZE)
    pa.analyze(imp2)
    #rt.show('after PA 1')
#particle Analysis 2: filter nucleus by size and circularity. 
    #print rt1.getHeadings()
    if (rt1.getColumnIndex('Area') > -1):
      q1, q3, outlier_offset = getOutlierBound(rt1)
    else:
      q1 = MINSIZE
      q3 = MAXSIZE
      outlier_offset = 0
      print imp2.getTitle(), ": no Nucleus segmented,probably too many overlaps"

    paOpt = PA.CLEAR_WORKSHEET +\
                    PA.SHOW_MASKS +\
                    PA.EXCLUDE_EDGE_PARTICLES +\
                    PA.INCLUDE_HOLES #+ \
#		PA.SHOW_RESULTS 
    rt2 = ResultsTable()
    #pa = PA(paOpt, measOpt, rt, q1-outlier_offset, q3+outlier_offset, circq1-circoutlier_offset, circq3+circoutlier_offset)
    pa = PA(paOpt, measOpt, rt2, q1-outlier_offset, q3+outlier_offset, 0.8, 1.0)
    pa.setHideOutputImage(True)
    pa.analyze(imp2)
    impDilatedNuc = pa.getOutputImage() 

#filter original nucleus

    filteredNuc = ImageCalculator().run("AND create", impDilatedNuc, impNuc)
    return filteredNuc