【发布时间】:2016-03-23 16:40:52
【问题描述】:
我目前正在研究一个需要确定上传图像是灰度还是 RGB 的用例。我找到了几种识别方法,但不确定它们是否可靠并且可以共同用于确认图像是否为灰度。
第 1 部分:使用 Raster 读取图像并获取 NumberDataElements。
BufferedImage image = ImageIO.read(file);
Raster ras = image.getRaster();
int elem = ras.getNumDataElements();
我观察到 elem 的值在某些情况下是“1”,但不是全部。
第 2 部分:检查每个像素的 RGB 值。如果给定像素的 R、G、B 值相同。
BufferedImage image = ImageIO.read(file);
Raster ras = image.getRaster();
//Number of Color elements
int elem = ras.getNumDataElements();
int width = image.getWidth();
int height = image.getHeight();
int pixel,red, green, blue;
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++) {
//scan through each pixel
pixel = image.getRGB(i, j);
red = (pixel >> 16) & 0xff;
green = (pixel >> 8) & 0xff;
blue = (pixel) & 0xff;
//check if R=G=B
if (red != green || green != blue ) {
flag = true;
break;
}
}
我在这里检查任何给定像素的 R、G、B 值是否相同,并且此行为在所有像素中都是一致的。
我正在使用这两种方法,但不确定它们的准确度。 请建议..
【问题讨论】:
-
red != green || green != blue || red != blue只需进行两次比较即可。此外,您两次调用“break”,第二次是多余的。 -
虽然 RGB 中的“灰色”表示 R = G = B,但可能存在一些变化,例如。 G。如果图像具有嵌入的颜色配置文件,或者从 jpeg 恢复。我相信更可靠但更慢的方法是将像素转换为 HSV 并检查 S(饱和度)是否接近 0。
-
@SashaSalauyou 据我所知,即使图像是 jpeg 并使用了颜色表,此代码仍然可以工作,因为图像已被解码并且 getRGB 独立于源格式。
-
@Elemental 是的,当然。将我的评论视为确定图像“看起来灰度”而不是“灰度”的一种方式
-
@leonbloy 他们有两个循环,但他们的休息没有正确放置。 Dark Knight 将图像存储为 RGB 但实际上是灰度图像似乎很奇怪。您是否考虑过检查 BufferedImage#getType?
标签: java bufferedimage dpi