2016-11-11 3 views
1

Ich fand einige bitshift Code in der Java implementation of Hough Transform auf Rosetta Code, ich in der Regel zu verstehen, was der Code tut, außer diesem Teil:Was macht diese Java-Bitshift?

rgbValue = (int)(((rgbValue & 0xFF0000) >>> 16) * 0.30 + ((rgbValue & 0xFF00) >>> 8) * 0.59 + (rgbValue & 0xFF) * 0.11); 

ich denke, es den Durchschnitt aller 3 Pixel nimmt, dass zumindest ist das, was Es sieht aus wie wenn ich das Ergebnis ausspreche. Aber wie funktioniert das? Was sind das für magische Zahlen?

Verfahren, bei dem diese Funktion verwendet wird, eingefügt Einfachheit halber:

public static ArrayData getArrayDataFromImage(String filename) throws IOException 
{ 
    BufferedImage inputImage = ImageIO.read(new File(filename)); 
    int width = inputImage.getWidth(); 
    int height = inputImage.getHeight(); 
    int[] rgbData = inputImage.getRGB(0, 0, width, height, null, 0, width); 
    ArrayData arrayData = new ArrayData(width, height); 
    // Flip y axis when reading image 
    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
     int rgbValue = rgbData[y * width + x]; 

     // What does this do? 
     rgbValue = (int)(((rgbValue & 0xFF0000) >>> 16) * 0.30 + ((rgbValue & 0xFF00) >>> 8) * 0.59 + (rgbValue & 0xFF) * 0.11); 
     arrayData.set(x, height - 1 - y, rgbValue); 
     } 
    } 
    return arrayData; 
} 
+0

Die einzige Einschränkung ist, dass die ganzzahlige Kürzung in dieser Formel abgerundet wird, was zu einer leichten Verzerrung führt und das Bild etwas dunkler als nötig macht. Wahrscheinlich besser zu tun 'rgbValue = (int) Math.round (((rgbValue & 0xFF0000) >>> 16) * 0.30 + ((rgbValue & 0xFF00) >>> 8) * 0.59 + (rgbValue & 0xFF) * 0.11) ; ' –

Antwort

2

Dies ist der Trick, der einen 24-Bit-RGB-Wert in einen Grauwert umwandelt Koeffizienten 0.3, 0.59 und 0.11 (beachten Sie, dass diese Werte 1 ergeben).

Diese Operation (rgbValue & 0xFF0000) >>> 16 schneidet die Bits 17..24 aus und verschiebt sie nach rechts auf die Position 0..7, wodurch ein Wert zwischen 0 und 255 einschließlich erzeugt wird. In ähnlicher Weise schneidet (rgbValue & 0xFF00) >>> 8 die Bits 8..16 aus und verschiebt sie auf die Position 0..7.

This Q&A spricht über die Koeffizienten und diskutiert andere Alternativen.