灰度就是没有彩色信息
只有黑白信息
灰度化就是把一张彩色图片转换为黑白图片
对于RGB图片实现灰度化就是将色彩分量R=G=B,此时这个值称为灰度值
灰度化主要方法采用的是加权平均法 gray=0.299R+0.587G+0.114B
但还有其他方法:
分量法,就是gray=R or gray=G or gray=B
最大值法,gray=max(R,G,B)
平均法,gray=(R+G+B)/3
在使用前需要知道RGB与数值之间的转换关系
//数值转换为RGB
final int r=(color>>16)&0xff;
final int g=(color>>8)&0xff;
final int b=color&0xff;
//RGB转换为数值
int newpixel=(r<<16)|(g<<8)|b;
主要实现代码
package main_menu;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
public class GrayImage {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ToGray();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//灰度化
public static void ToGray() throws FileNotFoundException, IOException {
String imgPath="E:\\ff.jpg";
//读取一个图片
BufferedImage bfi=ImageIO.read(new FileInputStream(imgPath));
int width=bfi.getWidth();
int height=bfi.getHeight();
//创建一个同高同宽的空白图片当作灰度化图片
BufferedImage gray_bfi=new BufferedImage(width,height,bfi.getType());
for(int i=0;i<width;i++) {
for(int j=0;j<height;j++) {
final int color=bfi.getRGB(i, j);
//使用的转换方法
int newpixel=jiaquan(color);
gray_bfi.setRGB(i, j, newpixel);
}
}
File outputfile = new File("加权值法.png");
ImageIO.write(gray_bfi, "png", outputfile);
}
//加权法
private static int jiaquan(int color) {
//数值转换为RGB
final int r=(color>>16)&0xff;
final int g=(color>>8)&0xff;
final int b=color&0xff;
//gray值
int gray=(int) (0.299*r+0.578*g+0.114*b);
//RGB转换为数值
int newpixel=(gray<<16)|(gray<<8)|gray;
return newpixel;
}
//分量法
private static int liangdu_r(int color) {
final int r=(color>>16)&0xff;
int gray=r;
int newpixel=(gray<<16)|(gray<<8)|gray;
return newpixel;
}
private static int liangdu_g(int color) {
final int g=(color>>8)&0xff;
int gray=g;
int newpixel=(gray<<16)|(gray<<8)|gray;
return newpixel;
}
private static int liangdu_b(int color) {
final int b=color&0xff;
int gray=b;
int newpixel=(gray<<16)|(gray<<8)|gray;
return newpixel;
}
//平均值法
private static int pingjun(int color) {
final int r=(color>>16)&0xff;
final int g=(color>>8)&0xff;
final int b=color&0xff;
int gray=(int)((r+g+b)/3);
int newpixel=(gray<<16)|(gray<<8)|gray;
return newpixel;
}
//最大值法
private static int zuida(int color) {
final int r=(color>>16)&0xff;
final int g=(color>>8)&0xff;
final int b=color&0xff;
int gray=(r>g?r:g)>b?(r>g?r:g):b;
int newpixel=(gray<<16)|(gray<<8)|gray;
return newpixel;
}
}
原图:
灰度化后: