我使用java来查找图像中对象的颜色。
我已经从imgae获得一个像素,然后能够获得该像素的r,g,b值。
现在,我想知道这个像素属于哪种颜色。所以我创建了一个将十六进制代码映射到color_names的映射。现在,我遍历地图并找出地图中所有条目的最短距离,并将距离最小的一个条目映射到将该颜色分配给像素的像素。
这是我的一些代码: -
private static String getColorName(int[] rgb) {
Map data = new HashMap();
data.put("00ff00", "GREEN");
data.put("ff0000", "RED");
data.put("0000ff", "BLUE");
data.put("00ffff", "CYAN");
data.put("ffff00", "YELLOW");
data.put("ff00ff", "PINK");
data.put("c8c8c8", "LIGHT GREY");
//data.put("808080", "GREY");
data.put("ffc800", "ORANGE");
data.put("4F3E86", "PURPLE");
data.put("000000", "BLACK");
data.put("ffffff", "WHITE");
String hex = "0123456789abcdef";
int minD = 256*256*256;
String res = "";
for (String key : data.keySet()) {
int r = hex.indexOf(key.charAt(0))*16 + hex.indexOf(key.charAt(1));
int g = hex.indexOf(key.charAt(2))*16 + hex.indexOf(key.charAt(3));
int b = hex.indexOf(key.charAt(4))*16 + hex.indexOf(key.charAt(5));
int distance = (Math.abs(rgb[0] - r)) +
(Math.abs(rgb[1] - g)) +
(Math.abs(rgb[2] - b));
if (distance < minD) {
res = data.get(key);
minD = distance;
}
}
return res;
}现在的问题是,
正如你所看到的距离功能是: -
D = | r1-r2 | + | g1-g2 | + | b1-b2 |其中| x |表示abs(x)功能
我的黄色被映射为灰色。经过一些调试后,我发现这一点。
我应该选择什么距离函数,或者如何改进我的映射?
在java中这样做是否存在任何内置的东西?
谢谢