RGB to HSV PHP optimized

Дата Автор cdb2 комментария

Изобретал тут велосипед с определением цветов на картинке и потребовалось для работы конвертировать 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 сек.

Если вам понравилась моя статья, пожалуйста, не поленитесь кликнуть любую кнопочку ниже, или кинуть ссылку на статью в свой блог или форум. Всегда рад ответить на ваши вопросы в комментариях. Спасибо 🙂

2 комментария на «RGB to HSV PHP optimized»

  1. 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.

  2. как и на просторах интернета, так и у вас h обрабатывается частично верно, частично нет. Не те данные и порой отрицательные.

Добавить комментарий

Ваш адрес email не будет опубликован.