DataCrawlerGUI.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 javax.swing.*; 
import java.io.File; 
import java.awt.image.BufferedImage; 
import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
 
public class DataCrawlerGUI extends JFrame { 
 
    protected ImagePanel p; 
    protected JButton load, segment; 
 
    private int startX, startY; 
 
    public DataCrawlerGUI(File file) { 
        super("Data Crawler GUI"); 
 
        p = new ImagePanel(); 
 
        p.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); 
 
        p.addMouseListener(new MouseAdapter() { 
            public void mousePressed(MouseEvent e) { 
                startX = p.getX(e); 
                startY = p.getY(e); 
                crawl(); 
            } 
        }); 
 
        FileTree f = new FileTree(file, new ImageFilenameFilter()) { 
 
            /** 
             * Called when a file is selected in the tree 
             */ 
            public void onSelectFile(File f) { 
                loadImage(f); 
            } 
 
        }; 
 
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(f), new JScrollPane(p)); 
        getContentPane().add(splitPane); 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setSize(640, 480); 
        setVisible(true); 
    } 
 
    protected void loadImage(File f) { 
        if (f != null) { 
            try { 
                p.setImage(new PixelLoader(f)); 
            } catch (Exception err) { 
                err.printStackTrace(); 
            } 
        } 
    } 
 
 
 
    protected void crawl() { 
        new Thread() { 
            public void run() { 
 
                Graphics g = p.getGraphics(); 
                g.setColor(Color.RED); 
 
                // current grayscale value 
                PixelLoader image = new PixelLoader(p.getImage()); 
                int previous = image.getGreyValue(startX, startY); 
                boolean[][] mask = new boolean[image.getWidth()][image.getHeight()]; 
 
                crawlOneStep(mask, previous, image, startX, startY, g); 
 
            } 
        }.start(); 
    } 
 
    private void crawlOneStep(boolean[][] mask, int previous, PixelLoader image, int x, int y, Graphics g) { 
 
        try { 
 
            // draw the path 
            g.drawRect(x, y, 1, 1); 
 
            // so the crawler cannot go wherever its been already 
            mask[x][y] = true; 
 
 
 
            int closest = Integer.MAX_VALUE; 
            int closestX = 0; 
            int closestY = 0; 
            int closestdX = 0; 
            int closestdY = 0; 
 
            // find the closest value 
            for (int dy = -1; dy <= 1; dy++) { 
                for (int dx = -1; dx <= 1; dx++) { 
 
                    // don't check myself 
                    if (dx == 0 && dy == 0) continue; 
 
                    int nx = x + dx, ny = y + dy; 
 
                    // ignore if its already on my path 
                    if (mask[nx][ny]) continue; 
 
                    int next = image.getGreyValue(nx, ny); 
 
                    int difference = Math.abs(next - previous); 
 
                    if (difference < closest) { 
                        closest = difference; 
                        closestX = nx; 
                        closestY = ny; 
                        closestdX = dx; 
                        closestdY = dy; 
                    } 
                } 
            } 
 
            // stop if its more than 10% different. 
            if ((closest / (double) previous) < 0.2) { 
 
                // add to the mask dependent on dx and dy 
                if (closestdY == 0) { 
                    // moved left or right 
                    mask[x + closestdX][y - 1] = true; 
                    mask[x + closestdX][y + 1] = true; 
                } 
 
                if (closestdX == 0) { 
                    // moved up or down 
                    mask[x - 1][y + closestdY] = true; 
                    mask[x + 1][y + closestdY] = true; 
                } 
 
                if (closestdX != 0 && closestdY != 0) { 
                    // moved diagonally 
                    mask[x + closestdX][y] = true; 
                    mask[x][y + closestdY] = true; 
                } 
 
                crawlOneStep(mask, previous, image, closestX, closestY, g); 
                 
            } 
 
        } catch (ArrayIndexOutOfBoundsException e) { 
            // ignore 
        } 
 
    } 
 
    public static void main(String args[]) { 
        File directory = new File("/home/ooechs/Desktop/Documents/Papers/Pipelines/data"); 
        new DataCrawlerGUI(directory); 
    } 
 
}