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