如何在Java

时间:2017-04-13 17:59:23

标签: java arrays

我正在制作一个程序,我在其中使用一种颜色并将其与数组中的其他颜色进行比较。我使用欧几里德颜色距离公式(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]

1 个答案:

答案 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的所有值,则必须重复执行该过程。

(**):要轻松跟踪每个步骤中的索引更改,您将需要两个额外的数组 - 一个将已排序元素的位置存储在未排序的数组中,另一个将存储顺序未分类的元素。