我有一个BufferedImage,它的类型是TYPE_BYTE_GRAY,我需要获取x,y处的像素值。我知道不能使用getRGB,因为它返回错误的颜色模型,那么我该怎么做呢?非常感谢!
通过调用getData()
方法从BufferedImage
获取java.awt.image.Raster
。
然后使用
int getSample(int x, int y, int b)
在接收到对象时,其中b是颜色通道(每种颜色由8位表示)。
对于灰度图像:
b = 0.
对于RGB图像
b = 0 ==>> R channel,
b = 1 ==>> G channel,
b = 2 ==>> B channel.
我想你想找的是将RGB转换为灰度值的数学公式,有几种不同的方法,以下是其中的一些:
亮度法(Lightness method):计算最明显颜色和最不明显颜色的平均值:(max(R, G, B) + min(R, G, B)) / 2。
平均值法(Average method):简单地对三个通道的值进行平均:(R + G + B) / 3。
亮度平均法(Luminosity method):是平均值法的一个更复杂的版本。它也会计算三个通道的平均值,但是通过加权平均来考虑人类视觉的感知。人类对绿色的敏感性比其他颜色更高,因此绿色的权重最大。亮度平均法的公式为:0.21 R + 0.71 G + 0.07 B。
参考资料:http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/
假设您有一个名为grayImg的BufferedImage,其类型为TYPE_BYTE_GRAY
int width = grayImg.getWidth();
int height = grayImg.getHeight();
byte[] dstBuff = ((DataBufferByte) grayImg.getRaster().getDataBuffer()).getData();
那么在(x,y)处的灰度值将简单地是:
dstBuff[x+y*width] & 0xFF;