📜  Java中的图像处理——彩色图像到灰度图像的转换(1)

📅  最后修改于: 2023-12-03 15:31:58.645000             🧑  作者: Mango

Java中的图像处理——彩色图像到灰度图像的转换

在Java中,我们可以使用ImageIO类读取图像数据,并使用BufferedImage类处理图像数据。其中,将彩色图像转换为灰度图像是图像处理中的基础操作之一。

实现原理

彩色图像通常由红、绿、蓝三个颜色通道组成,每个通道的取值范围为0~255。而灰度图像是一种只包含亮度信息的图像,其亮度值的取值范围也为0~255。因此,将彩色图像转换为灰度图像,可以将每个像素点的三个颜色通道的值取平均值,作为该像素点的亮度值。

实现步骤

1.读取彩色图像数据并创建对应的BufferedImage对象。

BufferedImage colorImage = ImageIO.read(new File("colorImage.jpg"));
BufferedImage grayImage = new BufferedImage(colorImage.getWidth(), colorImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);

2.遍历每个像素点,并计算每个像素点的亮度值。

for (int x = 0; x < colorImage.getWidth(); x++) {
    for (int y = 0; y < colorImage.getHeight(); y++) {
        Color color = new Color(colorImage.getRGB(x, y));
        int grayValue = (color.getRed() + color.getGreen() + color.getBlue()) / 3;
        Color grayColor = new Color(grayValue, grayValue, grayValue);
        grayImage.setRGB(x, y, grayColor.getRGB());
    }
}

3.将灰度图像数据保存到文件中。

ImageIO.write(grayImage, "jpg", new File("grayImage.jpg"));
完整代码片段
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class ColorToGray {

    public static void main(String[] args) throws Exception {
        BufferedImage colorImage = ImageIO.read(new File("colorImage.jpg"));
        BufferedImage grayImage = new BufferedImage(colorImage.getWidth(), colorImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);

        for (int x = 0; x < colorImage.getWidth(); x++) {
            for (int y = 0; y < colorImage.getHeight(); y++) {
                Color color = new Color(colorImage.getRGB(x, y));
                int grayValue = (color.getRed() + color.getGreen() + color.getBlue()) / 3;
                Color grayColor = new Color(grayValue, grayValue, grayValue);
                grayImage.setRGB(x, y, grayColor.getRGB());
            }
        }

        ImageIO.write(grayImage, "jpg", new File("grayImage.jpg"));
    }

}
参考资料
  1. Java 2D Graphics, Jon Bodnar, O'Reilly Media, 2001
  2. BufferedImage API documentation, https://docs.oracle.com/en/java/javase/13/docs/api/java.desktop/java/awt/image/BufferedImage.html