在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

java图片灰度化原理与实现

2016-12-20 13:16| 发布者: zhangjf| 查看: 432| 评论: 0

摘要: 24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB。通常,许多24位彩色图像存储为32位图像,每个像素多余的字节存储为一个alpha值,表现有 ...
24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB。通常,许多24位彩色图像存储为32位图像,每个像素多余的字节存储为一个alpha值,表现有特殊影响的信息[1]。

在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255[2]。这样就得到一幅图片的灰度图。
几种灰度化的方法 分量法:使用RGB三个分量中的一个作为灰度图的灰度值。
最值法:使用RGB三个分量中最大值或最小值作为灰度图的灰度值。
均值法:使用RGB三个分量的平均值作为灰度图的灰度值。
加权法:由于人眼颜色敏感度不同,按下一定的权值对RGB三分量进行加权平均能得到较合理的灰度图像。一般情况按照:Y = 0.30R + 0.59G + 0.11B。
[注]加权法实际上是取一幅图片的亮度值(人眼对绿色的敏感最高,对蓝色敏感最低 )作为灰度值来计算,用到了YUV模型。在[3]中会发现作者使用了Y = 0.21 * r + 0.71 * g + 0.07 * b(百度百科:Y = 0.30 * r + 0.59 * g + 0.11 * b)来计算灰度值。实际上,这种差别应该与是否使用伽马校正有关[1]。 强制设置灰度化的方法(效果相对就差)
  1. /**
  2. * 图片灰化(效果不行,不建议。据说:搜索“Java实现灰度化”,十有八九都是一种方法)
  3. *
  4. * @param bufferedImage 待处理图片
  5. * @return
  6. * @throws Exception
  7. */
  8. public static BufferedImage grayImage(BufferedImage bufferedImage) throws Exception {
  9. int width = bufferedImage.getWidth();
  10. int height = bufferedImage.getHeight();
  11. BufferedImage grayBufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
  12. for (int x = 0; x < width; x++) {
  13. for(int y = 0 ; y < height; y++) {
  14. grayBufferedImage.setRGB(x, y, bufferedImage.getRGB(x, j));
  15. }
  16. }
  17. }
复制代码
加权法灰度化(效果较好)
  1. /**
  2. * 图片灰化(参考:http://www.codeceo.com/article/java-image-gray.html)
  3. *
  4. * @param bufferedImage 待处理图片
  5. * @return
  6. * @throws Exception
  7. */
  8. public static BufferedImage grayImage(BufferedImage bufferedImage) throws Exception {
  9. int width = bufferedImage.getWidth();
  10. int height = bufferedImage.getHeight();
  11. BufferedImage grayBufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
  12. for (int x = 0; x < width; x++) {
  13. for (int y = 0; y < height; y++) {
  14. // 计算灰度值
  15. final int color = bufferedImage.getRGB(x, y);
  16. final int r = (color >> 16) & 0xff;
  17. final int g = (color >> 8) & 0xff;
  18. final int b = color & 0xff;
  19. int gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);
  20. int newPixel = colorToRGB(255, gray, gray, gray);
  21. grayBufferedImage.setRGB(x, y, newPixel);
  22. }
  23. }
  24. return grayBufferedImage;
  25. }
  26. /**
  27. * 颜色分量转换为RGB值
  28. *
  29. * @param alpha
  30. * @param red
  31. * @param green
  32. * @param blue
  33. * @return
  34. */
  35. private static int colorToRGB(int alpha, int red, int green, int blue) {
  36. int newPixel = 0;
  37. newPixel += alpha;
  38. newPixel = newPixel << 8;
  39. newPixel += red;
  40. newPixel = newPixel << 8;
  41. newPixel += green;
  42. newPixel = newPixel << 8;
  43. newPixel += blue;
  44. return newPixel;
  45. }
复制代码
参考

[1] 《多媒体技术教程》Ze-Nian Li,Mark S.Drew著,机械工业出版社。
[2] 百度百科:灰度值
[3] Java color image to grayscale conversion algorithm(s)

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 12:46

Copyright 2015-2025 djqfx

返回顶部