如何定义像素颜色的清晰范围

时间:2015-08-12 10:53:20

标签: java colors range rgb pixel

我要做的是测试像素是否为蓝色。

例如:蓝色在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

我刚刚发现了一个关于我感兴趣的话题的演讲:

  

http://cstwiki.wtb.tue.nl/images/06-opencv.pdf

在第13页,我们可以看到红色的定义。但是你怎么能定义其他颜色呢?

3 个答案:

答案 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;
}

Wiki about HSV

RGBtoHSB javadoc

Color picker to check colors in different systems

答案 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也是蓝色的。但是,从技术上讲,这不是蓝色的。如果您的应用程序要求某些相关颜色为蓝色,则上述方法实现包括该范围检查。

我只是编辑上述方法只是为了传达我的想法,即使它不是预期的解决方案。