Java源码示例:ij.gui.Overlay

示例1
@Override
public void show(RealSignal signal, String title, Imager.Type type, int z, ArrayList<Line2D.Double> overlayLines) {
	ImagePlus imp = build(signal, type);
	if (imp != null) {
		imp.setTitle(title);
		int nz = imp.getStackSize();
		imp.show();
		imp.setSlice(Math.max(1, Math.min(nz, z)));
		imp.getProcessor().resetMinAndMax();
	}
	
	if (imp != null) {
		Overlay overlay = imp.getOverlay() == null ? new Overlay() : imp.getOverlay();
		for(Line2D.Double line : overlayLines) {
			ij.gui.Line roi = new ij.gui.Line(round(line.x1), round(line.y1), round(line.x2), round(line.y2));
			overlay.add(roi);
		}
		imp.setOverlay(overlay);
	}
}
 
示例2
@Override
public void append(ContainerImage container, RealSignal signal, String title, Imager.Type type, ArrayList<Line2D.Double> overlayLines) {		
	ImagePlus cont = (ImagePlus) container.object;
	if (container.object == null) {
		ImageStack stack = new ImageStack(signal.nx, signal.ny);
		stack.addSlice(build(signal, type).getProcessor());
		stack.addSlice(build(signal, type).getProcessor());
		container.object = new ImagePlus(title, stack);
		((ImagePlus)container.object).show();
	}
	else {
		cont.getStack().addSlice(build(signal, type).getProcessor());
		cont.setSlice(cont.getStack().getSize());
		cont.updateAndDraw();
		cont.getProcessor().resetMinAndMax();
	}
	if (cont != null)  {
		Overlay overlay = cont.getOverlay() == null ? new Overlay() : cont.getOverlay();
		for(Line2D.Double line : overlayLines) {
			ij.gui.Line roi = new ij.gui.Line(round(line.x1), round(line.y1), round(line.x2), round(line.y2));
			overlay.add(roi);
		}
		cont.setOverlay(overlay);
	}		
}
 
示例3
private void addPolyLineToOverlay(final FloatPolygon p, final int z_position, final int roi_id,
		final Overlay overlay) {
	if (p.npoints > 0) {
		if (p.npoints == 1) {
			// create 1-pixel length lines for single points
			p.xpoints[0] -= 0.5f;
			p.ypoints[0] -= 0.5f;
			p.addPoint(p.xpoints[0] + 0.5f, p.ypoints[0] + 0.5f);
		}
		final PolygonRoi polyline = new PolygonRoi(p, Roi.FREELINE);
		polyline.enableSubPixelResolution();
		// polyline.fitSplineForStraightening();
		if (name == null)
			setDefaultName();
		polyline.setStrokeColor(getColor());
		polyline.setName(String.format(name + "-%04d-Z%d", roi_id, z_position));
		polyline.setPosition(z_position + 1); // index 1
		overlay.add(polyline);
	}
}
 
示例4
private static void showMatches(final String imageUrl,
                                final List<CanvasMatches> canvasMatchesList,
                                final boolean isP,
                                final Color[] colors) {

    final ImagePlus imagePlus = IJ.openImage(imageUrl);
    final Overlay overlay = new Overlay();

    int colorIndex = 0;
    for (final CanvasMatches canvasMatches : canvasMatchesList) {
        final double[][] points = isP ? canvasMatches.getMatches().getPs() : canvasMatches.getMatches().getQs();
        final float[] xPoints = toFloat(points[0]);
        final float[] yPoints = toFloat(points[1]);
        final PointRoi pointRoi = new PointRoi(xPoints, yPoints, xPoints.length);
        pointRoi.setStrokeColor(colors[colorIndex]);
        pointRoi.setSize(3); // 0: "Tiny", 1: "Small", 2: "Medium", 3: "Large", 4: "Extra Large"}
        overlay.add(pointRoi);
        colorIndex = (colorIndex + 1) % colors.length;
    }

    imagePlus.setOverlay(overlay);
    imagePlus.updateAndDraw();
    imagePlus.show();

}
 
示例5
/**
 * Display the result of bounding box extraction as overlay on a given
 * image.
 * 
 * @param target
 *            the ImagePlus used to display result
 * @param results
 *            the associative map between region label and bounding box
 */
private void showResultsAsOverlay(Map<Integer, Box2D> results, ImagePlus target)	
{
	// get spatial calibration of target image
	Calibration calib = target.getCalibration();
	
	// create overlay
	Overlay overlay = new Overlay();
	Roi roi;
	
	// add each box to the overlay
	for (int label : results.keySet()) 
	{
		// Coordinates of inscribed circle, in pixel coordinates
		Box2D box = results.get(label);
		box = uncalibrate(box, calib);
		roi = createRoi(box);
		
		// draw inscribed circle
		roi.setStrokeColor(Color.BLUE);
		overlay.add(roi);
	}
	
	target.setOverlay(overlay);
}
 
示例6
/**
 * Display the result of oriented bounding box extraction as overlay on a
 * given image.
 * 
 * @param target
 *            the ImagePlus used to display result
 * @param results
 *            the associative map between region label and bounding box
 */
private void showResultsAsOverlay(Map<Integer, OrientedBox2D> results, ImagePlus target)	
{
	// get spatial calibration of target image
	Calibration calib = target.getCalibration();
	
	// create overlay
	Overlay overlay = new Overlay();
	Roi roi;
	
	// add each box to the overlay
	for (int label : results.keySet()) 
	{
		// Coordinates of inscribed circle, in pixel coordinates
		OrientedBox2D box = results.get(label);
		roi = createUncalibratedRoi(box, calib);
		
		// draw inscribed circle
		roi.setStrokeColor(Color.GREEN);
		overlay.add(roi);
	}
	
	target.setOverlay(overlay);
}
 
示例7
public static Overlay addPointsToOverlay(double[] xCoord, double[] yCoord, Overlay overlay, int slice, Color c, int markerType) {
    assert xCoord.length == yCoord.length;
    float[] xs = new float[xCoord.length];
    float[] ys = new float[yCoord.length];
    for(int i = 0; i < xCoord.length; i++) {
        xs[i] = (float) xCoord[i];
        ys[i] = (float) yCoord[i];
    }
    overlay.add(new MultiplePointsRoi(xs, ys, slice, c, markerType));
    return overlay;
}
 
示例8
private void removeMIPfromOverlay(final Overlay overlay) {
	if (overlay != null && overlay.size() > 0) {
		for (int i = overlay.size() - 1; i >= 0; i--) {
			final String roiName = overlay.get(i).getName();
			if (roiName != null && roiName.equals(OVERLAY_IDENTIFIER)) {
				overlay.remove(i);
				return;
			}
		}
	}
}
 
示例9
/**
 * Display the result of maximal inscribed circle extraction as overlay on a
 * given image.
 * 
 * @param target
 *            the ImagePlus used to display result
 * @param table
 *            the ResultsTable containing columns "xi", "yi" and "Radius"
 * @param the
 *            resolution in each direction
 */
private void showResultsAsOverlay(Map<Integer, Ellipse> results, ImagePlus target, boolean showEllipse, boolean showAxes)	
{
	// get spatial calibration of target image
	Calibration calib = target.getCalibration();
	
	// create overlay
	Overlay overlay = new Overlay();
	
	// add each ellipse to the overlay
	for (int label : results.keySet()) 
	{
		// Coordinates of inscribed circle, in pixel coordinates
		Ellipse ellipse = results.get(label);
		ellipse = uncalibrate(ellipse, calib);

		// roi corresponding to ellipse
		if (showEllipse)
		{
			addRoiToOverlay(overlay, createRoi(ellipse), Color.BLUE);
		}
		
		// the two roi corresponding to major axes
		if (showAxes)
		{
			addRoiToOverlay(overlay, createMajorAxisRoi(ellipse), Color.BLUE);
			addRoiToOverlay(overlay, createMinorAxisRoi(ellipse), Color.BLUE);
		}
	}
	
	target.setOverlay(overlay);
}
 
示例10
private void overlayRAG(Set<LabelPair> adjList, ImagePlus imagePlus, ImagePlus targetPlus)
{
	IJ.log("display RAG");
	
	// first compute centroids
	ImageProcessor image = imagePlus.getProcessor();
	int[] labels = LabelImages.findAllLabels(image);
	Map<Integer, Integer> labelMap = LabelImages.mapLabelIndices(labels);
	double[][] centroids = Centroid.centroids(image, labels);
	
	// create an overlay for drawing edges
	Overlay overlay = new Overlay();
	
	// iterate over adjacencies to add edges to overlay
	for (LabelPair pair : adjList)
	{
		// first retrieve index in centroid array
		int ind1 = labelMap.get(pair.label1);
		int ind2 = labelMap.get(pair.label2);
		
		// coordinates of edge extremities
		int x1 = (int) centroids[ind1][0];
		int y1 = (int) centroids[ind1][1];
		int x2 = (int) centroids[ind2][0];
		int y2 = (int) centroids[ind2][1];
		
		// draw current edge
		Roi roi = new Line(x1, y1, x2, y2);
		
		roi.setStrokeColor(Color.GREEN);
		roi.setStrokeWidth(2);
		overlay.add(roi);
	}
	
	targetPlus.setOverlay(overlay);
}
 
示例11
/**
 * Display the result of maximal inscribed circle extraction as overlay on a
 * given image.
 * 
 * @param target
 *            the ImagePlus used to display result
 * @param table
 *            the ResultsTable containing columns "xi", "yi" and "Radius"
 * @param the
 *            resolution in each direction
 */
private void showResultsAsOverlay(Map<Integer, Ellipse> results, ImagePlus target, boolean showEllipse, boolean showAxes)	
{
	// get spatial calibration of target image
	Calibration calib = target.getCalibration();
	
	// create overlay
	Overlay overlay = new Overlay();
	
	// add each ellipse to the overlay
	for (int label : results.keySet()) 
	{
		// Coordinates of inscribed circle, in pixel coordinates
		Ellipse ellipse = results.get(label);
		ellipse = uncalibrate(ellipse, calib);

		// roi corresponding to ellipse
		if (showEllipse)
		{
			addRoiToOverlay(overlay, createRoi(ellipse), Color.BLUE);
		}
		
		// the two roi corresponding to major axes
		if (showAxes)
		{
			addRoiToOverlay(overlay, createMajorAxisRoi(ellipse), Color.BLUE);
			addRoiToOverlay(overlay, createMinorAxisRoi(ellipse), Color.BLUE);
		}
	}
	
	target.setOverlay(overlay);
}
 
示例12
public void drawPaths(ImagePlus target, Map<Integer, GeodesicDiameter.Result> geodDiams)
{
	Overlay overlay = new Overlay();
	Calibration calib = target.getCalibration();
	
	for (GeodesicDiameter.Result result : geodDiams.values())
	{
		Roi roi = createPathRoi(result.path, calib);
	    roi.setStrokeColor(Color.RED);
	    overlay.add(roi);
	}

	target.setOverlay(overlay);
}
 
示例13
public void drawValues(ImagePlus target)
	{
	    Overlay overlay = new Overlay();
//	    Calibration calib = target.getCalibration();
	    
        double[] xPos = getColumnValues(this.table, this.xPosHeaderName);
        double[] yPos = getColumnValues(this.table, this.yPosHeaderName);
        if (this.calibratedPosition)
        {
            Calibration calib = target.getCalibration();
            for (int i = 0; i < xPos.length; i++)
            {
                xPos[i] = xPos[i] * calib.pixelWidth  + calib.xOrigin;
                yPos[i] = yPos[i] * calib.pixelHeight + calib.yOrigin;
            }
        }
            
        double[] values = getColumnValues(this.table, this.valueHeaderName);

        for (int i = 0; i < xPos.length; i++)
        {
            Roi roi = new TextRoi(
                    xPos[i] + this.xOffset,
                    yPos[i] + this.yOffset,
                    String.format(this.pattern,  values[i]));
            overlay.add(roi);
        }

	    target.setOverlay(overlay);
	}
 
示例14
/**
 * Update the overlay in the display image based on 
 * the current result and slice
 */
void updateResultOverlay() 
{
	if( null != resultImage )
	{
		int slice = displayImage.getCurrentSlice();

		final String displayOption = (String) resultDisplayList.getSelectedItem();							

		ImageRoi roi = null;
		
		if( displayOption.equals( catchmentBasinsText ) )
		{
			roi = new ImageRoi(0, 0, resultImage.getImageStack().getProcessor( slice ) );
			roi.setOpacity( 1.0 );
		}
		else if( displayOption.equals( overlaidDamsText ) )				
		{
			ImageProcessor lines = BinaryImages.binarize( resultImage.getImageStack().getProcessor( slice ) );
			lines.invert();
			lines.setLut( LUT.createLutFromColor( Color.red ) );
			roi = new ImageRoi( 0, 0, lines );
			roi.setZeroTransparent( true );
			roi.setOpacity( 1.0 );
		}
		else if( displayOption.equals( watershedLinesText ) )
		{
			roi = new ImageRoi(0, 0, BinaryImages.binarize( resultImage.getImageStack().getProcessor( slice ) ) );
			roi.setOpacity( 1.0 );
		}
		else if( displayOption.equals( overlaidBasinsText ) )	
		{
			roi = new ImageRoi(0, 0, resultImage.getImageStack().getProcessor( slice ) );
			roi.setOpacity( opacity );
		}
										
		displayImage.setOverlay( new Overlay( roi ) );
	}
}
 
示例15
/**
 * Update the overlay in the display image based on
 * the current result and slice
 */
void updateResultOverlay()
{
	if( null != resultImage )
	{
		int slice = displayImage.getCurrentSlice();

		final String displayOption = (String) resultDisplayList.getSelectedItem();

		ImageRoi roi = null;

		if( displayOption.equals( catchmentBasinsText ) )
		{
			roi = new ImageRoi(0, 0, resultImage.getImageStack().getProcessor( slice ) );
			roi.setOpacity( 1.0 );
		}
		else if( displayOption.equals( overlaidDamsText ) )
		{
			ImageProcessor lines = BinaryImages.binarize( resultImage.getImageStack().getProcessor( slice ) );
			lines.invert();
			lines.setLut( LUT.createLutFromColor( Color.red ) );
			roi = new ImageRoi( 0, 0, lines );
			roi.setZeroTransparent( true );
			roi.setOpacity( 1.0 );
		}
		else if( displayOption.equals( watershedLinesText ) )
		{
			roi = new ImageRoi(0, 0, BinaryImages.binarize( resultImage.getImageStack().getProcessor( slice ) ) );
			roi.setOpacity( 1.0 );
		}
		else if( displayOption.equals( overlaidBasinsText ) )
		{
			roi = new ImageRoi(0, 0, resultImage.getImageStack().getProcessor( slice ) );
			roi.setOpacity( opacity );
		}

		displayImage.setOverlay( new Overlay( roi ) );
	}
}
 
示例16
public void drawDiameters(ImagePlus target, Map<Integer, PointPair2D> geodDiams)
{
	Overlay overlay = new Overlay();
	Calibration calib = target.getCalibration();
	
	for (PointPair2D result : geodDiams.values())
	{
		Roi roi = createDiametersRoi(result, calib);
	    roi.setStrokeColor(Color.BLUE);
	    overlay.add(roi);
	}

	target.setOverlay(overlay);
}
 
示例17
/**
 * Handles a histogram the following way: create snapshot, log data, reset the
 * display range, apply the Fire LUT and finally store it as an iText PDF image.
 * Afterwards the image is reset to its orignal state again
 */
@Override
public void handleHistogram(Histogram2D<T> histogram, String name) {
	RandomAccessibleInterval<LongType> image = histogram.getPlotImage();
	ImagePlus imp = ImageJFunctions.wrapFloat( image, name );
	
	// make a snapshot to be able to reset after modifications
	imp.getProcessor().snapshot();
	imp.getProcessor().log();
	imp.updateAndDraw();
	imp.getProcessor().resetMinAndMax();
	IJ.run(imp,"Fire", null);
	
	Overlay overlay = new Overlay();
	
	/*
	 * check if we should draw a regression line for the current
	 * histogram.
	 */
	if (histogram.getDrawingSettings().contains(Histogram2D.DrawingFlags.RegressionLine)) {
		AutoThresholdRegression<T> autoThreshold = this.container.getAutoThreshold();
		if (histogram != null && autoThreshold != null) {
			drawLine(histogram, overlay, image.dimension(0), image.dimension(1),
					autoThreshold.getAutoThresholdSlope(), autoThreshold.getAutoThresholdIntercept());
			overlay.setStrokeColor(java.awt.Color.WHITE);
			imp.setOverlay(overlay);
		}
	}
	
	addImageToList(imp, name);
	// reset the imp from the log scaling we applied earlier
	imp.getProcessor().reset();
}
 
示例18
private void drawLine(Histogram2D<T> histogram, Overlay overlay, long imgWidth, long imgHeight, double slope,
		double intercept) {

	double startX, startY, endX, endY;
	/*
	 * since we want to draw the line over the whole image we can directly
	 * use screen coordinates for x values.
	 */
	startX = 0.0;
	endX = imgWidth;

	// check if we can get some exta information for drawing
	// get calibrated start y coordinates
	double calibratedStartY = slope * histogram.getXMin() + intercept;
	double calibratedEndY = slope * histogram.getXMax() + intercept;
	// convert calibrated coordinates to screen coordinates
	startY = calibratedStartY * histogram.getYBinWidth();
	endY = calibratedEndY * histogram.getYBinWidth();

	/*
	 * since the screen origin is in the top left of the image, we need to
	 * x-mirror our line
	 */
	startY = (imgHeight - 1) - startY;
	endY = (imgHeight - 1) - endY;
	// create the line ROI and add it to the overlay
	Line lineROI = new Line(startX, startY, endX, endY);
	/*
	 * Set drawing width of line to one, in case it has been changed
	 * globally.
	 */
	lineROI.setStrokeWidth(1.0f);
	overlay.add(lineROI);
	
}
 
示例19
public void drawPathAsPoints(final Overlay overlay) {
	drawPathAsPoints(overlay, ThreePanes.XY_PLANE);
}
 
示例20
private static final void addRoiToOverlay(Overlay overlay, Roi roi, Color color)
{
	roi.setStrokeColor(color);
	overlay.add(roi);
}
 
示例21
private static final void addRoiToOverlay(Overlay overlay, Roi roi, Color color)
{
	roi.setStrokeColor(color);
	overlay.add(roi);
}
 
示例22
/**
 * Get current segmentation results based on selected mode
 * @param mode selected result mode ("Overlaid basins", "Overlaid dams", "Catchment basins", "Watershed lines") 
 * @return result image
 */
ImagePlus getResult( ResultMode mode )
{
	String title = inputImage.getTitle();
	String ext = "";
	int index = title.lastIndexOf( "." );
	if( index != -1 )
	{
		ext = title.substring( index );
		title = title.substring( 0, index );				
	}
	
	ImagePlus result = null;
	
	// if the overlay is not shown
	if( showColorOverlay == false )
	{
		result = displayImage.duplicate();
		
		if ( applyGradient && showGradient )
			title += "-gradient";
		result.setTitle( title + ext );
		return result;
	}
	

	switch( mode ){
		case OVERLAID_BASINS:
			result = displayImage.duplicate();
			result.setOverlay( null ); // remove existing overlay
			ImageStack is = new ImageStack( displayImage.getWidth(), displayImage.getHeight() );
	
			for( slice=1; slice<=result.getImageStackSize(); slice++ )
			{
				ImagePlus aux = new ImagePlus( "", result.getImageStack().getProcessor( slice ) );
				ImageRoi roi = new ImageRoi(0, 0, resultImage.getImageStack().getProcessor( slice ) );
				roi.setOpacity( opacity );
				aux.setOverlay( new Overlay( roi ) );
				aux = aux.flatten();
				is.addSlice( aux.getProcessor() );
			}
			result.setStack( is );
			if( applyGradient && showGradient )
				title += "-gradient";
			result.setTitle( title + "-overlaid-basins" + ext );
			break;
		case BASINS:
			result = resultImage.duplicate();
			result.setTitle( title + "-catchment-basins" + ext );				
			break;
		case OVERLAID_DAMS:
			result = getWatershedLines( resultImage );
			result = ColorImages.binaryOverlay( displayImage, result, Color.red ) ;
			if( applyGradient && showGradient )
				title += "-gradient";
			result.setTitle( title + "-overlaid-dams" + ext );				
			break;
		case LINES:
			result = getWatershedLines( resultImage );
			IJ.run( result, "Invert", "stack" );
			result.setTitle( title + "-watershed-lines" + ext );								
			break;
	}

	return result;
}
 
示例23
/**
 * Get current segmentation results based on selected mode
 * @param mode selected result mode ("Overlaid basins", "Overlaid dams", "Catchment basins", "Watershed lines") 
 * @return result image
 */
ImagePlus getResult( ResultMode mode )
{
	String title = inputImage.getTitle();
	String ext = "";
	int index = title.lastIndexOf( "." );
	if( index != -1 )
	{
		ext = title.substring( index );
		title = title.substring( 0, index );
	}

	ImagePlus result = null;

	// if the overlay is not shown
	if( showColorOverlay == false )
	{
		result = displayImage.duplicate();
		result.setTitle( title + ext );
		return result;
	}


	switch( mode ){
	case OVERLAID_BASINS:
		result = displayImage.duplicate();
		result.setOverlay( null ); // remove existing overlay
		ImageStack is = new ImageStack( displayImage.getWidth(), displayImage.getHeight() );

		for( slice=1; slice<=result.getImageStackSize(); slice++ )
		{
			ImagePlus aux = new ImagePlus( "", result.getImageStack().getProcessor( slice ) );
			ImageRoi roi = new ImageRoi(0, 0, resultImage.getImageStack().getProcessor( slice ) );
			roi.setOpacity( opacity );
			aux.setOverlay( new Overlay( roi ) );
			aux = aux.flatten();
			is.addSlice( aux.getProcessor() );
		}
		result.setStack( is );
		result.setTitle( title + "-overlaid-basins" + ext );
		break;
	case BASINS:
		result = resultImage.duplicate();
		result.setTitle( title + "-catchment-basins" + ext );
		break;
	case OVERLAID_DAMS:
		result = getWatershedLines( resultImage );
		result = ColorImages.binaryOverlay( displayImage, result, Color.red );
		result.setTitle( title + "-overlaid-dams" + ext );
		break;
	case LINES:
		result = getWatershedLines( resultImage );
		IJ.run( result, "Invert", "stack" );
		result.setTitle( title + "-watershed-lines" + ext );
		break;
	}

	return result;
}
 
示例24
/**
 * Draws the passed ImageResult on the ImagePlus of this class. If the image
 * is part of a CompositeImageResult then contained lines will also be drawn
 */
protected void drawImage(RandomAccessibleInterval<? extends RealType<?>> img) {
	// get ImgLib image as ImageJ image
	imp = ImageJFunctions.wrapFloat((RandomAccessibleInterval<T>) img, "TODO");
	imagePanel.updateImage(imp);
	// set the display range

	// check if a LUT should be applied
	if (listOfLUTs.containsKey(img)) {
		// select linked look up table
		IJ.run(imp, listOfLUTs.get(img), null);
	}
	imp.getProcessor().resetMinAndMax();

	boolean overlayModified = false;
	Overlay overlay = new Overlay();

	// if it is the 2d histogram, we want to show the regression line
	if (isHistogram(img)) {
		Histogram2D<T> histogram = mapOf2DHistograms.get(img);
		/*
		 * check if we should draw a regression line for the current
		 * histogram.
		 */
		if (histogram.getDrawingSettings().contains(Histogram2D.DrawingFlags.RegressionLine)) {
			AutoThresholdRegression<T> autoThreshold = dataContainer.getAutoThreshold();
			if (histogram != null && autoThreshold != null) {
				if (img == histogram.getPlotImage()) {
					drawLine(overlay, img, autoThreshold.getAutoThresholdSlope(),
							autoThreshold.getAutoThresholdIntercept());
					overlayModified = true;
				}
			}
		}
	}

	if (overlayModified) {
		overlay.setStrokeColor(java.awt.Color.WHITE);
		imp.setOverlay(overlay);
	}

	imagePanel.repaint();
}
 
示例25
/**
 * Draws the line on the overlay.
 */
protected void drawLine(Overlay overlay, RandomAccessibleInterval<? extends RealType<?>> img, double slope,
		double intercept) {
	double startX, startY, endX, endY;
	long imgWidth = img.dimension(0);
	long imgHeight = img.dimension(1);
	/*
	 * since we want to draw the line over the whole image we can directly
	 * use screen coordinates for x values.
	 */
	startX = 0.0;
	endX = imgWidth;

	// check if we can get some exta information for drawing
	if (isHistogram(img)) {
		Histogram2D<T> histogram = mapOf2DHistograms.get(img);
		// get calibrated start y coordinates
		double calibratedStartY = slope * histogram.getXMin() + intercept;
		double calibratedEndY = slope * histogram.getXMax() + intercept;
		// convert calibrated coordinates to screen coordinates
		startY = calibratedStartY * histogram.getYBinWidth();
		endY = calibratedEndY * histogram.getYBinWidth();
	} else {
		startY = slope * startX + intercept;
		endY = slope * endX + intercept;
	}

	/*
	 * since the screen origin is in the top left of the image, we need to
	 * x-mirror our line
	 */
	startY = (imgHeight - 1) - startY;
	endY = (imgHeight - 1) - endY;
	// create the line ROI and add it to the overlay
	Line lineROI = new Line(startX, startY, endX, endY);
	/*
	 * Set drawing width of line to one, in case it has been changed
	 * globally.
	 */
	lineROI.setStrokeWidth(1.0f);
	overlay.add(lineROI);
}