我试图制作一个扫描图像以寻找特定结构和颜色的程序,但我识别颜色的类不能正确计算颜色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
。
此类的内部工作方式是将整数从输入r
,g
,b
中分离为8位RGB值。对于容差r等,存在预期的8位值er
,eg
和eb, 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如下所示:
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颜色空间。
我不确定为什么这会使整数变为负数,或者破坏我当前的识别码。
我看过解码与我非常相似的颜色的例子。虽然我自己没有尝试过,但看起来几乎完全一样。
这是我拥有的所有线索,但如果你告诉我要去哪里,我相信我可以挖掘更多。
答案 0 :(得分:1)
虽然这肯定不是整个问题,但我发现在match()
上使用它自己的ColorVector
值调用rgb
会返回false
,因为返回布尔条件是仅检查<
而不是<=
。所以:
return (rdiff<tr)&&(gdiff<tg)&&(bdiff<tb);
应该是:
return (rdiff<=tr)&&(gdiff<=tg)&&(bdiff<=tb);
覆盖预期rgb与实际rgb之间没有差异的边缘情况。