Java实现转灰度图像算法


 

  • 什么是灰度图像?

首先指出,在数字图像领域内,灰度图像不是黑白图像。黑白图像中,所有像素点的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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM