2016-09-18 11 views
1

이미지의 흰색 배경을 제거하고 다른 이미지로 저장하고 싶습니다. 배경을 추출하는 코드를 작성했지만 일부 픽셀 값을 남겨 둡니다. 체크 아웃 원래 이미지 : enter image description here이미지의 흰색 배경을 제거하는 방법 - java

그것은 여전히 ​​흰색 배경의 일부 금액을 잎 : enter image description here

체크 아웃 이미지를 잘립니다.

도 제거하고 싶습니다.

 int x1=0; 
    int y1=0; 
    boolean res = false; 
    System.out.println("in formatImage"); 

// Widht 제거 ...

for (int y = 0; y <= h-1; y++) { 
    System.out.println("Y = "+y); 
    for (int x = 0; x <= x1-1; x++) { 
     System.out.println("("+x+","+y+") : "+b21.getRGB(x, y)); 
     if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) { 
      res = true; 
     } 
     if (res) { 
      for (int p = 0; p <= x1-1; p++) { 
       b31.setRGB(p,y1,new Color(b21.getRGB(p, y)).getRGB()); 

      } 
      y1++; 
      res = false; 
      break; 
     } 
    } 
} 
b31=new BufferedImage(x1,y1,BufferedImage.TYPE_INT_RGB); 
int ty=y1; 
y1=0; 
for (int y = 0; y <= h-1; y++) { 
    for (int x = 0; x <= x1-1; x++) { 
     if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) { 
      res = true; 
     } 
     if (res) { 
      for (int p = 0; p <= x1-1; p++) { 
       b31.setRGB(p,y1,new Color(b21.getRGB(p, y)).getRGB()); 
      } 
      y1++; 
      res = false; 
      break; 
     } 
    } 
} 

B31 최종 이미지가

for (int x = 0; x <= w-1; x++) { 
      for (int y = 0; y <= h-1; y++) { 
       if(new Color(bi1.getRGB(x, y)).getRGB()==-1) 
       {res=false;} 
       else if (!new Color(bi1.getRGB(x, y)).equals(Color.WHITE)) { 
        res = true; 
       } 
       if (res) { 
        for (int p = y; p <= h-1; p++) { 
         b21.setRGB(x1,p,new Color(bi1.getRGB(x, p)).getRGB());       
        } 
        x1++; 
        res = false; 
        break; 
       } 
      } 
     } 
     b21=new BufferedImage(x1,h,BufferedImage.TYPE_INT_RGB); 
     x1=0; 
     for (int x = 0; x <= w-1; x++) { 
      for (int y = 0; y <= h-1; y++) { 
       if(new Color(bi1.getRGB(x, y)).getRGB()==-1) 
       {res=false;} 
       else if (!new Color(bi1.getRGB(x, y)).equals(Color.WHITE)) { 
        res = true; 
       } 
       if (res) { 
        for (int p = 0; p <= h-1; p++) { 
         b21.setRGB(x1,p,new Color(bi1.getRGB(x, p)).getRGB()); 
        } 
        x1++; 
        res = false; 
        break; 
       } 
      } 
     } 

// 신장 제거 :

여기 내 코드입니다.

+0

"흰색 배경 제거"란 무엇을 의미합니까? *** 이미지를 자르는 방법 ***을 정말로 묻고 있습니까? 그게 당신 코드가하는 것처럼 보입니다. 작동하지 않는 것은 무엇입니까? 흰색 배경의 어떤 부분이 제거되지 않습니까? 귀하의 질문은 명확하지 않습니다. –

+0

근처의 배경이 제거되지 않습니다. 이미지를 다운로드하여 동일하게 확인할 수 있습니다. –

답변

1

짐 (짐)이 말한 것처럼 신체와 가까운 색은 순수한 흰색이 아닙니다. 코드의 다음 문장을 수정하십시오 & 그것은 당신을 위해 잘 작동합니다.

if (new Color(b21.getRGB(x, y)).getRGB()<-1000000) 

에 의해 명령 행

if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) 

다음 교체 이것은 당신에게 당신이 원하는 출력을 제공 할 것입니다. 흰색의 색조를 다양하게 조절할 수 있습니다. & 회색은 -1000000에서 -2000000까지

2

괜찮은 이미지 편집기로 이미지를 검사하면 모델의 머리, 왼손 및 오른쪽 팔꿈치 근처의 픽셀이 순수한 흰색 (0xFFFFFF)이 아님을 알 수 있습니다.

enter image description here

당신은 3 개 채널 전체 강도에서 약간의 편차를 허용하도록 알고리즘을 조정해야합니다. 허용 할 여지가 어느 정도인지를 결정하는 것은 당신에게 달려 있습니다.

관련 문제