Hello!

To see the file structure, click on "tree".

Note that updates take place every 10 minutes, commits may not be seen immediately.
Layered Segmentation. Done by Nikhil.
authorlingutln <lingutln@localhost>
Mon, 9 Jan 2012 02:35:50 +0000 (02:35 +0000)
committerlingutln <lingutln@localhost>
Mon, 9 Jan 2012 02:35:50 +0000 (02:35 +0000)
svn path=/; revision=256

Annotation/.classpath
Annotation/src/ie/dcu/segment/SegmentationContext.java
Annotation/src/ie/dcu/segment/SegmentationMask.java
Annotation/src/ie/dcu/segment/SegmentationObject.java
Annotation/src/ie/dcu/segment/painters/CombinedPainter.java
Annotation/src/ie/dcu/segment/painters/ForegroundOnlyPainter.java
Annotation/src/ie/dcu/segment/painters/OutlineOverlayPainter.java

index 22412b6c9a2c02f608af7c008e1447f0c9cabf62..dae8e98e88b39b4f09341cfcc41b0d028f908a0a 100644 (file)
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry excluding="src/" kind="src" path=""/>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-       <classpathentry kind="lib" path="/home/lingutln/workspace/Annotation/library/commons-lang3-3.1.jar"/>
-       <classpathentry kind="lib" path="/home/lingutln/workspace/Annotation/library/jface.jar"/>
-       <classpathentry kind="lib" path="/home/lingutln/workspace/Annotation/library/json.jar"/>
-       <classpathentry kind="lib" path="/home/lingutln/workspace/Annotation/library/swt-gtk-64.jar"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+       <classpathentry kind="src" path="src"/>\r
+       <classpathentry excluding="src/" kind="src" path=""/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>\r
+       <classpathentry kind="lib" path="C:/Users/Nikhil/workspace/image_annotation/lib/jface.jar"/>\r
+       <classpathentry kind="lib" path="C:/Users/Nikhil/workspace/image_annotation/lib/swt-win.jar"/>\r
+       <classpathentry kind="lib" path="C:/Users/Nikhil/workspace/Annotation/library/commons-lang3-3.1.jar"/>\r
+       <classpathentry kind="lib" path="C:/Users/Nikhil/workspace/Annotation/library/json.jar"/>\r
+       <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
index 333cffe286446bb5f3e3a2102e7e985ea4e96e11..4b31b1b2d229b4ae11c93ebe286ee28c3034360a 100644 (file)
@@ -45,11 +45,11 @@ public class SegmentationContext {
        /**
         * For storing independent Segmentation objects
         */
-       private ArrayList<SegmentationMask> maskObjects;
+       private ArrayList<SegmentationObject> 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<SegmentationMask>();
+               segmentationObjects = new ArrayList<SegmentationObject>();
        }
 
        /**
@@ -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<SegmentationObject> getMasks() {
+               
+               return segmentationObjects;
        }
        
-       public ArrayList<SegmentationMask> 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;
index 28211a90e7d2cd2c8395f0fbc70bbc8c08672a6d..74f0138db353c62289f079a5d3d7192e3d33d133 100644 (file)
@@ -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);
index 5242291cb2ec196672b09ce1479ee80627120872..8b53bf59cbb074e7917df51aae39aab63db283ab 100644 (file)
@@ -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
        }
-       
-       
+               
        
 }
index aa71de01e517256dae27c5936e8f3183a13505fb..b3af16e8da324916362146aad2e94a6b42f4bc7d 100644 (file)
@@ -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<SegmentationMask> 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<SegmentationMask> 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) {
index ccd7702a2a405752093624e4d94c2284d9bc2d26..bc2bcb0c09572243276e22ea8cf9046d165e14a1 100644 (file)
@@ -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
index 21271b45fee62c3556e62ee89d9ade44b83f02fe..7f7b838010f33dff6daa792a6d91d3b948f5aa31 100644 (file)
@@ -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