FeatureDetectionGUI.java
package ac.essex.ooechs.imaging.commons.segmentation;
import ac.essex.ooechs.imaging.commons.util.panels.ImagePanel;
import ac.essex.ooechs.imaging.commons.util.panels.FileTree;
import ac.essex.ooechs.imaging.commons.util.ImageFilenameFilter;
import ac.essex.ooechs.imaging.commons.PixelLoader;
import ac.essex.ooechs.imaging.commons.ConvolutionMatrix;
import ac.essex.ooechs.imaging.commons.StatisticsSolver;
import ac.essex.ooechs.imaging.commons.fast.FastStatistics;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.io.File;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class FeatureDetectionGUI extends JFrame {
protected ImagePanel p;
protected int DEFAULT_BLOCKSIZE = 10;
protected int DEFAULT_THRESHOLD = 540;
protected JSlider blockSizeSlider;
protected JSlider thresholdSlider;
protected JButton segment;
public FeatureDetectionGUI(File file) {
super("Feature Detection GUI");
p = new ImagePanel();
FileTree f = new FileTree(file, new ImageFilenameFilter()) {
/**
* Called when a file is selected in the tree
*/
public void onSelectFile(File f) {
loadImage(f);
}
};
JToolBar bar = new JToolBar();
blockSizeSlider = new JSlider(1, 100);
blockSizeSlider.setValue(DEFAULT_BLOCKSIZE);
thresholdSlider = new JSlider(0, 2000);
thresholdSlider.setValue(DEFAULT_THRESHOLD);
blockSizeSlider.setPaintLabels(true);
blockSizeSlider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
if (!blockSizeSlider.getValueIsAdjusting()) {
segment();
}
}
});
bar.add(new JLabel("Block size:"));
bar.add(blockSizeSlider);
bar.add(new JLabel("Threshold:"));
bar.add(thresholdSlider);
thresholdSlider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
if (!thresholdSlider.getValueIsAdjusting()) {
segment();
}
}
});
Container c = getContentPane();
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(f), new JScrollPane(p));
c.add(bar, BorderLayout.NORTH);
c.add(splitPane, BorderLayout.CENTER);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(1040, 480);
setVisible(true);
}
File f;
protected void loadImage(File f) {
if (f != null) {
try {
this.f = f;
segment();
} catch (Exception err) {
err.printStackTrace();
}
}
}
protected void segment() {
if (f == null) return;
try {
p.setImage(new PixelLoader(f));
} catch (Exception err) {
err.printStackTrace();
return;
}
new Thread() {
public void run() {
int blockSize = blockSizeSlider.getValue();
int threshold = thresholdSlider.getValue();
System.out.println("************");
System.out.println("Blocksize: " + blockSize);
System.out.println("Threshold: " + threshold);
BufferedImage image = p.getImage();
Graphics g = p.getGraphics();
g.setColor(Color.BLACK);
PixelLoader pl = new PixelLoader(image);
for (int by = 0; by <= image.getHeight() - blockSize; by += blockSize)
for (int bx = 0; bx <= image.getWidth() - blockSize; bx += blockSize) {
FastStatistics s = new FastStatistics();
for (int dy = 0; dy < blockSize; dy++) {
int y = by + dy;
for (int dx = 0; dx < blockSize; dx++) {
int x = bx + dx;
//s.addData(pl.get3x3Variance(x, y));
s.addData(pl.getPerimeter2().getStatistics(pl, x, y).getStandardDeviation());
}
}
int mean = (int) s.getMean();
Color c = new Color(mean, mean, mean);
g.setColor(c);
if (s.getMean() < threshold) {
g.fillRect(bx, by, blockSize, blockSize);
}
}
}
}.start();
}
public static void main(String args[]) {
File directory = new File("/home/ooechs/Desktop/Documents/Papers/Pipelines/data");
new FeatureDetectionGUI(directory);
}
}