From: lingutln Date: Mon, 9 Jan 2012 23:35:10 +0000 (+0000) Subject: Layered Segmentation. Done by Nikhil. X-Git-Url: http://gitweb.planteome.org/?a=commitdiff_plain;h=3f905746e57135cad441bb2cfd7d5ce5d1e32599;p=old-jaiswallab-svn%2F.git Layered Segmentation. Done by Nikhil. svn path=/; revision=257 --- diff --git a/Annotation/.classpath b/Annotation/.classpath index dae8e98..22412b6 100644 --- a/Annotation/.classpath +++ b/Annotation/.classpath @@ -1,11 +1,11 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java b/Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java index 8e7f715..8337906 100644 --- a/Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java +++ b/Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java @@ -479,6 +479,7 @@ public class SegmentationView extends Composite { public void formSegmetationObject() { view.getContext().formSegmentationObject(); + updateToolStates(); } @@ -832,7 +833,14 @@ public class SegmentationView extends Composite { Tool.ZoomOut.action.setEnabled(canZoomOut()); Tool.ZoomOriginal.action.setEnabled(canZoomOriginal()); Tool.ZoomBestFit.action.setEnabled(canZoomBestFit()); - comboLabel.setEnabled(CanLabel()); + if(view.getContext() != null) + { + comboLabel.setEnabled((view.getContext().getMasks().size() > 0)); + } + else + { + comboLabel.setEnabled(false); + } assign.setEnabled(canZoomBestFit() & !(comboLabel.getText().isEmpty())); Tool.Foreground.action.setChecked(isAnnotatingForeground()); Tool.Background.action.setChecked(isAnnotatingBackground()); @@ -1036,21 +1044,30 @@ public class SegmentationView extends Composite { private final MouseListener popupListener = new MouseListener() { public void mouseUp(MouseEvent event) { - PopUpLabelDialog dialog = new PopUpLabelDialog(getShell()); - PopUpLabelDialog.Result result = dialog.open(); - if (result != null) { - String lab = null; - if(result.comboText.indexOf('{') != -1) - { - lab = result.comboText.substring(0,result.comboText.indexOf('{')-1); - } - else - { - lab = result.comboText; - } - System.out.println("selected"+lab); - comboLabel.setText(result.comboText); - execute(Tool.AssignButton, null); + // For the right click + if(event.button == 3) + { + PopUpLabelDialog dialog = new PopUpLabelDialog(getShell()); + PopUpLabelDialog.Result result = dialog.open(); + if (result != null) + { + String lab = null; + if(result.comboText.indexOf('{') != -1) + { + lab = result.comboText.substring(0,result.comboText.indexOf('{')-1); + } + else + { + lab = result.comboText; + } + System.out.println("selected"+lab); + comboLabel.setText(result.comboText); + execute(Tool.AssignButton, null); + } + } + else if(event.button == 1) + { + System.out.println("Mouse left click"); } } public void mouseDown(MouseEvent e) diff --git a/Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java b/Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java index c3e578e..2a8644e 100644 --- a/Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java +++ b/Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java @@ -204,7 +204,8 @@ public class AnnotatedImageControl extends Composite { } public boolean CanLabel() { - if (ctx != null) { + if (ctx != null) + { return ctx.getAnnotations().canLabel(); } return false; diff --git a/Annotation/src/ie/dcu/segment/SegmentationContext.java b/Annotation/src/ie/dcu/segment/SegmentationContext.java index 4b31b1b..7a0171d 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 segmentationObjects; + private ArrayList segmentationMaskObjects; // lazy create (use getters for these fields) private AnnotationManager annotations; - private SegmentationObject segmentObject; + private SegmentationMask segmentationMask; 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; - segmentationObjects = new ArrayList(); + segmentationMaskObjects = new ArrayList(); } /** @@ -122,7 +122,7 @@ public class SegmentationContext { } return annotations; } - + /** * Returns the bounds of the current image and segmentation mask. * @@ -136,41 +136,32 @@ public class SegmentationContext { } public final void formSegmentationObject() { - segmentationObjects.add(segmentObject); - System.out.println("Number of objects formed : "+segmentationObjects.size()); - /*if(segmentationObjects.size()>1) - { - //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"); - } - }*/ + segmentationMaskObjects.add(segmentationMask); + // Making a new segmentationObject after storing the current SegmentationObject - segmentObject = null; - // System.out.println("Annotation size : "+annotations.count()); + segmentationMask = null; annotations.clear(); } /** - * Returns the current segmentation mask. + * Returns the current segmentation mask which has not yet been made into an object. * * @return A {@link SegmentationMask} instance. Returns the latest mask which hasn't yet turned into an object. */ public SegmentationMask getMask() { - if (segmentObject == null) { - segmentObject = new SegmentationObject(getBounds()); + if (segmentationMask == null) { + segmentationMask = new SegmentationMask(getBounds()); } - return segmentObject; + return segmentationMask; } - - public ArrayList getMasks() { + /** + * All the masks excluding the current mask (i.e the mask which has not yet been made into a Segmentation object) + * @return + * A list of SegmentationMasks excluding the current mask which has not yet been made into a Segmentation object + */ + public ArrayList getMasks() { - return segmentationObjects; + return segmentationMaskObjects; } /** @@ -322,7 +313,7 @@ public class SegmentationContext { new FileInputStream(file))); ImageData imageData = null; - SegmentationObject segmentObject = null; + SegmentationMask segmentMaskObject = null; AnnotationManager annotations = null; try { @@ -335,7 +326,7 @@ public class SegmentationContext { imageData = SwtUtils.loadImageData(in); } else if (name.equals("mask.png")) { - segmentObject = (SegmentationObject) SegmentationMask.read(in); + segmentMaskObject = SegmentationMask.read(in); } else if (name.equals("markup.dat")) { annotations = new AnnotationManager(); @@ -353,7 +344,7 @@ public class SegmentationContext { throw new IOException("No image found in context file"); } - if (segmentObject == null) { + if (segmentMaskObject == null) { throw new IOException("No mask found in context file"); } @@ -363,7 +354,7 @@ public class SegmentationContext { SegmentationContext ctx = new SegmentationContext(imageData, file); - ctx.segmentObject = segmentObject; + ctx.segmentationMask = segmentMaskObject; ctx.annotations = annotations; return ctx; diff --git a/Annotation/src/ie/dcu/segment/SegmentationMask.java b/Annotation/src/ie/dcu/segment/SegmentationMask.java index 74f0138..28211a9 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 SegmentationObject(data.width, data.height); + SegmentationMask mask = new SegmentationMask(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 SegmentationObject(data.width, data.height); + SegmentationMask mask = new SegmentationMask(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 deleted file mode 100644 index 8b53bf5..0000000 --- a/Annotation/src/ie/dcu/segment/SegmentationObject.java +++ /dev/null @@ -1,32 +0,0 @@ -package ie.dcu.segment; - -import org.eclipse.swt.graphics.Rectangle; - - -/** - * Class that represents a independent segmentation mask. - * - * A segmentation mask is a two dimensional matrix of byte values. It is used - * to represents which pixels in an image that are part of the foreground, and - * which are part of the background. - * - * @author Nikhil - */ - -public final class SegmentationObject extends SegmentationMask{ - - private static final long serialVersionUID = 8321845179859248904L; - private int layerNumber; - - public SegmentationObject(int width, int height) { - super(width, height); - // TODO Auto-generated constructor stub - } - - 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 b3af16e..77c519f 100644 --- a/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java +++ b/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java @@ -32,26 +32,40 @@ public class CombinedPainter implements SegmentationPainter { } public void paint(SegmentationContext ctx, ObservableImage im) { - + GC gc = im.beginPaint(); // Paint image gc.drawImage(ctx.getImage(), 0, 0); - // Paint mask - if(ctx.getMasks().size() != 0) + // Paint masks + if(ctx.getMasks().size() > 0) { // For drawing all the previous masks. for(SegmentationMask mask : ctx.getMasks()) { - createVisibleMask(mask); - gc.drawImage(maskImage, 0, 0); + // Blending of background pixel values while pasting the last mask only + if(ctx.getMasks().indexOf(mask) == ctx.getMasks().size()-1) + { + createVisibleMask(mask,true); + gc.drawImage(maskImage, 0, 0); + } + else + { + createVisibleMask(mask,false); + gc.drawImage(maskImage, 0, 0); + } } + // Current mask which has not yet been made into an object + createVisibleMask(ctx.getMask(),false); + gc.drawImage(maskImage, 0, 0); } - // Drawing the current mask - createVisibleMask(ctx.getMask()); - gc.drawImage(maskImage, 0, 0); - + else + { + createVisibleMask(ctx.getMask(),true); + gc.drawImage(maskImage, 0, 0); + } + // Paint all annotations ctx.getAnnotations().paint(im); @@ -61,7 +75,7 @@ public class CombinedPainter implements SegmentationPainter { - private void createVisibleMask(SegmentationMask mask) { + private void createVisibleMask(SegmentationMask mask,boolean isFirstObject) { dispose(); if (isNewMaskDataRequired(mask.getBounds())) { maskData = createMaskData(mask.getBounds()); @@ -75,7 +89,7 @@ public class CombinedPainter implements SegmentationPainter { switch (mask.values[i]) { case SegmentationMask.BACKGROUND: - alpha = (byte) 128; + alpha = isFirstObject ? (byte) 128 : (byte) 0; index = 2; break; case SegmentationMask.FOREGROUND: @@ -107,62 +121,6 @@ public class CombinedPainter implements SegmentationPainter { } - - - // Temp code, will remove - - /*private void createVisibleMask(ArrayList masks) { - dispose(); - System.out.println("In loop"+masks.size()); - for (SegmentationMask mask : masks) { - 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); - }*/ - - - - - private boolean isNewMaskDataRequired(Rectangle bounds) { if (maskData == null) { return true;