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); 
    } 
 
}