[PHP]HSV(HSB)をRGBに変換する

以前 RGB を HSV に変換するプログラムを作りましたが、 今回はその逆で、HSV を RGB に変換してみます。

function hsv2rgb($h, $s, $v){
	if ( $s == 0 ) {
		$r = $v * 255;
		$g = $v * 255;
		$b = $v * 255;
	} else {
		$h = ($h >= 0) ? $h % 360 / 360 : $h % 360 / 360 + 1;
		$var_h = $h * 6;
		$i = (int)$var_h;
		$f = $var_h - $i;
		
		$p = $v * ( 1 - $s );
		$q = $v * ( 1 - $s * $f );
		$t = $v * ( 1 - $s * ( 1 - $f ) );
		
		switch($i){
			case 0:
				$var_r = $v;
				$var_g = $t;
				$var_b = $p;
				break;
			case 1:
				$var_r = $q;
				$var_g = $v;
				$var_b = $p;
				break;
			case 2:
				$var_r = $p;
				$var_g = $v;
				$var_b = $t;
				break;
			case 3:
				$var_r = $p;
				$var_g = $q;
				$var_b = $v;
				break;
			case 4:
				$var_r = $t;
				$var_g = $p;
				$var_b = $v;
				break;
			default:
				$var_r = $v;
				$var_g = $p;
				$var_b = $q;
		}
		$r = $var_r * 255;
		$g = $var_g * 255;
		$b = $var_b * 255;	
	}
	return array($r, $g, $b);
}

引数は色相、彩度、明度の順で渡します。
色相(H)は 0 ~ 360 を指定し、彩度(S)・明度(V)は 0 ~ 1 の小数で指定します。
結果は RGB 値( 0 ~ 255 )の配列で返されます。

参考: HSV色空間 – Wikipedia

[PHP]RGBをHSV(HSB)に変換する

前回RGB値を元に類似画像を検索しましたが、やはり人間の感覚で言うとHSVを使って画像を検索したほうがより近い画像を得られると考え、下準備として RGB を HSV に変換するプログラムを作りました。

<?php
//RGB値(0~255)
$rgb = array(
  "red" => 167,
  "green" => 65,
  "blue" => 189
);

$hsv = rgb2hsv($rgb);
print_r($hsv);

function rgb2hsv($rgb){
  $r = $rgb['red'] / 255;
  $g = $rgb['green'] / 255;
  $b = $rgb['blue'] / 255;
  
  $max = max($r, $g, $b);
  $min = min($r, $g, $b);
  $v = $max;
  
  if($max === $min){
    $h = 0;
  } else if($r === $max){
    $h = 60 * ( ($g - $b) / ($max - $min) ) + 0;
  } else if($g === $max){
    $h = 60 * ( ($b - $r) / ($max - $min) ) + 120;
  } else {
    $h = 60 * ( ($r - $g) / ($max - $min) ) + 240;
  }
  if($h < 0) $h = $h + 360;

  $s = ($v != 0) ? ($max - $min) / $max : 0;
  
  $hsv = array("h" => $h, "s" => $s, "v" => $v);
  return $hsv;
}

逆にHSVからRGBを割り出す場合はこちらを御覧下さい。

計算式は Wikipedia を参考にしています。