Получение цветов из изображения, которые являются наиболее визуально выдающимися с PHP - PullRequest
1 голос
/ 03 ноября 2010

Вопрос: Можно ли получить значение яркости цветов в php?

Что я пытаюсь сделать, это получить наиболее "визуально заметные" цвета из изображения с помощью PHP,Я прошел через все переполнение стека и не смог найти никакого решения.

В настоящее время я построил поиск цветов по изображениям, который проходит через каждый пиксель изображения, сохраняет цвета,вычисляет цветовые различия и значение яркости, а затем сохраняет их в базе данных.

Проблема: Результаты математически правильны, однако они не являются визуально точными по отношению к изображению, из которого ранее были сопоставлены цвета,Я предположил, что какое-то сравнение яркости может решить эту проблему.

Я заметил, что когда я упорядочиваю результаты по возрастанию (сначала низший), результаты на самом деле более точные (хотя в некоторых случаях они не так точны).Это означает, что значения вхождения цвета намного ниже, чем при заказе DESC (сначала самое высокое).

Чтобы вычислить «яркость», я использую это - я не думаю, что оно настолько мощное:

function luminance($pixel){

   $pixel = sprintf('%06x',$pixel);
   $red = hexdec(substr($pixel,0,2))*0.30;
   $green = hexdec(substr($pixel,2,2))*0.59;
   $blue = hexdec(substr($pixel,4))*0.11;

   return $red+$green+$blue;
}

Вот один сценарий, который показывает проблему: http://twitpic.com/33e23p http://twitpic.com/33e3x0

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

function colorDistance(array $color1, array $color2) {
  return sqrt(pow($color1[0] - $color2[0], 2) +
    pow($color1[1] - $color2[1], 2) +
    pow($color1[2] - $color2[2], 2));
}

1 Ответ

1 голос
/ 03 ноября 2010

Поскольку ваше цветовое пространство стандартное RGB , в статье Википедии Яркость (относительная) говорится, что ваши множители для R, G и B должны быть

  • R: 0,21
  • G: 0,72
  • B: 0,07

вместо того, что у вас есть. Так

function luminance($pixel){

   $pixel = sprintf('%06x',$pixel);
   $red = hexdec(substr($pixel,0,2))*0.21;
   $green = hexdec(substr($pixel,2,2))*0.72;
   $blue = hexdec(substr($pixel,4))*0.07;

   return $red+$green+$blue;
}
...