Обработка как получить ближайший цвет из коллекции цветов - PullRequest
1 голос
/ 26 апреля 2020

У меня есть 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"));
}

Но когда я это сделаю, он вернет мне цвет, который на далеко , чем входной, но массив содержит некоторые цвета, которые являются ближайшими к входу, это моя проблема, которую я не понимаю?

Ответы [ 3 ]

2 голосов
/ 26 апреля 2020

Цветовые каналы RGB color() кодируются в int. Вы можете извлечь красный, зеленый и синий компоненты цвета: red(), green() и blue().
Обработать цветовые каналы как трехмерный вектор (PVector) и вычислите евклидово расстояние из 2 цветовых векторов по dist(). Цвет с самым коротким «расстоянием» - это «ближайший» цвет:

В следующей функции аргументы c1 и c2 являются цветами типа 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)).

0 голосов
/ 26 апреля 2020
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;
    }
  }
0 голосов
/ 26 апреля 2020

массивы в java не имеют потокового метода; возможно, вы имели в виду Arrays.stream(colors). IntStream не имеет никакого способа сделать сравнение, кроме как в естественном порядке. Сначала вы можете сопоставить разницу (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, выпадает, что именно то, что вы хотите.

Другими словами, смысл вашего кода в порядке, если он не дает правильного ответа, ваши входные данные - это не то, о чем вы думали, или что-то еще не так, что нельзя найти из вашей пасты.

Может Я полагаю, что, если вообще возможно поставить вопрос в простой, самодостаточной форме (как этот вопрос явно был, см. Фрагмент кода в этом ответе), что вы это делаете? Часто вы будете отвечать на свои вопросы таким образом:)

...