1

ソーベル エッジ検出演算子の出力が奇妙です。これが私のコードです:

    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);
        }

私のコードに何か問題がありますか? 私を助けてください。そして、これが結果の写真です。

元の画像:

元の画像

結果画像:

結果の画像

4

1 に答える 1

2

コードにはさまざまな問題があります。

  • 次元が 3x3 のカーネルを使用する場合、[1,1] から ]width-2, height-2[ ではなく、]width-1,height-1[ になります。
  • Java では、'new Color(img.getRGB(i-1, j-1)).getRed())' の代わりに、image.getRaster().getSample(x, y, channel) を使用します。はるかに速く、理解しやすくなります。書くときも同じimage.getRaster().setSample(x, y, channel, value)
  • [0,max] でエンコードされた画像でソーベル勾配を計算すると、各方向 (X と Y) から [-4*max, 4*max] の値が得られます。そのため、超過した値をカットするのは積極的です。代わりにヒストグラム ストレッチングを実行すると、より多くの情報を保持できます。
  • 正規化val = val/1443*255;はあなた次第ですが、必須ではありません。
  • 最後に、コードの主な問題です。結果の(またはあなたの場合は一時的な)画像と元の画像は異なる必要があります。それ以外の場合は、画像を処理すると同時に画像を変更します。これが、この巨大な白い領域がすべてある理由を説明しています。
于 2016-06-03T17:02:32.270 に答える