From 642dd45dac5adc224eefaa7cbee3ee5a75519b6a Mon Sep 17 00:00:00 2001 From: lingutln Date: Mon, 9 Jan 2012 02:35:50 +0000 Subject: [PATCH] Layered Segmentation. Done by Nikhil. svn path=/; revision=256 --- Annotation/.classpath | 22 +++--- .../ie/dcu/segment/SegmentationContext.java | 65 ++++++++-------- .../src/ie/dcu/segment/SegmentationMask.java | 4 +- .../ie/dcu/segment/SegmentationObject.java | 7 +- .../dcu/segment/painters/CombinedPainter.java | 77 ++++++++++++++++--- .../painters/ForegroundOnlyPainter.java | 1 - .../painters/OutlineOverlayPainter.java | 12 ++- 7 files changed, 126 insertions(+), 62 deletions(-) diff --git a/Annotation/.classpath b/Annotation/.classpath index 22412b6..dae8e98 100644 --- a/Annotation/.classpath +++ b/Annotation/.classpath @@ -1,11 +1,11 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Annotation/src/ie/dcu/segment/SegmentationContext.java b/Annotation/src/ie/dcu/segment/SegmentationContext.java index 333cffe..4b31b1b 100644 --- a/Annotation/src/ie/dcu/segment/SegmentationContext.java +++ b/Annotation/src/ie/dcu/segment/SegmentationContext.java @@ -45,11 +45,11 @@ public class SegmentationContext { /** * For storing independent Segmentation objects */ - private ArrayList maskObjects; + private ArrayList segmentationObjects; // lazy create (use getters for these fields) private AnnotationManager annotations; - private SegmentationMask mask; + private SegmentationObject segmentObject; private Image image; private Rectangle bounds; @@ -65,7 +65,7 @@ public class SegmentationContext { private SegmentationContext(ImageData imageData, File file) { this.imageData = imageData; this.file = file; - maskObjects = new ArrayList(); + segmentationObjects = new ArrayList(); } /** @@ -136,42 +136,43 @@ public class SegmentationContext { } public final void formSegmentationObject() { - maskObjects.add(mask); - System.out.println(""+maskObjects.get(0)); - SegmentationMask tempMask = maskObjects.get(0); - mask = new SegmentationMask(imageData.width, imageData.height); - if(tempMask.equals(maskObjects.get(0))) + segmentationObjects.add(segmentObject); + System.out.println("Number of objects formed : "+segmentationObjects.size()); + /*if(segmentationObjects.size()>1) { - System.out.println("Equal"); - } - else - { - System.out.println("Not equal"); - } - System.out.println(""+maskObjects.get(0)); - // System.out.println("Mask objects size : "+maskObjects.size()); + //assert (segmentationObjects.get(0).equals(segmentationObjects.get(1))) : true; + if(segmentationObjects.get(0).equals(segmentationObjects.get(1))) + { + System.out.println("Both objects are equal"); + } + else + { + System.out.println("Both objects are not equal"); + } + }*/ + // Making a new segmentationObject after storing the current SegmentationObject + segmentObject = null; + // System.out.println("Annotation size : "+annotations.count()); + annotations.clear(); } /** * Returns the current segmentation mask. * - * @return A {@link SegmentationMask} instance. + * @return A {@link SegmentationMask} instance. Returns the latest mask which hasn't yet turned into an object. */ public SegmentationMask getMask() { - if (mask == null) { - mask = new SegmentationMask(getBounds()); + if (segmentObject == null) { + segmentObject = new SegmentationObject(getBounds()); } - return mask; + return segmentObject; + } + + public ArrayList getMasks() { + + return segmentationObjects; } - public ArrayList getMasks() { - if (maskObjects.size() == 0 && mask == null) { - mask = new SegmentationMask(getBounds()); - System.out.println("Mask coming as "+mask); - } - return maskObjects; - } - /** * Returns the current image being segmented. This method returns an an SWT * Image instance, constructing it if it is not already available. The @@ -321,7 +322,7 @@ public class SegmentationContext { new FileInputStream(file))); ImageData imageData = null; - SegmentationMask mask = null; + SegmentationObject segmentObject = null; AnnotationManager annotations = null; try { @@ -334,7 +335,7 @@ public class SegmentationContext { imageData = SwtUtils.loadImageData(in); } else if (name.equals("mask.png")) { - mask = SegmentationMask.read(in); + segmentObject = (SegmentationObject) SegmentationMask.read(in); } else if (name.equals("markup.dat")) { annotations = new AnnotationManager(); @@ -352,7 +353,7 @@ public class SegmentationContext { throw new IOException("No image found in context file"); } - if (mask == null) { + if (segmentObject == null) { throw new IOException("No mask found in context file"); } @@ -362,7 +363,7 @@ public class SegmentationContext { SegmentationContext ctx = new SegmentationContext(imageData, file); - ctx.mask = mask; + ctx.segmentObject = segmentObject; ctx.annotations = annotations; return ctx; diff --git a/Annotation/src/ie/dcu/segment/SegmentationMask.java b/Annotation/src/ie/dcu/segment/SegmentationMask.java index 28211a9..74f0138 100644 --- a/Annotation/src/ie/dcu/segment/SegmentationMask.java +++ b/Annotation/src/ie/dcu/segment/SegmentationMask.java @@ -330,7 +330,7 @@ public class SegmentationMask extends ByteMatrix{ ImageData data = loadImageData(file); // Create compatible mask - SegmentationMask mask = new SegmentationMask(data.width, data.height); + SegmentationMask mask = new SegmentationObject(data.width, data.height); // Load data into the mask mask.load(data); @@ -353,7 +353,7 @@ public class SegmentationMask extends ByteMatrix{ ImageData data = loadImageData(in); // Create compatible mask - SegmentationMask mask = new SegmentationMask(data.width, data.height); + SegmentationMask mask = new SegmentationObject(data.width, data.height); // Load data into the mask mask.load(data); diff --git a/Annotation/src/ie/dcu/segment/SegmentationObject.java b/Annotation/src/ie/dcu/segment/SegmentationObject.java index 5242291..8b53bf5 100644 --- a/Annotation/src/ie/dcu/segment/SegmentationObject.java +++ b/Annotation/src/ie/dcu/segment/SegmentationObject.java @@ -13,23 +13,20 @@ import org.eclipse.swt.graphics.Rectangle; * @author Nikhil */ -public final class SegmentationObject extends SegmentationMask implements Cloneable{ +public final class SegmentationObject extends SegmentationMask{ private static final long serialVersionUID = 8321845179859248904L; - private final SegmentationMask mask = new SegmentationMask(getBounds()); private int layerNumber; public SegmentationObject(int width, int height) { super(width, height); // TODO Auto-generated constructor stub - layerNumber += 1; } public SegmentationObject(Rectangle bounds) { this(bounds.width, bounds.height); // TODO Auto-generated constructor stub } - - + } diff --git a/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java b/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java index aa71de0..b3af16e 100644 --- a/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java @@ -1,7 +1,5 @@ package ie.dcu.segment.painters; -import java.util.ArrayList; - import ie.dcu.segment.*; import ie.dcu.swt.ObservableImage; @@ -41,14 +39,19 @@ public class CombinedPainter implements SegmentationPainter { gc.drawImage(ctx.getImage(), 0, 0); // Paint mask - // To be removed - if(ctx.getMasks().size() == 0) + if(ctx.getMasks().size() != 0) { - maskData = createMaskData(ctx.getBounds()); + // For drawing all the previous masks. + for(SegmentationMask mask : ctx.getMasks()) + { + createVisibleMask(mask); + gc.drawImage(maskImage, 0, 0); + } } - createVisibleMask(ctx.getMasks()); + // Drawing the current mask + createVisibleMask(ctx.getMask()); gc.drawImage(maskImage, 0, 0); - + // Paint all annotations ctx.getAnnotations().paint(im); @@ -56,8 +59,59 @@ public class CombinedPainter implements SegmentationPainter { im.endPaint(); } - - private void createVisibleMask(ArrayList masks) { + + + private void createVisibleMask(SegmentationMask mask) { + dispose(); + if (isNewMaskDataRequired(mask.getBounds())) { + maskData = createMaskData(mask.getBounds()); + } + + // Blit in pixels + for (int y = 0, i = 0; y < mask.height; y++) { + int rowOffset = y * maskData.bytesPerLine; + for (int x = 0; x < mask.width; x++) { + byte alpha, index; + + switch (mask.values[i]) { + case SegmentationMask.BACKGROUND: + alpha = (byte) 128; + index = 2; + break; + case SegmentationMask.FOREGROUND: + alpha = (byte) 128; + index = 1; + break; + default: + alpha = 0; + index = 0; + break; + } + + // The SWT ImageData buffer doesn't usually have it's rows aligned + // 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; + + // However, the alpha data is always aligned correctly + maskData.alphaData[i] = alpha; + + // Next location in the mask + i++; + } + } + + // Create new mask + maskImage = new Image(Display.getCurrent(), maskData); + } + + + + + // Temp code, will remove + + /*private void createVisibleMask(ArrayList masks) { dispose(); System.out.println("In loop"+masks.size()); for (SegmentationMask mask : masks) { @@ -103,7 +157,10 @@ public class CombinedPainter implements SegmentationPainter { // Create new mask maskImage = new Image(Display.getCurrent(), maskData); - } + }*/ + + + private boolean isNewMaskDataRequired(Rectangle bounds) { diff --git a/Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java b/Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java index ccd7702..bc2bcb0 100644 --- a/Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java @@ -56,7 +56,6 @@ public class ForegroundOnlyPainter implements SegmentationPainter { byte[] buff = new byte[maskData.width]; for (int y = 0, i = 0; y < mask.height; y++) { for (int x = 0; x < mask.width; x++) { - System.out.println("Mask values coming as "+mask.values[i]); switch (mask.values[i++]) { case SegmentationMask.BACKGROUND: // black diff --git a/Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java b/Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java index 21271b4..7f7b838 100644 --- a/Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java @@ -36,6 +36,16 @@ public class OutlineOverlayPainter implements SegmentationPainter { gc.drawImage(ctx.getImage(), 0, 0); // Paint mask + /* if(ctx.getMasks().size() != 0) + { + // For drawing all the previous masks. + for(SegmentationMask mask : ctx.getMasks()) + { + createVisibleMask(mask); + gc.drawImage(maskImage, 0, 0); + } + }*/ + // Drawing the current mask createVisibleMask(ctx.getMask()); gc.drawImage(maskImage, 0, 0); @@ -118,7 +128,7 @@ public class OutlineOverlayPainter implements SegmentationPainter { private static ImageData createMaskData(Rectangle bounds) { RGB[] colors = new RGB[] { new RGB(255,255,255), - new RGB(255,0,0) + new RGB(0,255,0) }; // Create binary indexed palette -- 2.34.1