2016-11-11 119 views
1

我發現在Java implementation of Hough Transform上羅塞塔代碼的一些位位移代碼,我一般的代碼做什麼瞭解,除了這部分:這個java bitshift是做什麼的?

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

我認爲這需要所有3個像素的平均值,也就是至少是它看起來像當我輸出結果。但這是如何工作的?這些神奇的數字是什麼?

方法,其中該功能是用來,粘貼了方便:

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

唯一需要注意的是,此公式中的整數截斷向下舍入,這會產生輕微的偏差,並使圖片比必要的稍暗。 (rgbValue&0xFF0000)>>> 16)* 0.30 +((rgbValue&0xFF00)>>> 8)* 0.59 +(rgbValue&0xFF)* 0.11)可能更適合做'rgbValue =(int)Math.round ;' –

回答

2

這是一個24位的RGB值轉換爲使用係數0.30.59的灰度值的招,和0.11(注意這些值合計爲1)。

該操作(rgbValue & 0xFF0000) >>> 16刪除位17..24,並將它們右移到位置0..7,產生一個介於0和255之間的值。同樣,(rgbValue & 0xFF00) >>> 8刪除位8..16,並將它們移到位置0..7。

This Q&A有關係數的討論,並討論了其他選擇。