홍수 채우기 알고리즘을 구성하여 정확한 중심의 색상과 그 주변의 색상을 기준으로 사진 중앙에 얼굴을 찾는 것이 좋습니다. 그러나 현재, 내 알고리즘은 int 배열의 범위 내에서 어떤 색상 으로든 가져와 원본 배열의 사본을 만드는 홀더 배열로 전송해야합니다. 그러나 이것은 작동하지 않으며, 그것을 실행할 때 검은 색 이미지를 초래합니다. 아무도 내가 누락 된 문제를 볼 수 있습니까?홍수 채우기 알고리즘 결과가 검은 색으로 나타남
public class TemplateMaker {
public static void main(String[] args) throws IOException {
importPhoto();
}
public static void importPhoto() throws IOException {
File imgPath = new File("/Pictures/BaseImage.JPG");
BufferedImage bufferedImage = ImageIO.read(imgPath);
establishArray(bufferedImage);
}
public static void establishArray(BufferedImage bufferedImage) throws IOException {
//byte[] pixels = hugeImage.getData();
int width = bufferedImage.getWidth();
System.out.println(width);
int height = bufferedImage.getHeight();
System.out.println(height);
int[][] result = new int[height][width];
for (int i = 0; i < height; i++)
for (int j = 0; j < width; j++) {
result[i][j] = bufferedImage.getRGB(j, i);
}
findFace(result);
}
public static void findFace(int[][] image) throws IOException {
int height = image.length;
int width = image[0].length;
Color centerStart = new Color(image[height/2][width/2], true);
System.out.println(centerStart.getRGB());
System.out.println(Color.blue.getRGB());
int[][] filled = new int[height][width];
floodFill(height/2, width/2, centerStart, image, filled, height, width);
//construct the filled array as image.
BufferedImage bufferImage2 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < height; x++) {
for (int y = 0; y < width; y++) {
bufferImage2.setRGB(y, x, filled[x][y]);
}
}
//save filled array as image file
File outputfile = new File("/Pictures/saved.jpg");
ImageIO.write(bufferImage2, "jpg", outputfile);
}
public static int[][] floodFill(int x, int y, Color targetColor, int[][] image, int[][] filled, int height, int width) {
//execute something similar once algorithm works.
// if (image[x][y] < targetColor.getRGB()/2 || image[x][y] > targetColor.getRGB()*2) return filled;
if (image[x][y] == Color.blue.getRGB()) {
return filled;
}
if (image.length < 0 || image[0].length < 0 || image.length >= height || image[0].length >= width) {
return filled;
}
filled[x][y] = image[x][y];
image[x][y] = Color.blue.getRGB();
floodFill(x - 1, y, targetColor, image, filled, height, width);
floodFill(x + 1, y, targetColor, image, filled, height, width);
floodFill(x, y - 1, targetColor, image, filled, height, width);
floodFill(x, y + 1, targetColor, image, filled, height, width);
return filled;
}
}
가장 큰 문제는 재귀 홍수 충전 알고리즘을 사용하고 있습니다. 이것은 작은 이미지에서 작동하지만 중간 크기에서 큰 이미지에는 확실히 실패합니다. 알고리즘에 대한 스캔 라인 방식을 사용하는 것이 좋습니다. 자세한 내용은 *** [this] (http://en.wikipedia.org/wiki/Flood_fill) *** 페이지를 참조하십시오. –