2013-06-20 3 views
1

홍수 채우기 알고리즘을 사용하여 이미지를 정렬했습니다. 동일한 색상을 발견하면 해당 픽셀을 채워진 동일한 크기의 배열로 복사해야합니다. 채워진 배열은 이미지로 다시 변환되어 jpg로 저장됩니다. 그러나 jpg를 열면 완전히 검은 색으로 보입니다.홍수 채우기 알고리즘을 사용하여 배열 만들기

public static void findFace(int[][] image) throws IOException { 
    int height = image.length; 
    int width = image[0].length; 

    Color centerStart = new Color(image[width/2][height/2]); 
    int[][] filled = new int[width][height]; 

    floodFill(width/2, height/2, centerStart, image, filled); 

    //construct the filled array as image. Show if the face was found. 
    BufferedImage bufferImage2 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

    for (int y = 0; y < height; y++) { 
     for (int x = 0; x < width; x++) { 
      int Pixel = filled[x][y] << 16 | filled[x][y] << 8 | filled[x][y]; 
      bufferImage2.setRGB(x, y, Pixel); 
     } 
    } 

    //save filled array as image file 
    File outputfile = new File("/home/lily/Pictures/APicaDay/saved.jpg"); 
    ImageIO.write(bufferImage2, "jpg", outputfile); 
} 

public static int[][] floodFill(int x, int y, Color targetColor, int[][] image, int[][] filled) { 
    if (image[x][y] != targetColor.getRGB()) { 
     return filled; 
    } 

    filled[x][y] = image[x][y]; 

    floodFill(x - 1, y, targetColor, image, filled); 
    floodFill(x + 1, y, targetColor, image, filled); 
    floodFill(x, y - 1, targetColor, image, filled); 
    floodFill(x, y + 1, targetColor, image, filled); 

    return filled; 
} 

보너스 질문 : 사진 다루고있어 이후가 아니라 동일한도 비슷 색상을 받아들이는 홍수 채우기를하고 싶습니다.

+0

'Pixel'을 만드는 비트 쉬프트는 약간 이상합니다. 3 바이트 RGB 또는 int RGB 샘플이 있다면 마음을 편히 들여 놓은 것처럼 보입니다. 'int [] [image]가 실제로 무엇인지를 아는 것도 어렵습니다. 완전히 실행 가능하지만 코드의 버전을 삭제 해보십시오. – haraldK

+0

또한 동일한 픽셀을 여러 번 다루지 않습니까? 재귀는 약간 통제를 벗어난 것처럼 보입니다. 경계 검사가 필요합니다. – haraldK

답변

1

당신은 두 가지 중요한 요소가없는 게시하신 floodFill 기능 : 첫 번째 픽셀과 동일한 색상을 포함하는 영역이 이미지의 경계에있는 모든 방법을 확장하는 경우

  1. , 함수가 시도됩니다 잘못된 색인에 image에 액세스하십시오. 검사 할 픽셀의 x 및 y 좌표를 먼저 확인하고 범위를 벗어난 경우 즉시 반환하여이 문제를 해결할 수 있습니다.
  2. 동일한 색상의 인접 픽셀이 두 개 이상있는 경우 첫 번째 호출에서 두 번째 픽셀에 floodFill이 호출되어 첫 번째 픽셀에서 floodFill을 호출하는 등의 방법으로 무한 반복 되감기가 발생합니다. . 특정 픽셀에 대해서만 floodFill 번만 호출해야합니다.

두 가지 증상 중 하나가 관찰되지 않고 결과 이미지에서 아무 것도 관찰하지 않으므로 초기 픽셀의 색상 검사가 올바르지 않다고 생각합니다. Color 생성자에 정수를 전달할 때 해당 정수의 RBG 해석을 사용하고 있습니까?

+0

재귀에 대한 조정을 제안했는데 여전히 검정 jpg가됩니다. Color 생성자를 올바르게 사용하는 방법에 대해 더 많은 연구를 할 것입니다. 당신 말이 맞아요, 그게 문제의 근원 일거야. 도와 주셔서 감사합니다. – user2506643

관련 문제