2016-06-03 7 views
1

내 가장자리의 Sobel 가장자리 감지 연산자가 이상합니다. 내 코드에 대한 잘못된내 Sobel 가장자리 감지 연산자 출력이 이상합니다

BufferedImage temp = img; 
    float kernelx[][] = {{-1, 0, 1},{-2, 0, 2},{-1, 0, 1}}; 
    float kernely[][] = {{-1, -2, -1},{0, 0, 0},{1, 2, 1}}; 
    float valx = 0; 
    float valy = 0; 
    float val = 0; 
     for(int i=1;i<width-2;i++) { 
      for(int j=1;j<height-2;j++) { 
       valx = (kernelx[0][0]*new Color(img.getRGB(i-1, j-1)).getRed()) + (kernelx[0][2]*new Color(img.getRGB(i+1, j-1)).getRed()) + 
        (kernelx[1][0]*new Color(img.getRGB(i-1, j)).getRed()) + (kernelx[1][2]*new Color(img.getRGB(i+1, j)).getRed()) + 
        (kernelx[2][0]*new Color(img.getRGB(i-1, j+1)).getRed()) + (kernelx[2][2]*new Color(img.getRGB(i+1, j+1)).getRed()); 

       valy = (kernely[0][0]*new Color(img.getRGB(i-1, j-1)).getRed()) + (kernely[0][1]*new Color(img.getRGB(i, j-1)).getRed()) + (kernely[0][2]*new Color(img.getRGB(i+1, j-1)).getRed()) + 
         (kernely[2][0]*new Color(img.getRGB(i-1, j+1)).getRed()) + (kernely[2][1]*new Color(img.getRGB(i, j+1)).getRed()) + (kernely[2][2]*new Color(img.getRGB(i+1, j+1)).getRed()); 

       val = (float)sqrt(valx*valx+valy*valy); 

       val = val/1443*255; 
       if(val <= 127) { 
        val = 0; 
       } else { 
        val = 255; 
       } 
       temp.setRGB(i, j, new Color((int)val,(int)val,(int)val).getRGB()); 
      } 
      File outputfile = new File("src/image/edge.png"); 
      ImageIO.write(temp, "png", outputfile); 
     } 

아무것도 : 여기에 내 코드입니까? 도와주세요. 그리고 이것은 결과 그림입니다.

원본 이미지 :

Original Image

결과 이미지 :

Resulted Image

답변

2

코드에 다른 문제가 있습니다

  • 크기가 3x3 인 커널을 사용하는 경우 [1,1]에서부터 너비 -1, 높이 -1 [, 아닌] 너비 -2, 높이 2 [.
  • 자바에서는 'new Color (img.getRGB (i-1, j-1)). getRed())'대신 image.getRaster(). getSample (x, y, channel)을 사용하십시오. 이해하는 것이 훨씬 빠르고 쉽습니다. 작성시와 동일합니다 image.getRaster().setSample(x, y, channel, value)
  • [0, max]에 인코딩 된 이미지에서 Sobel 그래디언트를 계산할 때 각 방향 (X 및 Y)은 [-4 * 최대, 4 * 최대]에 값을 제공합니다. 따라서 초과 된 값을 자르는 것은 공격적입니다. 대신 히스토그램 스트레칭을 수행하면 더 많은 정보를 얻을 수 있습니다.
  • 정규화 val = val/1443*255;은 사용자에게 달려 있지만 필수 항목은 아닙니다.
  • 그리고 마지막으로 코드에의 주된 문제가 있습니다. 그 결과 (또는 귀하의 경우 임시) 이미지와 원본 이미지가 달라야합니다. 그렇지 않으면 이미지를 처리하는 동시에 이미지를 수정합니다. 왜이 모든 거대한 흰색 영역을 가지고 있는지 설명합니다.
+0

아, 답해 주셔서 감사합니다. 제 코드를 수정하고 알려 드리겠습니다. 결과를 알려 드리겠습니다. – Dennis

+0

지금까지 세 번째 점은 잊어 버리십시오. 나중에 할 수 있습니다. – FiReTiTi

+0

OMG .. 그것은 작동합니다 .. 대단히 감사합니다 :) – Dennis