如何将图像转换为0
我想将图像转换为像素亮度在0-255之间的灰度图像。
我能够使用以下Java方法将图像转换为灰度图像。
public void ConvertToGrayScale(BufferedImage bufImage, int ImgWidth, int ImgHeight) {
for (int w = 0; w < ImgWidth; w++) {
for (int h = 0; h < ImgHeight; h++) {
Color color = new Color(bufImage.getRGB(w, h));
int ColAvgVal = ((color.getRed() + color.getGreen() + color.getBlue()) / 3);
Color avg = new Color(ColAvgVal, ColAvgVal, ColAvgVal);
bufImage.setRGB(w, h, avg.getRGB());
System.out.println(avg.getRGB());
}
}
}
“的System.out.println(avg.getRGB());” 用于查看像素强度,但所有灰度级均为负值,不在0-255之间 。
我做错了吗? 如何将图像转换为像素亮度在0-255之间的灰度图像。
谢谢
color.getRGB()
不会从0..255返回一个值,它会返回一个由红色,绿色和蓝色值组成的整数,包括Alpha值。 据推测,这个阿尔法值是0xFF
,这使得任何组合的颜色最终为0xFFrrggbb
,或者,如你所写,用小数写的时候是一个巨大的负数。
要查看分配的“灰色”级别,只需检查ColAvgVal
。
请注意,在RGB和灰度之间转换的更好的公式是使用PAL / NTSC转换:
gray = 0.299 * red + 0.587 * green + 0.114 * blue
因为“全蓝”在灰度上应该比“全红”和“全绿”更暗。
注意:如果直接使用此公式,请注意浮点舍入错误。 理论上,对于gray
,它不应该返回0..255
以外的值。 在实践中,它会的。 因此,测试并限制结果。
另一种不需要每个像素进行测试和钳位的选项是使用纯整数版本:
gray = (299 * red + 587 * green + 114 * blue)/1000;
这应该只有一个非常小的舍入误差。
你可以检查这个。 我希望它能帮助你。
你可以检查一些不同的方法,如:
// The average grayscale method
private static BufferedImage avg(BufferedImage original) {
int alpha, red, green, blue;
int newPixel;
BufferedImage avg_gray = new BufferedImage(original.getWidth(), original.getHeight(), original.getType());
int[] avgLUT = new int[766];
for(int i=0; i<avgLUT.length; i++)
avgLUT[i] = (int) (i / 3);
for(int i=0; i<original.getWidth(); i++) {
for(int j=0; j<original.getHeight(); j++) {
// Get pixels by R, G, B
alpha = new Color(original.getRGB(i, j)).getAlpha();
red = new Color(original.getRGB(i, j)).getRed();
green = new Color(original.getRGB(i, j)).getGreen();
blue = new Color(original.getRGB(i, j)).getBlue();
newPixel = red + green + blue;
newPixel = avgLUT[newPixel];
// Return back to original format
newPixel = colorToRGB(alpha, newPixel, newPixel, newPixel);
// Write pixels into image
avg_gray.setRGB(i, j, newPixel);
}
}
return avg_gray;
}
链接地址: http://www.djcxy.com/p/89771.html