2016-04-08 8 views
4

マスキング後の画像品質が悪化するのはなぜですか?SobelオペレーターMaskX

public void doMaskX() { 
    int[][] maskX = { { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } }; 

    int rgb, alpha = 0; 
    int[][] square = new int[3][3]; 

    for (int y = 0; y < width - 3; y++) { 
     for (int x = 0; x < height - 3; x++) { 
      int sum = 0; 
      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 3; j++) { 
        rgb = imgx.getRGB(y + i, x + j); 

        alpha = (rgb >> 24) & 0xff; 
        int red = (rgb >> 16) & 0xff; 
        int green = (rgb >> 8) & 0xff; 
        int blue = rgb & 0xff; 

        square[i][j] = (red + green + blue)/3; 
        sum += square[i][j] * maskX[i][j]; 
       } 
      } 
      rgb = (alpha << 24) | (sum << 16) | (sum << 8) | sum; 
      imgx.setRGB(y, x, rgb); 

     } 
    } 
    writeImg(); 
} 

this is an image before masking

And this is the image after masking

品質が第2の画像の方が良いとなぜ黄色が表示されている必要がありますか?

+0

しかし、あなたはそれを定義します。黄色のピクセルは恐らくオーバーフローによって引き起こされます。 'sum'は常に<256ですか? –

+0

ところで、これはやや奇妙な方法です。また、[車輪を改革しない]ことも考えられます(https://docs.oracle.com/javase/8/docs/technotes/guides/2d/spec/j2d-image.html#wp63208) – Marco13

答えて

1

ここではグラデーションの強度を計算していることを理解しておくことが重要です。これは表示しているものです。したがって、強度(または大きさ)は正の数です。その後、あなたは組み合わせることができますが、また、Y誘導体を取る場合

sum=Math.abs(sum); 

:あなたは絶対値を取らなければならない

sum=Math.sqrt(sumx*sumx+sumy*sumy); 
私の知る限りでは、Sobelオペレータを強化するためのエッジ検出用とではありません
+0

sum = Math.abs (和);問題を解決しました あなたは非常にマッチします。 Math.sqrt ...は、imgXとimgYのマージにも使用されます – szufi

関連する問題