我正在制作一个程序,我在其中使用一种颜色并将其与数组中的其他颜色进行比较。我使用欧几里德颜色距离公式(wiki link)来确定两种颜色之间的颜色距离,但我想要做的是获得第二个第三和第四个最小值索引,然后我可以将这些索引的值分配给与之相比的价值。这是我尝试过的。
private void findUnknownColors(Color[] firstAnchor, Color[] foundAnchor){
//Find distance between each color in first anchor and color arr
double[] storeClosestColors = new double [24];
//fill the array with a random value.
Arrays.fill(storeClosestColors, 5000);
for(int i = 0; i < colorArray.length; i++){
storeClosestColors[i] = colorDistance(firstAnchor[0], colorArray[i]);
if(i < storeClosestColors[2]){
storeClosestColors[2] = i;
}
}
//get 3 closest colors disregarding 0.0
System.out.println("Closest colors: " + Arrays.toString(storeClosestColors));
}
这是我比较颜色的方式,以及我如何确定彼此之间的差异。它返回表示其差异的浮点值。距离越近,它们在RGB光谱上越远越大。
public double colorDistance(Color c1, Color c2) {
double rmean = (c1.getRed() + c2.getRed()) / 2;
int r = c1.getRed() - c2.getRed();
int g = c1.getGreen() - c2.getGreen();
int b = c1.getBlue() - c2.getBlue();
double weightR = 2 + rmean / 256;
double weightG = 4.0;
double weightB = 2 + (255 - rmean) / 256;
//System.out.println(Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b));
return Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b);
}
这是输出。
Color array: [java.awt.Color[r=171,g=162,b=184], java.awt.Color[r=103,g=7,b=10], java.awt.Color[r=183,g=60,b=67], java.awt.Color[r=111,g=20,b=37], java.awt.Color[r=0,g=4,b=45], java.awt.Color[r=72,g=127,b=57], java.awt.Color[r=171,g=172,b=199], java.awt.Color[r=83,g=146,b=89], java.awt.Color[r=146,g=171,b=62], java.awt.Color[r=0,g=3,b=30], java.awt.Color[r=165,g=61,b=49], java.awt.Color[r=140,g=181,b=78], java.awt.Color[r=155,g=22,b=22], java.awt.Color[r=170,g=151,b=64], java.awt.Color[r=5,g=10,b=64], java.awt.Color[r=155,g=147,b=173], java.awt.Color[r=34,g=131,b=51], java.awt.Color[r=140,g=165,b=51], java.awt.Color[r=1,g=15,b=63], java.awt.Color[r=30,g=139,b=64], java.awt.Color[r=178,g=168,b=188], java.awt.Color[r=170,g=36,b=33], java.awt.Color[r=113,g=26,b=46], java.awt.Color[r=112,g=25,b=44]]
Closest colors: [271.20551190471775, 188.49519224638064, 0.0, 148.0690295098877, 304.4738994868854, 221.26990553111827, 301.1983358187757, 236.5966372330765, 230.12584023475068, 309.0199161765306, 40.283177320067495, 252.41092952514953, 112.21335008589664, 183.30020415632384, 291.59154464121553, 242.0912147311422, 273.11361532336684, 222.63613286313162, 293.7586168948921, 285.47859349476624, 283.3636066853858, 73.66764469561926, 135.36298134552888, 138.41173575152507]
答案 0 :(得分:0)
我想我可以就你如何做你想做的事情给出一些建议(根据我的理解)。
colorDistance
(*)计算colorArray
每种颜色的C
,将每种颜色的距离存储在与colorArray
颜色相同的序列中。我们将数组命名为colorDistances
。所以,colorDistances[i] = Distance between colorArray[i] and C
。colorDistances
阵列。我们将数组命名为colorDistancesCopy
。colorDistancesCopy
上执行Insertion Sort。在进行排序时,请跟踪每个步骤(**)中colorDistancesCopy
元素的索引更改。colorDistancesCopy
,并排序未排序colorDistances
数组的每个元素的顺序。根据这些信息,您可以轻松地从颜色colorArray
确定C
的第2,第3,第4最接近的颜色。(*):从您的代码中,我看到的是C
的值将来自数组(firstAnchor
)。在这种情况下,如果您必须使用firstAnchor
的所有值,则必须重复执行该过程。
(**):要轻松跟踪每个步骤中的索引更改,您将需要两个额外的数组 - 一个将已排序元素的位置存储在未排序的数组中,另一个将存储顺序未分类的元素。