当前位置: 首页 > 知识库问答 >
问题:

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

宗安翔
2023-03-14

我正在尝试制作一个程序,可以扫描图像中的特定结构和颜色,但我的类识别颜色,并没有正确计算颜色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);
    }


}

可以看到,在my match()函数中,我使用了三个主要数字。宽大号码,lenence,应该匹配的RGB代码,RGB,以及输入值RGB

此类的内部工作原理是将int从输入中分离为8位RGB值,rgb。有预期的8位值eregeb,用于预期的r、预期的g等,还有宽大值trtgtb',用于容差r等。

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

问题是,调试时,输入颜色会出现负值。这不是唯一的问题。我为我提供的图片画了一条完整的彩虹,即使有百分之十的宽大,我也永远找不到匹配的。

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

函数的Javadoc如下所示:

公共整数getRGB(整数x,整数y)

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

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

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

我见过一些解码颜色的例子,它们和我的非常相似。虽然我自己没有尝试过,但它们看起来几乎一模一样。

这是我所有的线索,但是如果你告诉我去哪里找,我相信我能找到更多。

共有1个答案

赏育
2023-03-14

虽然这肯定不是问题的全部,但我发现在ColorVector调用match()并使用它自己的rgb值会返回false,因为返回布尔条件只是检查

返回(rdiff)

应该是:

返回(rdiff)

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

 类似资料:
  • 更新时间:2018-09-17 12:22:40 功能说明 颜色识别器。TCS230 是一款颜色识别模块,具有高分辨率、可编程的颜色选择特性。 硬件资源 1.ESP32 开发板 2.TCS230 模块 3.接线 tcs230 GND 引脚接 esp32 GND 引脚; tcs230 VCC 引脚接 esp32 3.3V 引脚; tcs230 S2 引脚接 esp32 IO5 引脚; tcs230

  • 在其他语言中,此任务很简单,只需在Python中使用类似以下内容: 如果没有什么要处理的,我的程序也会想暂停执行。我不希望它用查询使数据库过载。 我正在尝试编写一个应用程序,它将充当后台队列处理器。它将检查数据库,看看队列中是否有任何需要处理的项目,然后该程序将数据写入磁盘上的文件。连接到同一数据库的不同系统的用户会间歇性地将数据添加到数据库中。 我认为永久npm模块不太合适,因为该模块只是检查脚

  • 问题内容: 我在Swift 3.0中根据html内容创建了pdf文件: 除了我的base64编码图像外,其他所有内容都可以正常渲染。在Web视图中或在Safari或chrome浏览器中的HTML内容本身可以正确显示,并且可以正确显示所有图像。但是图像永远不会渲染到pdf中。 为什么不渲染图像?如何使它们渲染? 问题答案: 我找到了解决方案! 导出到PDF会在渲染过程完成之前进行。如果您放入很小的图

  • 我有一个非常令人沮丧的问题。我正在使用Android摄像头启动摄像头并录制视频。 我期望的是:当我按stop时,我想通过onActivityResult返回我的应用程序活动,以执行一些操作,例如显示视频录制的拇指图像等。 发生的情况:当我按下stop时,屏幕会闪烁,好像回到应用程序,但随后会继续显示摄像头。我在ActivityResult中放了一个日志,它再也不会回这里了!请注意,这不是inten

  • 很抱歉问这个问题,但我不知道如何将UIImage表示为每个像素的UIColor数组。我尽了最大努力转换,但没有得到想要的结果。

  • 色彩识别模块用于识别物体的颜色,并会返回一组RGB数值。 净重量:7.3g 体积:24×24×14mm 参数 刷新率:25Hz 动态范围:3800000:1 工作电压:DC 5V 抗跌落能力:1.5m 工作温度:-10℃~55℃ 工作湿度:<95% 特点 高灵敏度 配合软件支持取色功能