2009-11-29 3 views
0

이미지를 입력으로 받아들이고 이미지를 찍은 배경을 제거하는 응용 프로그램이 있습니다. 예를 들어 담요 위에 책 이미지를 전달하면 결과 이미지는 배경이 투명한 책일뿐입니다.닫힌 원에 대처하기 위해 홍수 채우기 알고리즘을 얻으려면 어떻게해야합니까?

큰 빈 공간이있는 이미지를 입력하면 문제가 발생합니다. 신축성있는 밴드. floodfill 알고리즘은 이미지의 모서리에서 시작하여 그림의 배경을 제거하지만 물론 탄성 밴드의 내부로 들어 가지 않습니다.

백그라운드에 대해 닫힌 원의 이미지를 가져 와서 루프 내부 또는 외부에 배경이없는 루프 만 다시 가져올 수 있도록 구현하는 방법이 있습니까?

+1

아래 투표를 이해하지 못합니다. upvoted to compens – ldog

답변

0

This question과 그 대답은 매우 유사한 문제를 해결합니다.

2

홍수 채우기가 끝날 때마다 이미지를 다시 샘플링하고 원래 배경과 일치하는 색상을 찾을 때마다 이미지를 다시 시작할 수 있습니다.

홍수 채우기 알고리즘은 한 지점에서 시작하도록 설계되었으며 거기에서 비슷한 색의 영역 인 구속 영역을 채 웁니다. 원이 배경색과 일치하지 않으므로 채우기 알고리즘이 다른 곳을 찾기 위해 "점프"하지 않습니다.

해결 방법은 다른 영역에 범람시키는 것입니다.

public void floodfill(Image img, int x, int y, Color oldColor, Color newColor) { 
    // Check boundary 
    if (img.contains(x, y)) { 
     // Get current pixel color 
     Color currentColor = img.getColor(x, y); 
     // Check color match 
     if (currentColor.equals(oldColor)) { 
      // Set to new color 
      img.setColor(x, y, newColor); 

      // Start again on each of the neighbors 
      floodFill(img, x - 1, y, oldColor, newColor); 
      floodFill(img, x + 1, y, oldColor, newColor); 
      floodFill(img, x, y - 1, oldColor, newColor); 
      floodFill(img, x, y + 1, oldColor, newColor); 
     } 
    } 
} 
+0

이전에 본 (x, y) 튜플을 건너 뛰기 위해이 함수를 메모하면이 작업이 훨씬 빨라집니다. – PaulMcG

0

당신이 배경의 주된 색은 당신이 할 수 있어야 어떤 (무엇인지 알아낼 수 있습니다 : 여기

은 (메모리에서, 검증되지 않은) 매우 원유, 재귀, 느린 홍수 채우기 알고리즘입니다 모서리에서 시작하는 배경을 제거 할 수 있기 때문에) 이미지의 다른 모든 색상을 찾습니다.

관련 문제