首先指出,在数字图像领域内,灰度图像不是黑白图像。黑白图像中,所有像素点的RGB值只有两种,(0,0,0)或者(255,255,255),我们也可称它为二值图像。而灰度图像则不同,灰度图像在黑色与白色之间还有许多级的颜色深度,如果灰度图是8位,就有2的8次方,即256个灰度级。
我们再来分析灰度图像中的RGB值可以发现,每个像素点的RGB值都满足R=G=B。
转换前:

转换后:

Gray = R*0.299 + G*0.587 + B*0.114
但是为了避免浮点运算,转换成如下形式:
Gray=(R*30+G*59+B*11)/100
首先我们获取一张图片(JPG)每个像素点的RGB值,再存放进数组中,然后再处理数组中的每一个值,最后输出就完成了。
这里必须要指出一下我们需要知道图像的位深度是多少,这里我以位深度为24为例,从高位到地位,每8bit分别存储着R、G、B的值。
1 import java.io.*;
2 import javax.imageio.ImageIO;
3 import java.awt.image.*;
4
5
6 public class imageTest() {
7 public static void main(String args[]){
8 BufferedImage grayImage = null;
9 grayImage = imageTest.imageToGray("C:\\imageForTest.jpg");
10 //会保存在当前工程的目录下
11 ImageIO.write(grayImage, "JPEG", new File("grayImage.jpg"));
12 }
13
14 public static BufferedImage imageToGray(String imagePath){
15 BufferedImage image = null;
16 BufferedImage grayImage = null;
17 int gray = 0;
18 try {
19 File imagef = new File(imagePath);
20 image = ImageIO.read(imagef);
21
22 if(!imagef.exists()){
23 System.out.println("image not found!");
24 return grayImage;
25 }
26 int height = image.getHeight();
27 int width = image.getWidth();
28 int minX = image.getMinX();
29 int minY = image.getMinY();
30
31 grayImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
32
33 for(int i=minX; i<width; i++) {
34 for(int j=minY; j<height; j++) {
35 int[] RGB = {0, 0, 0};
36 //将24bit中存储的RGB值单个提取出来,可以理解为byte转int
37 RGB[0] = (image.getRGB(i, j) & 0xff0000) >> 16;
38 RGB[1] = (image.getRGB(i, j) & 0xff00) >> 8;
39 RGB[2] = (image.getRGB(i, j) & 0xff);
40
41 //这里是将RGB分别乘上一个权重,得出相应的灰度值gray
42 gray = (30*RGB[0] + 59*RGB[1] + 11*RGB[2]) / 100;
43 //将得出的灰度值转换成计算机中存储的模式
44 int rgb_togray = ((gray & 0xff)<<16 ) | ((gray & 0xff)<<8) | (gray & 0xff);
45 grayImage.setRGB(i, j, rgb_togray);
46 }
47 }
48 }catch(IOException e) {
49 e.printStackTrace();
50 }
51 return grayImage;
52 }
53 }