我在Rosetta代码的Java implementation of Hough Transform中找到了一些移位代码,除了这部分之外,我大致了解该代码的作用:
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.3
,0.59
和0.11
将24位RGB值转换为灰度值的技巧(请注意,这些值加起来为1
)。
此操作(rgbValue & 0xFF0000) >>> 16
剪切掉第17..24位,并将它们右移到位置0..7,产生一个介于0和255之间(含0和255)的值。类似地,(rgbValue & 0xFF00) >>> 8
剪切出第8..16位,并将其移至位置0..7。
This Q&A讨论系数,并讨论其他替代方法。