Средний и наиболее близкий цвета
Суть в том, чтобы рассчитать средний цвет изображения, а также реализовать поиск самого похожего цвета. У меня есть грубые идеи вроде расчета средних значений для R, G и B компонент для вычисления среднего цвета, и нахождение минимальной суммы разностей этих компонент для подбора похожего цвета. Есть идеи получше?
Ответы (2 шт):
Автор решения: Alexandr
→ Ссылка
Советую Вам посмотреть готовые библиотеки, например, OpenCV. К сожалению, не могу накидать решение полностью, но ниже код нахождения среднего цвета:
import nu.pattern.OpenCV;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
OpenCV.loadShared();
Mat img = Imgcodecs.imread("/path/to/image");
Scalar scalar = Core.mean(img);
System.out.println(scalar);
}
}
Тестовое изображение:
Результат:
[58.11971896196495, 69.30190753987546, 91.63179155959905, 0.0]
Автор решения: Alexey R.
→ Ссылка
Можно взять дистанцию:
public static BigDecimal distance(Color from, Color to) {
return BigDecimal.valueOf(Math.sqrt(
Math.pow(from.getRed() - to.getRed(), 2)
+ Math.pow(from.getGreen() - to.getGreen(), 2)
+ Math.pow(from.getBlue() - to.getBlue(), 2)
));
}
И далее воспользоваться стримами. Вот пример:
public static void main(String[] args) {
final Color testColor = Color.GRAY;
List<Color> colors = new ArrayList<>();
colors.add(Color.BLUE);
colors.add(Color.ORANGE);
colors.add(Color.LIGHT_GRAY);
colors.add(Color.YELLOW);
Color result = colors.stream().reduce((c1, c2) ->
distance(c1, testColor).compareTo(distance(c2, testColor)) < 0 ? c1 : c2
).get();
System.out.println(colors);
System.out.println(result);
}
Вывод:
[java.awt.Color[r=0,g=0,b=255], java.awt.Color[r=255,g=200,b=0], java.awt.Color[r=192,g=192,b=192], java.awt.Color[r=255,g=255,b=0]]
java.awt.Color[r=192,g=192,b=192]
Видно, что серый наиболее близок к светлосерому из имеющихся цветов.
