2016-04-08 16 views
4

Warum wird meine Bildqualität nach dem Maskieren x schlechter?Sobel Operator 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

die Qualität des zweiten Bildes besser sein sollte und warum ist gelbe Farbe erscheint?

+0

Soweit ich weiß, der Sobel-Operator zur Kantendetektion und nicht zur Verbesserung des Bildqualität, wie auch immer Sie das definieren. Die gelben Pixel werden wahrscheinlich durch Überläufe verursacht. Sind Sie sicher, dass "Summe" immer <256 ist? –

+0

Übrigens: Dies ist eine etwas merkwürdige Art, es zu implementieren. Sie könnten auch in Erwägung ziehen, [das Rad nicht neu zu erfinden] (https://docs.oracle.com/javase/8/docs/technotes/guides/2d/spec/j2d-image.html#wp63208) – Marco13

Antwort

1

Es ist wichtig zu wissen, dass Sie hier die Intensität des Gradienten berechnen und das ist, was Sie anzeigen. Daher ist die Intensität (oder Größe) eine positive Zahl. Sie haben den absoluten Wert nehmen:

sum=Math.abs(sum); 

Wenn Sie den y-Derivat nehmen auch dann können Sie kombinieren:

sum=Math.sqrt(sumx*sumx+sumy*sumy); 
+0

sum = Math.abs (Summe); löste das Problem THANK Sie sehr übereinstimmen. Math.sqrt ... wird auch beim Zusammenführen von imgX und imgY verwendet – szufi