2014-12-31 1 views
0

이미지와 포인트를 제공하는 객체를 만들려고하는데 이미지의 내부 가장자리를 추적합니다.BufferedImage에 대한 에지 감지 코드

간결함을 위해 가장자리는 항상 RGB 색상 검정을 사용합니다.

은 내가 RIGHT DOWN LEFT UP (시계 방향으로)

의 열거가 나는 점 P에서 시작 정의합니다.

이미지의 픽셀을 통해 오른쪽 방향으로 현재 방향을 기준으로 이동합니다.

경계 픽셀이 아닌 경우 픽셀 내 방향을 반 시계 방향으로 되돌립니다. 예 : (왼쪽 -> 아래쪽) 내가 선택한 방향을 이동할 수 없으면 다음 방향으로 이동합니다. 포인트를 테두리 배열에 추가합니다.

첫 번째 경계 픽셀로 돌아갈 때까지이 작업을 수행합니다. 내가 오른쪽으로 UP에서 이동하지만 다시 마우스 오른쪽 버튼을 다시 직후 가장자리에 초점을 맞춘 방향을 유지하기 위해이 아니라 다시 설정해야 할 때 계획 그게

...

지금까지 내가 난관에 충돌 이미지로.

필자는 UP을 사용하는 경우 부울 플래그를 사용하여 시도하고 오른쪽 방향을 다음 방향으로 지시하면 UP 및 NOT DOWN이됩니다.

모든 안내를 주시면 감사하겠습니다. 아래에 전체 코드가 있습니다.

코드 : 관심있는 사람들을위한

package edgedection; 

import static edgedection.EdgeDection.testImage; 
import java.awt.Color; 
import java.awt.Point; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

    /** 
    * 
    * @author Fionán 
    */ 
    public class EdgeDection { 

     /** 
     * @param args the command line arguments 
     */ 
     static BufferedImage testImage = null; 

     { 
      try { 
       testImage = ImageIO.read(this.getClass().getResourceAsStream("testImage2.png")); 

      } catch (IOException ex) { 
       Logger.getLogger(EdgeDection.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

     static enum DIRECTION { 

      RIGHT, DOWN, LEFT, UP, NOMOVE 
     } 

     BufferedImage bi; 
     int borderColor = Color.black.getRGB(); 

     DIRECTION facing; 
     Point p; 
     ArrayList<Point> borders; 
     boolean upFlag = false; 
     int x = p.x; 
     int y = p.y; 

     public static void main(String[] args) { 

      int x = 150; 
      int y = 60; 
    //forcing instance for loading Images only. 
      EdgeDection test= new EdgeDection(); 

      JFrame show = new JFrame(); 
      show.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      JLabel picLabel = new JLabel(new ImageIcon(testImage)); 
      show.add(picLabel); 
      show.pack(); 

      show.setVisible(true); 

      EdgeDection dector = new EdgeDection(testImage, new Point(x, y)); 
      dector.start(); 

      dector.highLightEdge(); 

      show.repaint(); 

     } 

     boolean canMove(DIRECTION d, Point p) { 

      switch (d) { 
       case RIGHT: 
        return bi.getRGB(p.x + 1, p.y) != borderColor; 
       case DOWN: 
        return bi.getRGB(p.x, p.y + 1) != borderColor; 
       case LEFT: 
        return bi.getRGB(p.x - 1, p.y) != borderColor; 
       //Deafult is up 
       case UP: 
        return bi.getRGB(p.x, p.y - 1) != borderColor; 
       default: 
        return false; 

      } 

     } 

     public EdgeDection(BufferedImage bi, Point p) { 
      this.facing = DIRECTION.RIGHT; 
      this.bi = bi; 
      this.p = p; 
      this.borders = new ArrayList<>(); 

     } 

     public EdgeDection() { 
     } 

     DIRECTION getDirection() { 
      return null; 
     } 

     void addBorder(Point p) { 
      if(borders.isEmpty()){ 

      x = p.x; 
      y = p.y; 
      } 
      borders.add(p); 
     } 

     void start() { 

      do { 

       System.out.println("Checking " + p.x + " " + p.y + facing); 
       if (canMove(facing, p)) { 


        if (upFlag) { 
         facing = DIRECTION.UP; 
         // p =new Point(p.x+1,p.y); 
        } 
        p = NextPointByDirection(); 


        if(!upFlag) stepBackDirection(); 

        if(upFlag)upFlag=false; 


       } else { 
        addBorder(p); 
        setNextDirection(); 

        System.out.println("going " + facing + " border array size = "+ borders.size()); 
        System.out.println("Up Flag status "+upFlag); 
       } 

      } while (facing != DIRECTION.NOMOVE && (p.x != x || p.y != y)); 



     } 

     private void stepBackDirection() { 

      switch (facing) { 

       case RIGHT: 
        if(upFlag) {facing = DIRECTION.UP;}else{ 
        facing = DIRECTION.RIGHT; 
        } 
        break; 
       case DOWN: 
        facing = DIRECTION.RIGHT; 
        break; 
       case LEFT: 
        facing = DIRECTION.DOWN; 

        break; 
       case UP: 
        facing = DIRECTION.LEFT; 

      } 
     } 

     private void setNextDirection() { 

      switch (facing) { 
       case RIGHT: 

        facing = DIRECTION.DOWN; 

        if (upFlag) { 
         facing = DIRECTION.UP; 
         upFlag = false; 
        } 
        return; 
       case DOWN: 
        facing = DIRECTION.LEFT; 
        return; 
       case LEFT: 
        facing = DIRECTION.UP; 
        return; 
       case UP: 
        upFlag = true; 
        facing = DIRECTION.RIGHT; 

    //    upFlag = true; 
    //    if (canMove(facing, new Point(p.x + 1, p.y - 1))){ 
    //    p = new Point(p.x + 1, p.y - 1); 
    //     
    //    } ; 
    // 
    //    if (upFlag) { 
    //     facing = DIRECTION.RIGHT; 
    //    } 

      } 
     } 

     private Point NextPointByDirection() { 
    //  if (upFlag) { 
    //   facing = DIRECTION.UP; 
    //   upFlag = !upFlag; 
    //  } 
      switch (facing) { 
       case RIGHT: 
        return new Point(p.x + 1, p.y); 
       case DOWN: 
        return new Point(p.x, p.y + 1); 
       case LEFT: 
        return new Point(p.x - 1, p.y); 

       default: 
        return new Point(p.x, p.y - 1); 

      } 
     } 

     private void print() { 

      for (Point p : borders) { 

       System.out.print(p.x + " " + p.y + " "); 

      } 
     } 

     void highLightEdge() { 

      for (Point p : borders) { 

       bi.setRGB(p.x, p.y, Color.RED.getRGB()); 

      } 
     } 

    } 

답변

1

, 내가 스택의 사용으로이 문제를 해결했다.

은 수행 할 순서에 따라 스택을 미리 채 웁니다. 방향을 시작합니다. 이 방향으로 이동할 수있는 경우 는 국경 방향으로 90도 기준을 설정 다른 세트 휴식 루프에 이미있는 경우 국경 의 세트에 테두리를 추가 테두리가 스택 에 그 방향으로 밀어 히트 스택 다른 에서 튀어한다