Java - 颜色识别程序永远不会找到像素

时间:2018-02-04 03:15:09

标签: java image image-recognition

我试图制作一个扫描图像以寻找特定结构和颜色的程序,但我识别颜色的类不能正确计算颜色RGB元素。

我的班级目前看起来像这样:

  package com.tuskiomi.image;

public class ColorVector {

    public static final int twoPctLeniency = 328965;
    public static final int fivePctLeniency = 855309;
    public static final int tenPctLeniency = 1644825;


    public int x, y;
    public int RGB;
    public int leniency;

    public ColorVector(int x, int y, int RGB){
        this.x = x;
        this.y = y;
        this.RGB = RGB;
        this.leniency = ColorVector.twoPctLeniency;
    }

    public ColorVector(int x, int y, int RGB, int leniency){
        this.x = x;
        this.y = y;
        this.RGB = RGB;
        this.leniency = leniency;
    }

    public static boolean match( ColorVector vec, int rgb){
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = (rgb >> 0) & 0xFF;
        //System.out.print(rgb);
        //System.out.print("-"+vec.RGB);

        int er = (vec.RGB >> 16) & 0xFF;
        int eg = (vec.RGB >> 8) & 0xFF;
        int eb = (vec.RGB >> 0) & 0xFF;

        int tr = (vec.leniency >> 16) & 0xFF;
        int tg = (vec.leniency >> 8) & 0xFF;
        int tb = (vec.leniency >> 0) & 0xFF;

        int rdiff = Math.abs(r-er);
        int gdiff = Math.abs(g-eg);
        int bdiff = Math.abs(b-eb);
        //System.out.println("-"+rdiff+"-"+gdiff+"-"+bdiff);

        return (rdiff<tr)||(gdiff<tg)||(bdiff<tb);
    }

    public boolean match(int rgb){
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = (rgb >> 0) & 0xFF;

        System.out.print(rgb);
        System.out.println("-"+this.RGB);

        int er = (this.RGB >> 16) & 0xFF;
        int eg = (this.RGB >> 8) & 0xFF;
        int eb = (this.RGB >> 0) & 0xFF;

        int tr = (this.leniency >> 16) & 0xFF;
        int tg = (this.leniency >> 8) & 0xFF;
        int tb = (this.leniency >> 0) & 0xFF;

        int rdiff = Math.abs(r-er);
        int gdiff = Math.abs(g-eg);
        int bdiff = Math.abs(b-eb);

        return (rdiff<tr)&&(gdiff<tg)&&(bdiff<tb);
    }


}

你可以在我的match()函数中看到我使用了三个主要数字。宽大号码leniency,应与之匹配的RGB代码,RGB和输入值rgb

此类的内部工作方式是将整数从输入rgb中分离为8位RGB值。对于容差r等,存在预期的8位值eregeb, for expected r, expected g, etc. and there are the leniency values tr , tg , tb`

我从预期的r g b值中减去r g b值,如果绝对值小于容差,则为宽松值,测试通过。

问题是,在调试时,我得到输入颜色的负值。这不是唯一的问题。我为它提供的图像放了一个完整的彩虹,即使宽大百分之十,我也永远不会得到匹配。

我不确定为什么会发生这种情况,因为我直接从BufferedImage.getRGB(int x,int y)中获取RGB值。

该函数的Javadoc如下所示:

的getRGB

public int getRGB(int x,int y)

返回默认RGB颜色模型(TYPE_INT_ARGB)和默认sRGB颜色空间中的整数像素。如果此默认模型与图像ColorModel不匹配,则会进行颜色转换。使用此方法时,返回数据中的每个颜色分量只有8位精度。 如果坐标不在边界内,则可能抛出ArrayOutOfBoundsException。但是,不保证显式边界检查。

参数:
x - 从中​​获取默认RGB颜色模型中的像素的像素的X坐标和sRGB颜色空间
y - 从中​​获取默认RGB颜色模型中的像素的像素的Y坐标和sRGB颜色空间返回:默认RGB颜色模型中的整数像素和默认的sRGB颜色空间。

我不确定为什么这会使整数变为负数,或者破坏我当前的识别码。

我看过解码与我非常相似的颜色的例子。虽然我自己没有尝试过,但看起来几乎完全一样。

这是我拥有的所有线索,但如果你告诉我要去哪里,我相信我可以挖掘更多。

1 个答案:

答案 0 :(得分:1)

虽然这肯定不是整个问题,但我发现在match()上使用它自己的ColorVector值调用rgb会返回false,因为返回布尔条件是仅检查<而不是<=。所以:

return (rdiff<tr)&&(gdiff<tg)&&(bdiff<tb);

应该是:

return (rdiff<=tr)&&(gdiff<=tg)&&(bdiff<=tb);

覆盖预期rgb与实际rgb之间没有差异的边缘情况。