java实现图片转化为字符图片--图片的灰度化

24位彩色图与8位灰度图

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

在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255[2]。这样就得到一幅图片的灰度图。 

几种灰度化的方法

  1. 分量法:使用RGB三个分量中的一个作为灰度图的灰度值。
  2. 最值法:使用RGB三个分量中最大值或最小值作为灰度图的灰度值。
  3. 均值法:使用RGB三个分量的平均值作为灰度图的灰度值。
  4. 加权法:由于人眼颜色敏感度不同,按下一定的权值对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]。

加权算法
/**
 * 图片灰化(参考:http://www.codeceo.com/article/java-image-gray.html)
 * 
 * @param bufferedImage 待处理图片
 * @return
 * @throws Exception
 */
public static BufferedImage grayImage(BufferedImage bufferedImage) throws Exception {

    int width = bufferedImage.getWidth();
    int height = bufferedImage.getHeight();

    BufferedImage grayBufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            // 计算灰度值
            final int color = bufferedImage.getRGB(x, y);
            final int r = (color >> 16) & 0xff;
            final int g = (color >> 8) & 0xff;
            final int b = color & 0xff;
            int gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);
            int newPixel = colorToRGB(255, gray, gray, gray);
            grayBufferedImage.setRGB(x, y, newPixel);
        }
    }

    return grayBufferedImage;

}

/**
 * 颜色分量转换为RGB值
 * 
 * @param alpha
 * @param red
 * @param green
 * @param blue
 * @return
 */
private static int colorToRGB(int alpha, int red, int green, int blue) {

    int newPixel = 0;
    newPixel += alpha;
    newPixel = newPixel << 8;
    newPixel += red;
    newPixel = newPixel << 8;
    newPixel += green;
    newPixel = newPixel << 8;
    newPixel += blue;

    return newPixel;

}

文章转载至

http://www.open-open.com/code/view/1456576498968

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值