package fr.unistra.pelican.demos;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.net.MalformedURLException;
import java.net.URL;
import javax.media.jai.RasterFactory;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import fr.unistra.pelican.BooleanImage;
import fr.unistra.pelican.ByteImage;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.IntegerImage;
import fr.unistra.pelican.algorithms.arithmetic.AdditionChecked;
import fr.unistra.pelican.algorithms.io.ImageBuilder;
import fr.unistra.pelican.algorithms.logical.OR;
import fr.unistra.pelican.algorithms.morphology.binary.BinaryDilation;
import fr.unistra.pelican.algorithms.segmentation.MarkerBasedMultiProbashed;
import fr.unistra.pelican.algorithms.segmentation.labels.DrawFrontiersOnImage;
import fr.unistra.pelican.algorithms.segmentation.labels.FrontiersFromSegmentation;
import fr.unistra.pelican.algorithms.segmentation.labels.LabelsToBinaryMasks;
import fr.unistra.pelican.algorithms.segmentation.labels.LabelsToColorByMeanValue;
import fr.unistra.pelican.algorithms.visualisation.Viewer2D;
import fr.unistra.pelican.util.morphology.FlatStructuringElement2D;
/**
*
*/
public class SupervisedWatershedApplet extends JApplet implements
ActionListener {
/***************************************************************************
*
*
* Attributes
*
*
**************************************************************************/
private JButton openFile;
private JFileChooser chooserSave = new JFileChooser();
private JFileChooser chooserLoad = new JFileChooser();
private String fileName;
/***************************************************************************
*
*
* Methods
*
*
**************************************************************************/
public void init() {
// Set the load button
setLayout(new BorderLayout());
openFile = new JButton("Load");
add(openFile, BorderLayout.NORTH);
openFile.addActionListener(this);
openFile.setPreferredSize(new Dimension(60,20));
setSize(200, 200);
}
public URL getURL(String filename) {
URL codebase = this.getCodeBase();
URL url = null;
try {
url = new URL(codebase, filename);
} catch (MalformedURLException e) {
System.err.println("MalformedURLException");
return null;
}
return url;
}
public void actionPerformed(ActionEvent arg0) {
int responce = chooserLoad.showOpenDialog(this);
if (responce == JFileChooser.APPROVE_OPTION) {
fileName = "" + chooserLoad.getSelectedFile();
}
// Get the image
System.out.println("le chemin seul: " + fileName);
System.out.println("le chemin avec le codebase: " + this.getCodeBase() + fileName);
//ImageIcon icon = new ImageIcon(getURL(fileName))
ImageIcon icon = new ImageIcon(fileName);
java.awt.Image img = icon.getImage();
// create BufferedImage
BufferedImage bimg = new BufferedImage(img.getWidth(null), img
.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics g = bimg.createGraphics();
g.drawImage(img, 0, 0, null);
g.dispose();
Image input = bufferedImageToImage(bimg);
Image markers = ImageBuilder.exec(input, "SupervisedWatersedApplet");
Image samples = LabelsToBinaryMasks.exec(markers);
long t1 = System.currentTimeMillis();
Image result = MarkerBasedMultiProbashed.exec(input, samples);
long t2 = System.currentTimeMillis();
System.out.println("Supervised segmentation : " + (t2 - t1) / 1000.0
+ " s");
Image view1 = LabelsToColorByMeanValue.exec((IntegerImage)result, input);
Viewer2D.exec(view1, "SupervisedWatersedDemo: regions");
Image frontiers = BinaryDilation.exec(FrontiersFromSegmentation
.exec(result), FlatStructuringElement2D
.createSquareFlatStructuringElement(3));
BooleanImage frontiers2 = FrontiersFromSegmentation
.exec(convertToIntegerImage(markers));
frontiers2 = (BooleanImage) OR.exec(frontiers, frontiers2);
Image view3 = DrawFrontiersOnImage.exec(input, frontiers2);
Viewer2D.exec(view3,
"SupervisedWatersedDemo: frontiers with markers");
}
private static IntegerImage convertToIntegerImage(Image img) {
IntegerImage res = new IntegerImage(img.getXDim(), img.getYDim(), img
.getZDim(), img.getTDim(), img.getBDim());
for (int p = 0; p < img.size(); p++)
res.setPixelInt(p, img.getPixelByte(p));
return res;
}
private static ByteImage convertToByteImage(Image img) {
ByteImage res = new ByteImage(img.getXDim(), img.getYDim(), img
.getZDim(), img.getTDim(), img.getBDim());
for (int p = 0; p < img.size(); p++)
res.setPixelByte(p, img.getPixelInt(p));
return res;
}
public BufferedImage imageToBufferedImage(Image img) {
byte[] pixels = new byte[img.size()];
BufferedImage bimg = null;
for (int i = 0; i < img.size(); i++)
pixels[i] = (byte) img.getPixelByte(i);
DataBufferByte dbb = new DataBufferByte(pixels, img.size());
SampleModel s = RasterFactory.createBandedSampleModel(
DataBuffer.TYPE_BYTE, img.getXDim(), img.getYDim(), 1);
Raster r = RasterFactory.createWritableRaster(s, dbb, new Point(0, 0));
bimg = new BufferedImage(img.getXDim(), img.getYDim(),
BufferedImage.TYPE_BYTE_GRAY);
bimg.setData(r);
return bimg;
}
public Image bufferedImageToImage(BufferedImage im) {
Image output;
// raster gets the value of each pixel from im
Raster raster = im.getData();
// Save the type of im
int type = im.getType();
// Save the height of im
int height = raster.getHeight();
// Save the width of im
int width = raster.getWidth();
// Set the number of band to 1, we are looking for a greyscale image
// without alpha channel
int band = 3;
// Instanciates output with the correct width, height and number of band
output = new ByteImage(width, height, 1, 1, band);
// Transfers each byte from raster to output
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
for (int b = 0; b < band; b++)
output.setPixelXYBByte(i, j, b, (byte) raster.getSample(i,
j, b));
// Set the color paramater
output.setColor(true);
// set the type parameter
output.type = type;
return output;
}
}