处理如何从颜色集合中获取最接近的颜色



我有一个处理颜色的Collection of Integers(它包含重新缩放到1x1以获得"平均"颜色的图像的颜色(
我有一个东西,它必须为我检索数组中最接近的颜色:

public static int getNearestColor(Collection<Integer> colors, int color) {
return colors.stream()
.min(Comparator.comparingInt(i -> Math.abs(i - color)))
.orElseThrow(() -> new NoSuchElementException("No value present"));
}

但当我这样做时,它会返回一个比输入远的颜色,但数组包含一些比输入最近的颜色,这是我不明白的问题吗?

color()的RGB颜色通道在int中编码。您可以通过red()green()blue()提取颜色的红色、绿色和蓝色成分
将颜色通道视为三维向量(PVector(,并通过dist()计算2个颜色向量的欧几里得距离。"距离"最短的颜色是"最近"的颜色:

在以下函数中,参数c1c2是类型为int:的颜色

float ColorDistance(int c1, int c2) {
return PVector.dist(
new PVector(red(c1), green(c1), blue(c1)), 
new PVector(red(c2), green(c2), blue(c2)));
}

通过查找最小浮点"距离"(ColorDistance(i, color)(,在颜色集合中查找"最近"的颜色。

java中的

数组没有流方法;也许你指的是Arrays.stream(colors)。CCD_ 14除了按自然顺序进行比较外,没有其他方法进行比较。你可以先映射到差异(abs(i - color)(,但现在你已经删除了你想要的信息(原始颜色(,所以这也不起作用。让我们把它框起来。这会产生下面的代码,除了编译和运行之外,它和你的代码完全一样。然后,我还将添加一个测试用例,使其成为一个自包含的示例:

int[] colors = {1,4,5,9,12};
int target = 6;
int a = Arrays.stream(colors).boxed()
.min(Comparator.comparingInt(i -> Math.abs(i - target)))
.orElseThrow(() -> new NoSuchElementException());
System.out.println(a);

而且,哇,"5"掉了,这正是你想要的。

换句话说,你的代码的意图是好的,如果它没有给出正确的答案,你的输入就不是你想象的那样,或者从你的粘贴中无法收集到其他错误。

我可以建议,如果有可能把这个问题放在一个简单的、独立的形式中(正如这个问题清楚地表明的那样,请参阅这个答案中的代码片段(,你可以这样做吗?通常你会这样回答自己的问题:(

public static int getNearestColor(int[] colors, int color) {
int minDiff = IntStream.of(colors)
.map(val -> Math.abs(val - color))
.min()
.getAsInt();
OptionalInt num = IntStream.of(colors)
.filter(val-> val==(color + minDiff))
.findFirst();
if(num.isPresent()){
return color + minDiff;
} else {
return color - minDiff;
}
}

最新更新