【问题标题】:Find nearest Color from a colors list从颜色列表中查找最近的颜色
【发布时间】:2014-07-22 08:24:58
【问题描述】:

我有一个带有 R、G、B 值的颜色列表。下面使用“Color.rgb(R,G,B)”显示了一些数据。 然后我进行图像处理,当用户触摸图像上的某个位置时,我会得到该触摸像素的 RGB 值。如何从我的颜色列表中搜索这个 RGB 值。 搜索功能应该是:如果列表中存在RGB,则返回位置或值。如果 RGB 不存在,则返回列表中最接近的值。 我的搜索功能是:

List<Colors> colors;
touchedRGB = bitmap.getPixel(x, y);
        for (int i = 0; i < colors.size(); i++) {
            Colors color=colors.get(i);
            if (touchedRGB==Color.rgb(color.getRcolor(),color.getGcolor(), color.getBcolor())) {
                Log.v("OK", "Color found at:"+i);
            }
        }

它只检查并返回颜色是否存在而不是最接近的颜色。 这是颜色列表的代码:

    public class Colors {

public int rowid;
public int Rcolor;
public int Gcolor;
public int Bcolor;
public int RGB;
public int getRowid() {
    return rowid;
}

public void setRowid(int rowid) {
    this.rowid = rowid;
}
public int getRcolor() {
    return Rcolor;
}

public void setRcolor(int Rcolor) {
    this.Rcolor = Rcolor;
}

public int getGcolor() {
    return Gcolor;
}

public void setGcolor(int Gcolor) {
    this.Gcolor = Gcolor;
}

public int getBcolor() {
    return Bcolor;
}

public void setBcolor(int Bcolor) {
    this.Bcolor = Bcolor;
}

}

原木猫:

06-02 04:40:59.911: V/Color(1539): RGB:-2064 R:255 G:247 B:240
06-02 04:40:59.921: V/Color(1539): RGB:-139303 R:253 G:223 B:217
06-02 04:40:59.981: V/Color(1539): RGB:-147017 R:253 G:193 B:183
06-02 04:41:00.031: V/Color(1539): RGB:-352102 R:250 G:160 B:154
06-02 04:41:00.121: V/Color(1539): RGB:-555139 R:247 G:135 B:125
06-02 04:41:00.171: V/Color(1539): RGB:-2136478 R:223 G:102 B:98
06-02 04:41:00.181: V/Color(1539): RGB:-3781045 R:198 G:78 B:75
06-02 04:41:00.221: V/Color(1539): RGB:-197923 R:252 G:250 B:221
06-02 04:41:00.361: V/Color(1539): RGB:-3403 R:255 G:242 B:181

【问题讨论】:

  • 你试过什么?因为你的代码对我们来说毫无用处......
  • 我尝试检查颜色是否存在,效果很好,不适用于列表中最接近的颜色。
  • 我认为您必须构建一个颜色查找表,然后分配“类似于”#ffeedd 之类的值,或者这样 - 您可能会得到多个响应 - 因为您可能会将颜色归类为类似于红色,并且变黄。不过,您必须输入超过 1600 万种颜色数据。
  • 我的意思是“向我们展示你的尝试”,意思是代码。无论如何我将无法帮助您,但如果有人可以,他会更容易从现有代码开始并确定问题。此外,SO 不是关于“为我编写代码”,因此您需要付出一些努力。正如 Der Golem 所建议的那样,第一个问题是要知道确切的预期结果,因为一种颜色可能与您阵列中的许多其他颜色接近。
  • 另一种方法是创建一个学习系统:找不到匹配项,您输入值。因此,您可以一次性输入 16 多万条数据。

标签: android


【解决方案1】:

创建一个“距离”函数,比较 2 种颜色并给出距离。相同颜色的距离为 0。

根据“最接近的颜色”对您的含义,有多种方法可以实现距离。最简单的方法是只使用 RGB 差异的总和:

public int Distance(Color a, Color b) {
    return Math.Abs(a.r - b.r) + Math.Abs(a.g - b.g) + Math.Abs(a.b - b.b);
}

或者您可以将 RGB 解释为 3D 空间中的一个点并获得几何距离,如下所示:

public double Distance(Color a, Color b) {
    return Math.Sqrt(Math.Pow(a.r - b.r, 2) + Math.Pow(a.g - b.g, 2) + Math.Pow(a.b - b.b, 2));
}

这对于大多数简单的应用程序来说通常已经足够了。如果您想要更真实的比较,您可能会将 RGB 颜色转换为类似 HSV 的颜色,并主要根据色调进行比较。

【讨论】:

  • 出色的答案,非常感谢。不过有一个问题;上面的蓝色计算不应该是 (a.b - b.b) 而不是 (a.b - b.g) 吗?
  • @biddster 哈哈哈哈哎呀。这就是为什么你不应该复制+粘贴!
  • 感谢您的回答。我们可以用hsb颜色做同样的事情吗??
  • @viper,是的,尽管在实践中你可能会发现给色调赋予更高的权重更实际
【解决方案2】:

请试试这个。

int touchedRGB = bitmap.getPixel(x, y);
   int redValue = Color.red(touchedRGB);
    int blueValue = Color.blue(touchedRGB);
    int greenValue = Color.green(touchedRGB);
    System.out.println("<<<<<>>>>>>>"+"R:" + redValue + "G:" + greenValue + "B:"    + blueValue);

【讨论】:

    猜你喜欢
    • 2019-06-12
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2014-01-28
    • 2011-05-09
    • 2013-08-26
    • 2016-03-25
    相关资源
    最近更新 更多