From e8443be27c330904cae6c4e949a4588ec9ddce5b Mon Sep 17 00:00:00 2001 From: lingutln Date: Sat, 21 Jan 2012 02:41:15 +0000 Subject: [PATCH] Colors for segments and single segment labelling. Done by Nikhil. svn path=/; revision=267 --- Annotation/.classpath | 22 ++++---- Annotation/src/ie/dcu/apps/ist/AppWindow.java | 21 ++++--- .../dcu/apps/ist/views/SegmentationView.java | 23 +++++--- .../ist/widgets/AnnotatedImageControl.java | 4 +- .../ie/dcu/segment/SegmentationContext.java | 13 ++--- .../src/ie/dcu/segment/SegmentationMask.java | 17 +++++- .../dcu/segment/painters/CombinedPainter.java | 56 ++++++++++--------- .../painters/ForegroundOnlyPainter.java | 2 +- .../dcu/segment/painters/MarkupPainter.java | 2 +- .../ie/dcu/segment/painters/MaskPainter.java | 2 +- .../dcu/segment/painters/OriginalPainter.java | 2 +- .../painters/OutlineOverlayPainter.java | 2 +- .../segment/painters/SegmentationPainter.java | 2 +- 13 files changed, 97 insertions(+), 71 deletions(-) diff --git a/Annotation/.classpath b/Annotation/.classpath index 22412b6..958e3b9 100644 --- a/Annotation/.classpath +++ b/Annotation/.classpath @@ -1,11 +1,11 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Annotation/src/ie/dcu/apps/ist/AppWindow.java b/Annotation/src/ie/dcu/apps/ist/AppWindow.java index 5e01253..01707f0 100644 --- a/Annotation/src/ie/dcu/apps/ist/AppWindow.java +++ b/Annotation/src/ie/dcu/apps/ist/AppWindow.java @@ -703,15 +703,18 @@ public class AppWindow extends ApplicationWindow implements FileDropListener { } if (inside) { status(AppStatus.Information, "Location [%4d,%4d] Color [%3d,%3d,%3d]",pt.x, pt.y, c.red, c.green, c.blue); - if(view.getPainter().getMaskData().getPixel(pt.x,pt.y) == 0 && (view.getPainter().getName().equals("Foreground Only"))) - { - view.getCanvas().setToolTipText(SegmentationView.comboLabel.getText()); - return; - } - else if(view.getPainter().getMaskData().getPixel(pt.x,pt.y) == 1) - { - view.getCanvas().setToolTipText(null); - } + if(view.getContext().isEnabled()) + { + if(view.getContext().getEnabledMask().getImageData().getPixel(pt.x,pt.y) != 0 && (view.getPainter().getName().equals("Combined")) && view.getLabelMode()) + { + view.getCanvas().setToolTipText(SegmentationView.comboLabel.getText()); + return; + } + else + { + view.getCanvas().setToolTipText(null); + } + } } inside = true; } diff --git a/Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java b/Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java index 593685f..d91c1eb 100644 --- a/Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java +++ b/Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java @@ -68,7 +68,7 @@ public class SegmentationView extends Composite { private boolean auto = true; // Inorder to toggle between segmentation and Labelling mode. Initially under Segmentation Mode - public static boolean labelMode = false; + private static boolean labelMode = false; // Combo box housing the selectable views private Combo combo; @@ -159,7 +159,7 @@ public class SegmentationView extends Composite { private void addListeners() { brushControl.addSelectionListener(eventHandler); - if(!labelMode) + if(!getLabelMode()) { view.addContextChangeListener(eventHandler); } @@ -451,7 +451,7 @@ public class SegmentationView extends Composite { } public void setLabellingMode(boolean checked) { - if (!labelMode && checked) { + if (!getLabelMode() && checked) { // Toggling between Segmentation and labelling Tool.Foreground.action.setEnabled(false); Tool.Background.action.setEnabled(false); @@ -468,7 +468,7 @@ public class SegmentationView extends Composite { view.addContextChangeListener(eventHandler); view.getTool().attach(view.getImageControl()); } - labelMode = checked; + setLabelMode(checked); updateToolStates(); } @@ -844,12 +844,12 @@ public class SegmentationView extends Composite { assign.setEnabled(canZoomBestFit() & !(comboLabel.getText().isEmpty())); Tool.Foreground.action.setChecked(isAnnotatingForeground()); Tool.Background.action.setChecked(isAnnotatingBackground()); - Tool.OperatingMode.action.setChecked(labelMode); + Tool.OperatingMode.action.setChecked(getLabelMode()); Tool.Clear.action.setEnabled(canClear()); Tool.AutoApply.action.setChecked(auto); Tool.SegmenterOptions.action.setEnabled(canShowOptions()); - Tool.Foreground.action.setEnabled(!labelMode && canZoomIn()); - Tool.Background.action.setEnabled(!labelMode && canZoomIn()); + Tool.Foreground.action.setEnabled(!getLabelMode() && canZoomIn()); + Tool.Background.action.setEnabled(!getLabelMode() && canZoomIn()); Tool.OperatingMode.action.setEnabled(canZoomIn()); Tool.FormSegment.action.setEnabled(CanLabel()); @@ -944,6 +944,15 @@ public class SegmentationView extends Composite { } + public static boolean getLabelMode() { + return labelMode; + } + + public static void setLabelMode(boolean labelMode) { + SegmentationView.labelMode = labelMode; + } + + /** * Tool bar action. Delegates running to the execute method. */ diff --git a/Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java b/Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java index ffc85e1..7371d49 100644 --- a/Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java +++ b/Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java @@ -381,7 +381,7 @@ public class AnnotatedImageControl extends Composite { private final DisposeListener disposeListener = new DisposeListener() { public void widgetDisposed(DisposeEvent e) { - if (cursor != null && SegmentationView.labelMode) { + if (cursor != null && SegmentationView.getLabelMode()) { cursor.dispose(); } } @@ -396,7 +396,7 @@ public class AnnotatedImageControl extends Composite { public void mouseMove(MouseEvent e) { Canvas canvas = view.getCanvas(); - if (view.imageContains(new Point(e.x, e.y)) && !SegmentationView.labelMode) { + if (view.imageContains(new Point(e.x, e.y)) && !SegmentationView.getLabelMode()) { if (cursor == null) { cursor = CursorFactory.createCrosshairCursor(); } diff --git a/Annotation/src/ie/dcu/segment/SegmentationContext.java b/Annotation/src/ie/dcu/segment/SegmentationContext.java index a04031f..a92c828 100644 --- a/Annotation/src/ie/dcu/segment/SegmentationContext.java +++ b/Annotation/src/ie/dcu/segment/SegmentationContext.java @@ -143,11 +143,10 @@ public class SegmentationContext { public final void formSegmentationObject() { // Makes needsHighlighting False for all the previous segments. - disableAllSegments(false); + disableAllSegments(); // Set needsHighlighting True for the current segment. currentSegmentMask.enabled = true; segmentationMaskObjects.add(currentSegmentMask); - // Making a new segmentationObject after storing the current SegmentationObject currentSegmentMask = null; annotations.clear(); @@ -184,18 +183,18 @@ public class SegmentationContext { if(segmentMaskObject.getPixel(mouseClickedPoint.x, mouseClickedPoint.y) == 1) { // Disable all previous segments - disableAllSegments(false); + disableAllSegments(); // Enable the currently clicked segment. segmentMaskObject.enabled = true; } } } - public void disableAllSegments(boolean value) + public void disableAllSegments() { for(SegmentationMask currentSegmentMask : segmentationMaskObjects) { - currentSegmentMask.enabled = value; + currentSegmentMask.enabled = false; } } @@ -205,7 +204,7 @@ public class SegmentationContext { public boolean isEnabled() { for(SegmentationMask SegmentMask : segmentationMaskObjects) { - if(SegmentMask.enabled = true) + if(SegmentMask.enabled) { return true; } @@ -219,7 +218,7 @@ public class SegmentationContext { public SegmentationMask getEnabledMask() { for(SegmentationMask SegmentMask : segmentationMaskObjects) { - if(SegmentMask.enabled = true) + if(SegmentMask.enabled == true) { return SegmentMask; } diff --git a/Annotation/src/ie/dcu/segment/SegmentationMask.java b/Annotation/src/ie/dcu/segment/SegmentationMask.java index 75591de..a8e9f8e 100644 --- a/Annotation/src/ie/dcu/segment/SegmentationMask.java +++ b/Annotation/src/ie/dcu/segment/SegmentationMask.java @@ -42,7 +42,6 @@ public class SegmentationMask extends ByteMatrix{ */ public static final byte BACKGROUND = 2; - /** * The width of the segmentation mask. */ @@ -62,6 +61,12 @@ public class SegmentationMask extends ByteMatrix{ //The name(label) associated with each segment. public String segmentName; + //The maskImage each segment. + public Image maskImage; + + //The maskImageData each segment. + public ImageData maskImageData; + //Whether the segment needs to be enabled(highlighted) or not ? public boolean enabled; @@ -80,6 +85,7 @@ public class SegmentationMask extends ByteMatrix{ this.height = height; this.layerNumber = ++numberOfLayers; this.segmentName = ""; + this.enabled = false; clear(); } @@ -322,7 +328,14 @@ public class SegmentationMask extends ByteMatrix{ public void load(File file) throws IOException { load(loadImageData(file)); } - + + public Image getImage() { + return this.maskImage; + } + + public ImageData getImageData() { + return this.maskImageData; + } /** * Load the mask from a PNG image. diff --git a/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java b/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java index 9281baa..1992790 100644 --- a/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java @@ -14,9 +14,7 @@ import org.eclipse.swt.widgets.*; public class CombinedPainter implements SegmentationPainter { public static final String NAME = "Combined"; - private ImageData maskData; private ImageData maskBorderData; - private Image maskImage; private Image maskBorderImage; @@ -29,8 +27,15 @@ public class CombinedPainter implements SegmentationPainter { return "An overlaid view of the image, segmentation mask, and markup"; } - public ImageData getMaskData() { - return maskData; + public ImageData getMaskData(SegmentationContext ctx) { + /*for(SegmentationMask segmentMask : ctx.getSegmentationMasks()) + { + if(segmentMask.enabled == true) + { + return segmentMask.getImageData(); + } + }*/ + return maskBorderData; } public void paint(SegmentationContext ctx, ObservableImage im) { @@ -46,19 +51,16 @@ public class CombinedPainter implements SegmentationPainter { // For drawing all the disabled masks. for(SegmentationMask segmentMask : ctx.getSegmentationMasks()) { - if(segmentMask.enabled == true) - { - continue; - } - else + + if(segmentMask.enabled != true) + { createVisibleMask(segmentMask,false); - gc.drawImage(maskImage, 0, 0); + gc.drawImage(segmentMask.getImage(), 0, 0); createVisibleMaskBorder(segmentMask); gc.drawImage(maskBorderImage, 0, 0); } } - // For drawing the enabled mask and its border.. for(SegmentationMask segmentMask : ctx.getSegmentationMasks()) { @@ -66,14 +68,14 @@ public class CombinedPainter implements SegmentationPainter { if(segmentMask.enabled == true) { createVisibleMask(segmentMask,true); - gc.drawImage(maskImage, 0, 0); + gc.drawImage(segmentMask.getImage(), 0, 0); createVisibleMaskBorder(segmentMask); gc.drawImage(maskBorderImage, 0, 0); } } // Current mask which has not yet been made into an object createVisibleMask(ctx.getMask(),false); - gc.drawImage(maskImage, 0, 0); + gc.drawImage(ctx.getMask().getImage(), 0, 0); createVisibleMaskBorder(ctx.getMask()); gc.drawImage(maskBorderImage, 0, 0); @@ -82,7 +84,7 @@ public class CombinedPainter implements SegmentationPainter { else { createVisibleMask(ctx.getMask(),true); - gc.drawImage(maskImage, 0, 0); + gc.drawImage(ctx.getMask().getImage(), 0, 0); createVisibleMaskBorder(ctx.getMask()); gc.drawImage(maskBorderImage, 0, 0); } @@ -104,13 +106,13 @@ public class CombinedPainter implements SegmentationPainter { dispose(); - if (isNewMaskDataRequired(mask.getBounds())) { - maskData = createMaskData(mask.getBounds()); + if (isNewMaskDataRequired(mask)) { + mask.maskImageData = createMaskData(mask.getBounds()); } // Blit in pixels for (int y = 0, i = 0; y < mask.height; y++) { - int rowOffset = y * maskData.bytesPerLine; + int rowOffset = y * mask.maskImageData.bytesPerLine; for (int x = 0; x < mask.width; x++) { byte alpha, index; @@ -121,7 +123,7 @@ public class CombinedPainter implements SegmentationPainter { break; case SegmentationMask.FOREGROUND: alpha = (byte) 128; - index = (byte) ((i%3)+1); + index = (byte) (mask.layerNumber%3+1); break; default: alpha = 0; @@ -133,17 +135,17 @@ public class CombinedPainter implements SegmentationPainter { // contiguously in memory (i.e. there are > width bytes per scan-line in // the buffer), so we can't directly copy in at the same index as the // mask. - maskData.data[x + rowOffset] = index; + mask.maskImageData.data[x + rowOffset] = index; // However, the alpha data is always aligned correctly - maskData.alphaData[i] = alpha; + mask.maskImageData.alphaData[i] = alpha; // Next location in the mask i++; } } // Create new mask - maskImage = new Image(Display.getCurrent(), maskData); + mask.maskImage = new Image(Display.getCurrent(), mask.maskImageData); } private void createVisibleMaskBorder(SegmentationMask mask) { @@ -207,11 +209,11 @@ public class CombinedPainter implements SegmentationPainter { maskBorderImage = new Image(Display.getCurrent(), maskBorderData); } - private boolean isNewMaskDataRequired(Rectangle bounds) { - if (maskData == null) { + private boolean isNewMaskDataRequired(SegmentationMask mask) { + if (mask.getImageData() == null) { return true; } else { - return maskData.width != bounds.width || maskData.height != bounds.height; + return mask.getImageData().width != mask.getBounds().width || mask.getImageData().height != mask.getBounds().height; } } @@ -247,7 +249,7 @@ public class CombinedPainter implements SegmentationPainter { private static ImageData createMaskBorderData(Rectangle bounds) { RGB[] colors = new RGB[] { new RGB(255,255,255), - new RGB(0,255,0) + new RGB(255,140,0) }; // Create binary indexed palette @@ -265,7 +267,7 @@ public class CombinedPainter implements SegmentationPainter { } public void dispose() { - // Dispose mask + /*// Dispose mask if (maskImage != null) { if (!maskImage.isDisposed()) { maskImage.dispose(); @@ -277,6 +279,6 @@ public class CombinedPainter implements SegmentationPainter { maskBorderImage.dispose(); } maskBorderImage = null; - } + }*/ } } diff --git a/Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java b/Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java index bc2bcb0..5e0fae8 100644 --- a/Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java @@ -26,7 +26,7 @@ public class ForegroundOnlyPainter implements SegmentationPainter { return "Shows the foreground region of the image."; } - public ImageData getMaskData() { + public ImageData getMaskData(SegmentationContext ctx) { return maskData; } diff --git a/Annotation/src/ie/dcu/segment/painters/MarkupPainter.java b/Annotation/src/ie/dcu/segment/painters/MarkupPainter.java index 7f9dc61..a07e240 100644 --- a/Annotation/src/ie/dcu/segment/painters/MarkupPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/MarkupPainter.java @@ -26,7 +26,7 @@ public class MarkupPainter implements SegmentationPainter { return NAME; } - public ImageData getMaskData() { + public ImageData getMaskData(SegmentationContext ctx) { return null; } diff --git a/Annotation/src/ie/dcu/segment/painters/MaskPainter.java b/Annotation/src/ie/dcu/segment/painters/MaskPainter.java index f7d3b89..a634c7c 100644 --- a/Annotation/src/ie/dcu/segment/painters/MaskPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/MaskPainter.java @@ -26,7 +26,7 @@ public class MaskPainter implements SegmentationPainter { return NAME; } - public ImageData getMaskData() { + public ImageData getMaskData(SegmentationContext ctx) { return maskData; } diff --git a/Annotation/src/ie/dcu/segment/painters/OriginalPainter.java b/Annotation/src/ie/dcu/segment/painters/OriginalPainter.java index c39c0d1..faacb64 100644 --- a/Annotation/src/ie/dcu/segment/painters/OriginalPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/OriginalPainter.java @@ -23,7 +23,7 @@ public class OriginalPainter implements SegmentationPainter { return NAME; } - public ImageData getMaskData() { + public ImageData getMaskData(SegmentationContext ctx) { return null; } diff --git a/Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java b/Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java index 7f7b838..a13e3d3 100644 --- a/Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java @@ -25,7 +25,7 @@ public class OutlineOverlayPainter implements SegmentationPainter { return "Shows an an overlay of foreground border on the image"; } - public ImageData getMaskData() { + public ImageData getMaskData(SegmentationContext ctx) { return maskData; } diff --git a/Annotation/src/ie/dcu/segment/painters/SegmentationPainter.java b/Annotation/src/ie/dcu/segment/painters/SegmentationPainter.java index f69d6e9..cb4e103 100644 --- a/Annotation/src/ie/dcu/segment/painters/SegmentationPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/SegmentationPainter.java @@ -21,7 +21,7 @@ public interface SegmentationPainter { /** * Returns a description of the painter. */ - public ImageData getMaskData(); + public ImageData getMaskData(SegmentationContext ctx); /** * Returns a masked imageData. -- 2.34.1