item.setControl(assign);
assign.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent arg0) {
- String lab = null;
- if(comboLabel.getText().indexOf('{') != -1)
- {
- lab = comboLabel.getText().substring(0,comboLabel.getText().indexOf('{')-1);
- }
- else
- {
- lab = comboLabel.getText();
- }
- System.out.println("selected"+lab);
+ if(view.getContext().isEnabled())
+ {
+ if(comboLabel.getText().indexOf('{') != -1)
+ {
+ view.getContext().getEnabledMask().segmentName = comboLabel.getText().substring(0,comboLabel.getText().indexOf('{')-1);
+ }
+ else
+ {
+ view.getContext().getEnabledMask().segmentName = comboLabel.getText();
+ }
+ }
+ System.out.println("selected"+view.getContext().getEnabledMask().segmentName);
execute(Tool.AssignButton, null);
}
@Override
setPainter(painter);
}
/*
- Assign the label to the segment on clicking assign button and update the image segment.
- */
+ Assign the label to the segment on clicking assign button and update the image segment.
+ */
private void assignLabel() {
- SegmentationPainter painter = painters.get("Foreground Only");
+ SegmentationPainter painter = painters.get("Combined");
setPainter(painter);
}
public static final String NAME = "Combined";
private ImageData maskData;
+ private ImageData maskBorderData;
private Image maskImage;
+ private Image maskBorderImage;
public String getName() {
// For drawing all the disabled masks.
for(SegmentationMask segmentMask : ctx.getSegmentationMasks())
{
- // Skipping the enabled segment from painting. We will paint the enabled segment at last.
- /*if(segmentMask.layerNumber == 0)
- {
- createVisibleMask(segmentMask,true);
- gc.drawImage(maskImage, 0, 0);
- }*/
if(segmentMask.enabled == true)
{
continue;
{
createVisibleMask(segmentMask,false);
gc.drawImage(maskImage, 0, 0);
+ createVisibleMaskBorder(segmentMask);
+ gc.drawImage(maskBorderImage, 0, 0);
}
}
}
{
createVisibleMask(segmentMask,true);
gc.drawImage(maskImage, 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);
+ createVisibleMaskBorder(ctx.getMask());
+ gc.drawImage(maskBorderImage, 0, 0);
}
// Very initial mask, which has not yet been turned into an object.
else
{
createVisibleMask(ctx.getMask(),true);
gc.drawImage(maskImage, 0, 0);
+ createVisibleMaskBorder(ctx.getMask());
+ gc.drawImage(maskBorderImage, 0, 0);
}
// Paint all annotations
ctx.getAnnotations().paint(im);
maskImage = new Image(Display.getCurrent(), maskData);
}
-
+ private void createVisibleMaskBorder(SegmentationMask mask) {
+ dispose();
+
+ if (isNewMaskBorderDataRequired(mask.getBounds())) {
+ maskBorderData = createMaskBorderData(mask.getBounds());
+ }
+
+ // Set pixels
+ byte[] buff = new byte[maskBorderData.width];
+ for (int y = 0, i = 0; y < mask.height-1; y++) {
+ for (int x = 0; x < mask.width-1; x++) {
+ // Make transparent
+ buff[x] = 0;
+
+ // Current pixel
+ byte pix1 = mask.values[i];
+
+ // Neighbor to right & neighbor below
+ byte pix2 = mask.values[i+1];
+ byte pix3 = mask.values[i+mask.width];
+
+ // Set pixel if either neighbor is different
+ if (pix1 != pix2 || pix1 != pix3) {
+ buff[x] = 1;
+ }
+
+ // Next pixel
+ i++;
+ }
+
+ if (mask.width != 0) {
+ // Last pixel in row
+ byte pix1 = mask.values[i];
+ byte pix2 = mask.values[i+mask.width];
+ buff[mask.width-1] = (pix1 != pix2) ? (byte) 1 : 0;
+
+ // Next row
+ i++;
+ }
+
+ // Blit pixels
+ maskBorderData.setPixels(0, y, buff.length, buff, 0);
+ }
+
+ // Last row
+ if (mask.height != 0) {
+ int yoff = (mask.height - 1) * mask.width;
+ for (int x = 0; x < mask.width-1; x++) {
+ byte pix1 = mask.values[x+yoff];
+ byte pix2 = mask.values[x+yoff+1];
+ buff[x] = (pix1 != pix2) ? (byte) 1 : 0;
+ }
+
+ // Blit
+ maskBorderData.setPixels(0, mask.height-1, buff.length, buff, 0);
+ }
+
+ // Create new mask
+ maskBorderImage = new Image(Display.getCurrent(), maskBorderData);
+ }
+
private boolean isNewMaskDataRequired(Rectangle bounds) {
if (maskData == null) {
return true;
return maskData.width != bounds.width || maskData.height != bounds.height;
}
}
-
+
+ private boolean isNewMaskBorderDataRequired(Rectangle bounds) {
+ if (maskBorderData == null) {
+ return true;
+ } else {
+ return maskBorderData.width != bounds.width || maskBorderData.height != bounds.height;
+ }
+ }
private static ImageData createMaskData(Rectangle bounds) {
RGB[] colors = new RGB[] {
new RGB(128,128,128),
- new RGB(255,255,255),
+ //new RGB(255,255,255),
+ new RGB(255,180,180),
new RGB(0, 0, 0)
};
return data;
}
-
+ private static ImageData createMaskBorderData(Rectangle bounds) {
+ RGB[] colors = new RGB[] {
+ new RGB(255,255,255),
+ new RGB(0,255,0)
+ };
+
+ // Create binary indexed palette
+ PaletteData palette = new PaletteData(colors);
+
+ // Create 1 bit indexed image
+ ImageData data = new ImageData(
+ bounds.width, bounds.height, 1, palette);
+
+ // Set transparent pixel
+ data.transparentPixel = 0;
+
+ // Create and return the image
+ return data;
+ }
+
public void dispose() {
// Dispose mask
if (maskImage != null) {
}
maskImage = null;
}
+ if (maskBorderImage != null) {
+ if (!maskBorderImage.isDisposed()) {
+ maskBorderImage.dispose();
+ }
+ maskBorderImage = null;
+ }
}
}