您的位置:首页 > 编程语言 > Java开发

java 图片处理灰度化

2016-07-09 14:35 627 查看
java编写图片灰度化处理,首先对图片的一些知识进行补充说明。

一:图片灰度化的处理方法:

1.最大值法(Maximum):R=G=B=Max(R,G,B),这种方法处理后灰度图象的亮度会偏高。

2.平均值法(Average):R=G=B=(R+G+B)/3,这种方法处理后灰度图象的亮度较柔和。

3.加权平均值法(Weighted Average):

R=G=B=wr*R+wg*G+wb*B,wr、wg、wb分别为R、G、B的权值。

当其权值取不同的值时,能够形成不同灰度的灰度图象,由于人眼对绿色的敏感度最高,红色次之,

蓝色最低,因此当wg > wr > wb时,所产生的灰度图像更符合人眼的视觉感受。

通常wr=30%,wg=59%,wb=11%,图像的灰度最合理。

本代码采用的是第三种加权平均值法,具体内容我代码中有详细注释.

处理前的美女图片:


灰度化处理后的美女图片:


下面贴出源代码如下:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class HuiDu {

/**
* 图片颜色的处理
* @param alpha //透明名度
* 三原色
* @param red
* @param green
* @param blue
* @return
*/
private static int colorToRGB(int alpha, int red, int green, int blue) {

/************************************************************
* 对于正数和负数在不考虑溢出的情况下,他们的运算如下:           *
* 3 << 2,则是将数字3左移2位,解释如下:                      *
* 左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。 *
* 即  newPixel << 8  即等于 newPixel * 2^8                     *
* **********************************************************
*/
int newPixel = 0;
newPixel += alpha;
newPixel = newPixel << 8;
newPixel += red;
newPixel = newPixel << 8;
newPixel += green;
newPixel = newPixel << 8;
newPixel += blue;

return newPixel;

}
public static void main(String[] args) throws IOException {
BufferedImage bufferedImage
= ImageIO.read(new File(("C:/Users/lwp940118/Desktop" + "/123.jpg")));
//获取到图片的属性信息
BufferedImage grayImage =
new BufferedImage(bufferedImage.getWidth(),
bufferedImage.getHeight(),
bufferedImage.getType());
//图片的宽高
System.out.println("getWidth----->"+bufferedImage.getWidth());

for (int i = 0; i < bufferedImage.getWidth(); i++) {
for (int j = 0; j < bufferedImage.getHeight(); j++) {
/**------------------------------------------------------
* 得到 i,j 每个坐标像素在RGB颜色模板和默认的sRGB的色彩空间 |
* color一个整数像素在默认的RGB颜色模型和默认的sRGB色彩 |
**------------------------------------------------------
*/
final int color = bufferedImage.getRGB(i, j);
/**----------------------------------------------------------
* 像素的右移  得到 三原色                                            |
* 颜色RGB颜色是由红(Red)、绿(Green)、蓝(Blue)三原色组成的,  |
* 所以可以使用这三个颜色的组合来代表一种具体的颜色,其中R、    |
* G、B的每个数值都位于0-255之间。在表达颜色的时候,         |
* 即可以使用三个数字来表达,也可以使用一个格式如0X00RRGGBB    |
* 这样格式的十六进制来表达,下面是常见颜色的表达形式:           |
*  red = (rgb & 0x00ff0000) >> 16                                                      |
                 *  红色:(255,0,0)或0x00FF0000                             |
*  green = (color & 0x0000ff00) >> 8                                                       |
                 *  绿色:(0,255,0)或0x0000FF00                             |
                 *  blue = (color & 0x000000ff)                                                     |
                 *  蓝色:(255,255,255)或0x00FFFFFF                             |
*-----------------------------------------------------------
*/
final int r = (color >> 16) & 0xff;     //右移四位
final int g = (color >> 8) & 0xff;      //右移3为
final int b = color & 0xff;
//运用灰度处理 的方法  加权平均值
int gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);
//每一个像素点的灰度转化
int newPixel = colorToRGB(255, gray, gray, gray);
grayImage.setRGB(i, j, newPixel);
}
}
File newFile = new File(("C:/Users/lwp940118/Desktop") + "/321.jpg");
ImageIO.write(grayImage, "jpg", newFile);
}

}


我最近在写有关图像处理的,即在图中识别文字的算法(java版的Android版的不限),欢迎大家交流指导,如有大神指点迷津在下必当感激不尽。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 图像处理