如何将图像转换为0-255灰度图像

时间:2014-08-23 14:31:57

标签: java image-processing grayscale

我想将图像转换为灰度图像,其中像素强度介于 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之间

由于

2 个答案:

答案 0 :(得分:6)

color.getRGB()不返回0..255中的值,它返回由红色,绿色和蓝色值组成的整数,包括Alpha值。据推测,此alpha值为0xFF,这使得任何组合颜色最终为0xFFrrggbb,或者,如果得到的话,以小数点写时会显示一个巨大的负数。

要看到&#34;灰色&#34;已分配级别,只需检查ColAvgVal

请注意,在RGB和灰度之间转换的更好公式是使用PAL/NTSC conversion

gray = 0.299 * red + 0.587 * green + 0.114 * blue

因为&#34;全蓝&#34;应该是灰度较暗的,而不是&#34;全红色&#34;和&#34;全绿&#34;。


注意:如果直接使用此公式,请注意浮点舍入错误。从理论上讲,它不应该为0..255返回gray之外的值;在实践中,它将。所以测试并钳制结果。

另一个不需要每像素测试和钳位的选项是使用仅整数版本:

gray = (299 * red + 587 * green + 114 * blue)/1000;

只能使用非常小的舍入误差。

答案 1 :(得分:-3)

您可以查看this。我希望它可以帮到你。

您可以查看一些不同的方法,例如:

// 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;

}