我要做的是测试像素是否为蓝色。
例如:蓝色在RGB中定义为rgb(0,0,255)。典型的颜色深度为8位(256色),16位(约65,000),24位(约1600万)和32位(超过40亿种不同颜色)。因此,显然有超过1种蓝色阴影。
如果蓝色或不是蓝色,我如何定义蓝色范围并测试每个像素?关于不同的深度,我需要记住什么?
到目前为止我的代码是:
BufferedImage image = ImageIO.read(file);
// Getting pixel color by position x and y
for (int i = 0; i < image.getWidth(); i++) {
for (int j = 0; j < image.getHeight(); j++) {
int clr = image.getRGB(i, j);
注1 :
http://www.workwithcolor.com/cyan-blue-color-hue-range-01.htm
这里的问题是,颜色步骤之间是什么?
一个例子很棒。
注2 :
我刚刚发现了一个关于我感兴趣的话题的演讲:
在第13页,我们可以看到红色的定义。但是你怎么能定义其他颜色呢?
答案 0 :(得分:8)
在我看来,最简单的方法是将颜色格式转换为HSV / HSB,然后为Hue选择蓝色范围。确切的范围可能是一个问题,但我主要使用165(下面是绿色)到240(上面是紫色/紫色)。饱和度和值/亮度仅控制阴影,但请注意,0附近的饱和度将呈灰色,带有一些蓝色阴影,而接近0的值几乎为黑色。因此,您还可以检查饱和度是否> 10且值> 15,但当然您可以选择自己的值来满足您的需求。
示例代码(未经测试):
boolean isBlue(int rgb){
Color color = new Color(rgb);
float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null);
// now [0] is hue, [1] saturation and [2] value/brightness
// all values are between 0 and 1 so you must divide hue by 360 and others by 100
if(hsb[0] > 165/360 && hsb[0] < 240/360 && hsb[1] > 0.1 && hsb[2] > 0.15)
return true;
return false;
}
答案 1 :(得分:4)
在RGB色彩空间中,这并不容易。首先,颜色的显示方式取决于设备,也就是说,您选择显示的RGB值在不同的屏幕上看起来可能会有很大不同。但即使可以某种方式控制它,在英文中分配特定名称的颜色也不一定在RGB颜色立方体中占据相同的体积,无论在尺寸还是形状方面。因此,有一些颜色模型试图逼近颜色的人类感知。
一个有力的竞争者是CIELab色彩空间。 &#34;实验室&#34;指的是颜色在这个模型中的表示方式:颜色的亮度L
,红色/品红色和绿色轴上的颜色位置(a
),以及它在黄色上的位置和蓝色轴(b
)。不幸的是,RGB和CMYK值与L a b *之间没有简单的公式转换,因为RGB和CMYK颜色模型与设备有关。首先必须将RGB或CMYK值转换为特定的绝对色彩空间,例如sRGB或Adobe RGB。此调整将取决于设备,但转换得到的数据将与设备无关。
答案 2 :(得分:0)
从技术上讲,下面应该是蓝色阴影的实现。
boolean isBlueShade(int r, int g, int b)
{
return (r == g) && (r != b);
}
我们可以说CYAN也是蓝色的。但是,从技术上讲,这不是蓝色的。如果您的应用程序要求某些相关颜色为蓝色,则上述方法实现包括该范围检查。
我只是编辑上述方法只是为了传达我的想法,即使它不是预期的解决方案。