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来计算灰度值(显然三个权值相加并不等于1,可能是作者的错误?)。实际上,这种差别应该与是否使用伽马校正有关[1]。
一种Java实现灰度化的方法
如果你搜索“Java实现灰度化”,十有八九都是一种方法(代码):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
void
grayImage()
throws
IOException{
File file =
new
File(System.getProperty(
"user.dir"
)+
"/test.jpg"
);
BufferedImage image = ImageIO.read(file);
int
width = image.getWidth();
int
height = image.getHeight();
BufferedImage grayImage =
new
BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
for
(
int
i=
0
; i < width ; i++){
for
(
int
j =
0
; j < height; j++){
int
|