Java中的图像处理——彩色图像到灰度图像的转换
先决条件:
- Java中的图像处理——读写
- Java中的图像处理——获取和设置像素
在本文中,我们将彩色图像转换为灰度图像。
RGB 颜色模型 – RGB 颜色模型是一种加色混合模型,其中红光、绿光和蓝光以各种方式叠加在一起,以再现各种颜色。
灰度图像 –灰度图像是一种黑白或灰色单色,仅由灰色阴影组成。对比度范围从最弱的黑色到最强的白色。
通常,灰度图像对每个像素使用 8 位表示。通过使用 8 位,我们可以表示 0 到 255 的值。因此,8 位表示的灰度图像将是一个矩阵,值可以是 0 到 255 之间的任何值。0 表示黑色像素,255 表示白色像素,并且在从黑到白的不同深浅之间会来。
Note: In a grayscale image, the Alpha component of the image will be the same as the original image, but the RGB will be changed i.e, all three RGB components will have the same value for each pixel.
算法:
- 获取像素的 RGB 值。
- 求RGB的平均值,即Avg = (R+G+B)/3
- 将像素的 R、G 和 B 值替换为在步骤 2 中计算的平均值 (Avg)。
- 对图像的每个像素重复步骤 1 到步骤 3。
执行:
Java
// Java program to demonstrate
// colored to grayscale conversion
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Grayscale {
public static void main(String args[])
throws IOException
{
BufferedImage img = null;
File f = null;
// read image
try {
f = new File(
"C:/Users/hp/Desktop/Image Processing in Java/gfg-logo.png");
img = ImageIO.read(f);
}
catch (IOException e) {
System.out.println(e);
}
// get image's width and height
int width = img.getWidth();
int height = img.getHeight();
// convert to grayscale
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// Here (x,y)denotes the coordinate of image
// for modifying the pixel value.
int p = img.getRGB(x, y);
int a = (p >> 24) & 0xff;
int r = (p >> 16) & 0xff;
int g = (p >> 8) & 0xff;
int b = p & 0xff;
// calculate average
int avg = (r + g + b) / 3;
// replace RGB value with avg
p = (a << 24) | (avg << 16) | (avg << 8)
| avg;
img.setRGB(x, y, p);
}
}
// write image
try {
f = new File(
"C:/Users/hp/Desktop/Image Processing in Java/GFG.png");
ImageIO.write(img, "png", f);
}
catch (IOException e) {
System.out.println(e);
}
}
}
输出 -
Note: This code will not run on an online IDE as it needs an image on disk.