-<?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
/**
* 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;
private SegmentationContext(ImageData imageData, File file) {
this.imageData = imageData;
this.file = file;
- maskObjects = new ArrayList<SegmentationMask>();
+ segmentationObjects = new ArrayList<SegmentationObject>();
}
/**
}
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
new FileInputStream(file)));
ImageData imageData = null;
- SegmentationMask mask = null;
+ SegmentationObject segmentObject = null;
AnnotationManager annotations = null;
try {
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();
throw new IOException("No image found in context file");
}
- if (mask == null) {
+ if (segmentObject == null) {
throw new IOException("No mask found in context file");
}
SegmentationContext ctx = new SegmentationContext(imageData, file);
- ctx.mask = mask;
+ ctx.segmentObject = segmentObject;
ctx.annotations = annotations;
return ctx;
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);
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);
* @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
}
-
-
+
}
package ie.dcu.segment.painters;
-import java.util.ArrayList;
-
import ie.dcu.segment.*;
import ie.dcu.swt.ObservableImage;
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);
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) {
// Create new mask
maskImage = new Image(Display.getCurrent(), maskData);
- }
+ }*/
+
+
+
private boolean isNewMaskDataRequired(Rectangle bounds) {
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
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);
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