2017-12-28 14 views
1

java에서 canny 필터 프로그램을 사용하여 이미지의 가장자리를 감지했습니다. 필터 적용 후 ...캐니 필터링 된 이미지에서 흰색으로 픽셀을 채우는 방법은 무엇입니까?

This is my image 확대하면 ... Zoomed

화상의 화소의 색상 차이가있다. 내 모든 가장자리 픽셀을 순수한 흰색 (#FFFFFF) 및 나머지 부분을 검정색으로 지정하고 싶습니다. 아무도 내가 다른 색조를 찾아 순수한 흰색으로 채울 수있는 방법을 제안 할 수 있습니다.

참고 : 위의 그림과는 다른 픽셀의 색조가 다를 수 있습니다 (# F7F7F7). 위의 확대 된 이미지는 예제 일뿐입니다.

편집 : 내가 코드에서 실수가있는 경우

public void convert(){ 
    try{ 
     BufferedImage img = ImageIO.read(new File("input.jpg")); 
     int rgb; 
     int height = img.getHeight(); 
     int width = img.getWidth(); 
     File f = new File("newThreshold.jpg"); 
     Color white = new Color(255,255,255); 
     int wh = white.getRGB(); 

     for (int h = 0; h<height; h++){ 
      for (int w = 0; w<width; w++){ 

       rgb = img.getRGB(w, h); 
       red = (rgb & 0x00ff0000) >> 16; 
       green = (rgb & 0x0000ff00) >> 8; 
       blue = rgb & 0x000000ff; 
       if(red >= 200 || blue >= 200 || green >= 200){ 
        img.setRGB(w,h,wh); 
       } 
      } 
     } 

     ImageIO.write(img,"jpg",f); 
    } 
    catch(Exception e){ 
    } 
} 

사람이 말해 줄 수 ... 이미지에 적용하려면이 코드를 작성했다. 코드를 실행 한 후에도 내 이미지에는 변화가 없습니다. 빨강, 초록 및 파랑 값이 200을 초과해도 이미지가 변경되지 않습니다.

+1

당신이 그냥 때문에 JPEG 압축이 아닌 확실한가요? '.png' 파일로 저장해보십시오. – Obicere

+1

이것은 거의 압축 때문입니다. [JPG 압축 가능 패턴은 무엇입니까?] (https://dsp.stackexchange.com/questions/2010/what-is-the-least-jpg-compressible-pattern-camera-shooting-piece-of-cloth- sca). JPEG는 작은 세부 사항을 좋아하지 않는 것 같습니다. – Obicere

+0

그래, 나는 그것을 png로 저장했다. 고마워요 – DHS

답변

0

이미지의 각 픽셀을 통과하여 값이 순수한 흰색으로 설정된 경우 특정 임계 값 이상인지 확인할 수 있습니다. 필요한 경우 더 어두운 영역에 대해서도 동일한 작업을 수행 할 수 있습니다.

예 :

public Image thresholdWhite(Image in, int threshold) 
{ 
    Pixel[][] pixels = in.getPixels(); 
    for(int i = 0; i < pixels.length; ++i) 
    { 
     for(int j = 0; j < pixels[i].length; ++j) 
     { 
      byte red = pixels[i][j].getRed(); 
      byte green = pixels[i][j].getGreen(); 
      byte blue = pixels[i][j].getBlue(); 
      /* In case it isn't a grayscale image, if it is grayscale this if can be removed (the block is still needed though) */ 
      if(Math.abs(red - green) >= 16 && Math.abs(red - blue) >= 16 && Math.abs(blue- green) >= 16) 
      { 
       if(red >= threshold || blue >= threshold || green >= threshold) 
       { 
        pixels[i][j] = new Pixel(Colors.WHITE); 
       } 
      } 
     } 
    } 
    return new Image(pixels); 
} 
+0

임계 값을 찾는 방법에 대해 말해 줄 수 있습니까? 이미지의 각 픽셀의 RGB 값을 찾은 후에 무엇을해야합니까? – DHS

+0

@DHS 임계 값은 모든 흰색 타일을 캡처하는 값입니다. 240과 같은 값으로 시작합니다. RGB 값을 찾으면 색이 순수 흰색 또는 '0xFFFFFF'로 변경됩니다. –