Сравнить цвет пикселей - Java - PullRequest
       32

Сравнить цвет пикселей - Java

2 голосов
/ 21 февраля 2011

Как я могу найти похожие цветные пиксели, используя цветные объекты?Я знаю, чтобы увидеть, равны ли два цвета, вы можете использовать:

a.equals (b);

, где a и b - цветовые объекты, но что, если я хочу найти похожие оттенкисиний например?

Ответы [ 3 ]

4 голосов
/ 21 февраля 2011

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

Color mutateColor(int range){
  int r = a.getRed() + (int)(Math.random() * 2 * range - range);
  r = Math.min(255, Math.max(0, r));

  int g = a.getGreen() + (int)(Math.random() * 2 * range - range);
  g = Math.min(255, Math.max(0, g));

  int b = a.getBlue() + (int)(Math.random() * 2 * range - range);
  b = Math.min(255, Math.max(0, b));

  return new Color(r, g, b);
}

Это самый простой пример, задается диапазон, и каждый канал смещается на тот же диапазон, что приводит к чему-то вроде этого:

a few randomly colored boxes

Это было сделано со значением диапазона 10. Для дополнительного контроля вы можете добавить три аргумента в функцию mutateColor (смещения для каждого отдельного канала). Вы также можете взять один диапазон, но изменить его на основе значений, уже имеющихся в канале. Например:

range = 0.25
red = 100
green = 10
blue = 0

redRange = 100 + rand(-25, 25)
greenRange = 10 + rand(-2.5, 2.5);
etc...

Это только одна из многих других возможностей.

Если вы хотели сравнить два цвета с допуском, я перенес код из ссылки Фредли, и он отлично работает для получения разницы между двумя цветами:

double colorDist(Color e1, Color e2){
  long rmean = ( (long)e1.getRed() + (long)e2.getRed() ) / 2;
  long r = (long)e1.getRed() - (long)e2.getRed();
  long g = (long)e1.getGreen() - (long)e2.getGreen();
  long b = (long)e1.getBlue() - (long)e2.getBlue();
  return Math.sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
4 голосов
/ 21 февраля 2011

Сравнение цветов не является тривиальной проблемой , существует множество различных метрик. Я не могу найти библиотеку (легко), которая делает это, но если у вас есть тщательный поиск, я уверен, что там что-то будет Посмотрите на этот класс . А пока читай!

1 голос
/ 21 февраля 2011

что, если я хочу найти похожие оттенки синего, например?

Я понятия не имею, что могло бы означать техническое определение для этого. Однако вы можете использовать HSL Color , чтобы создать собственное определение.

В принципе, я думаю, вы могли бы начать с того, чтобы убедиться, что оттенок каждого цвета равен +/- фиксированному числу градусов. Затем вы можете сузить его, проверив, находятся ли насыщенность и / или светимость в пределах вашего желаемого диапазона.

...