Изобретал тут велосипед с определением цветов на картинке и потребовалось для работы конвертировать RGB в HSV. Нашел всем известный алгоритм:
function RGB_TO_HSV ($R, $G, $B) // RGB Values:Number 0-255
{ // HSV Results:Number 0-1
$HSL = array();
$var_R = ($R / 255);
$var_G = ($G / 255);
$var_B = ($B / 255);
$var_Min = min($var_R, $var_G, $var_B);
$var_Max = max($var_R, $var_G, $var_B);
$del_Max = $var_Max - $var_Min;
$V = $var_Max;
if ($del_Max == 0)
{
$H = 0;
$S = 0;
}
else
{
$S = $del_Max / $var_Max;
$del_R = ( ( ( $max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_G = ( ( ( $max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_B = ( ( ( $max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
if ($var_R == $var_Max) $H = $del_B - $del_G;
else if ($var_G == $var_Max) $H = ( 1 / 3 ) + $del_R - $del_B;
else if ($var_B == $var_Max) $H = ( 2 / 3 ) + $del_G - $del_R;
if (H<0) $H++;
if (H>1) $H--;
}
$HSL['H'] = $H;
$HSL['S'] = $S;
$HSL['V'] = $V;
return $HSL;
}
Но работал он довольно медленно, а так же выдавал полученные значения в диапазоне [0,1]. Мне потребовалось его немного ускорить, вот что из этого получилось:
function rgb2hsv($r, $g, $b)
{
$max = max($r, $g, $b);
$min = min($r, $g, $b);
$hsv = array('v' => $max / 2.55, 's' => (!$max) ? 0 : (1 - ($min / $max)) * 100, 'h' => 0);
$dmax = $max - $min;
if (!$dmax) return $hsv;
if ($max == $r)
{
if ($g < $b)
{
$hsv['h'] = ($g - $b) * 60;
} elseif ($g == $b)
{
$hsv['h'] = 360;
} else
{
$hsv['h'] = ((($g - $b) / $dmax) * 60) + 360;
}
} elseif ($max == $g)
{
$hsv['h'] = ((($b - $r) / $dmax) * 60) + 120;
} else
{
$hsv['h'] = ((($r - $g) / $dmax) * 60) + 240;
}
return $hsv;
}
Полученная функция работает в 2 раза быстрее и выдает значения в диапазоне 0-100 для яркости и насыщенности, а так же 0-360 для цветового тона (на манер Photoshop). Алгоритм взят с Wikipedia.org
Сравнение времени работы на 100000 случайных точек:
Старая реализация :2.1451 сек.
Новая реализация :0.9526 сек.
Если вам понравилась моя статья, пожалуйста, не поленитесь кликнуть любую кнопочку ниже, или кинуть ссылку на статью в свой блог или форум. Всегда рад ответить на ваши вопросы в комментариях. Спасибо 🙂
Happy to view this website works well in this little iPhone , every thing I wish to perform can be useful. Thank you for maintaining up to date while using most up-to-date.
как и на просторах интернета, так и у вас h обрабатывается частично верно, частично нет. Не те данные и порой отрицательные.