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%,图像的灰度最合理。
本代码采用的是第三种加权平均值法,具体内容我代码中有详细注释.
处理前的美女图片:
灰度化处理后的美女图片:
下面贴出源代码如下:
一:图片灰度化的处理方法:
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树