在Java中将彩色图像转换为灰度图像

时间:2017-10-03 08:49:58

标签: java image-processing

我想在没有太多预定义方法的情况下将彩色图像转换为灰度图像。

阅读彩色图像的代码在这里

主要方法:

BufferedImage img = null;
try {
    img = ImageIO.read(new File(IMG));

    int[][] pixelData = new int[img.getHeight() * img.getWidth()][3];
    int[] rgb;

    int counter = 0;
    for (int i = 0; i < img.getWidth(); i++) {
        for (int j = 0; j < img.getHeight(); j++) {
            rgb = getPixelData(img, i, j);

            for (int k = 0; k < rgb.length; k++) {
                pixelData[counter][k] = rgb[k];
            }
            counter++;
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

另一种方法:

private static int[] getPixelData(BufferedImage img, int x, int y) {
    int argb = img.getRGB(x, y);
    int rgb[] = new int[] {
        (argb >> 16) & 0xff, //red
        (argb >>  8) & 0xff, //green
        (argb      ) & 0xff  //blue
    };

    System.out.println("rgb: " + rgb[0] + " " + rgb[1] + " " + rgb[2]);
    return rgb;
}

我需要将输出转换为灰度......这是一些输出

 rgb: 255 255 255
 rgb: 255 255 255
 rgb: 255 255 255
 rgb: 255 255 255
 rgb: 255 255 255
 rgb: 255 255 255

我需要检查每个像素的RGB并将其转换为灰度。

1 个答案:

答案 0 :(得分:3)

快速而肮脏的方法是:

    int avg = (( rgb[0] + rgb[1] + rgb[2]) / 3);

    int grey_rgb = 0;
    for(int i = 0; i < 4; i++) {
        grey_rgb <<= 8;
        grey_rgb |= avg & 0xFF;
    }

    img.setRGB(x, y, grey_rgb );

当其所有RGB分量包含相同的值(例如240 240 240)时,获得灰度细微差别。为了实现这一点,我们只需要颜色RGB分量的平均数值表示。

有关更高级的算法,请查看:tannerhelland.com/3643/grayscale-image-algorithm-vb6。