Advertisement
Guest User

Sobel Edge Detection

a guest
Jul 19th, 2010
1,200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.76 KB | None | 0 0
  1. import java.awt.*;
  2. import java.awt.image.*;
  3. import javax.swing.*;
  4. class Test {
  5.  
  6.     private static int[][] sobelx = {{-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1}};
  7.     private static int[][] sobely = {{1, 2, 1}, {0, 0, 0}, {-1, -2, -1}};
  8.  
  9.     public static int lum(int r, int g, int b) {
  10.     return (r + r + r + b + g + g + g + g) >> 3;
  11.     }
  12.  
  13.     public static int rgb_to_luminance(int rgb) {
  14.     int r = (rgb & 0xff0000) >> 16;
  15.     int g = (rgb & 0xff00) >> 8;
  16.     int b = (rgb & 0xff);
  17.     //System.out.println(r + ", " + g + ", " + b);
  18.     return lum(r, g, b);
  19.     }
  20.  
  21.     public static int level_to_greyscale(int level) {
  22.     return (level << 16) | (level << 8) | level;
  23.     }
  24.  
  25.     public static BufferedImage cloneImage(BufferedImage image) {
  26.     return new BufferedImage(image.getColorModel(), image.copyData(null), image.isAlphaPremultiplied(), null);
  27.     }
  28.  
  29.     public static BufferedImage sobelEdgeDetection(BufferedImage image) {
  30.     BufferedImage ret = cloneImage(image);
  31.     int width = image.getWidth();
  32.     int height = image.getHeight();
  33.     for (int x = 0; x < width; x++) {
  34.         for (int y = 0; y < height; y++) {
  35.         int level = 255;
  36.         if ((x > 0) && (x < (width - 1)) && (y > 0) && (y < (height - 1))) {
  37.             int sumX = 0;
  38.             int sumY = 0;
  39.             for (int i = -1; i < 2; i++) {
  40.             for (int j = -1; j < 2; j++) {
  41.                 sumX += rgb_to_luminance(image.getRGB(x+i, y+j)) * sobelx[i+1][j+1];
  42.                 sumY += rgb_to_luminance(image.getRGB(x+i, y+j)) * sobely[i+1][j+1];
  43.                 System.out.println(sumX + " " + sumY);
  44.             }
  45.             }
  46.             level = Math.abs(sumX) + Math.abs(sumY);
  47.             if (level < 0) {
  48.             level = 0;
  49.             } else if (level > 255) {
  50.             level = 255;
  51.             }
  52.             level = 255 - level;
  53.         }
  54.         ret.setRGB(x, y, level_to_greyscale(level));
  55.         }
  56.     }
  57.     return ret;
  58.     }
  59.    
  60.     public static class MyPanel extends JPanel {
  61.     private BufferedImage _image;
  62.     public MyPanel (BufferedImage image) {
  63.         super();
  64.         _image = image;
  65.         setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
  66.     }
  67.     protected void paintComponent(Graphics g) {
  68.         g.drawImage(_image, 0, 0, null);
  69.     }
  70.     }
  71.  
  72.     public static void main(String[] args) throws Exception {
  73.     DisplayMode dm = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode();
  74.     BufferedImage image = new Robot().createScreenCapture(new Rectangle(dm.getWidth(), dm.getHeight()));;
  75.     BufferedImage edImage = sobelEdgeDetection(image);
  76.  
  77.     JFrame frame = new JFrame();
  78.     long startTime = System.currentTimeMillis();
  79.     JPanel panel = new MyPanel(edImage);
  80.     long endTime = System.currentTimeMillis();
  81.     System.out.println("xform took: " + (endTime - startTime) + "ms");
  82.     frame.add(panel);
  83.     frame.pack();
  84.     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  85.     frame.show();
  86.    
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement