Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Augusto

RGB para HSI e HSI para RGB...

Recommended Posts

Ah! Pelo amor de Deus! Ninguém merece.

 

Quem foi o desalmado que inventou essas fórmulas de conversão? Cruzes! Será que alguém me ajuda? Cada site fala uma coisa, uma fórmula diferente e sempre em outras linguagens que pra mim é grego cruzado com chinês.

 

Tem uma que parece mais "sensata", sem dizer que é a melhor, já que não entendo lhufas.

 

Como não sei se tudo da fórmula vai aparecer aqui no fórum, vou linkar o PDF que encontrei. Ele já estava sem créditos quando encontrei, então, não sei de quem é.

 

Fórmulas

 

Tem até exemplo de ida (RGB -> HSI) e de volta (HSI -> RGB), mas eu não consigo reproduzir o algoritimo para que pelo menos batam os valores comosdo exemplo.

 

P.S.: Quando (e se) virem o PDF, alguém pode me dizer o que diabos é cosseno elevado a menos 1?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno, se o que você quer é o que eu acho que você quer, então você definitivamente procura nas fontes erradas:

 

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://pt.wikipedia.org/wiki/HSV

 

RGB => HSV:

 

 

Imagem Postada

 

Imagem Postada

 

Imagem Postada

 

HSV => RGB

 

Imagem Postada

Imagem Postada

Imagem Postada

Imagem Postada

Imagem Postada

 

Imagem Postada

http://upload.wikimedia.org/math/f/c/6/fc6f0d75b7aec7c12b3c2b9619ce5e46.png

http://upload.wikimedia.org/math/f/3/7/f37aeb26bdde1af310a45fc5016bf892.png

http://upload.wikimedia.org/math/5/4/7/5476d5e46fa5f95728ecf06b379e7ddb.png

http://upload.wikimedia.org/math/2/b/6/2b6df392b0ba1fb551174324da7ad250.png

http://upload.wikimedia.org/math/e/d/2/ed2cf15425f023f7a68c9a98fb55a183.png

 

Em PHP:

 

RGB.php

<?php
class RGB {
private $r = 0;
private $g = 0;
private $b = 0;

public function __construct( $r , $g , $b ){
	$this->r = (int) $r;
	$this->g = (int) $g;
	$this->b = (int) $b;
}

public function __toString(){
	return sprintf( '#%02X%02X%02X' , $this->r , $this->g , $this->b );
}

public static function createFromHexa( $rgb ){
	if ( $rgb[ 1 ] == '#' ) $rgb = substr( $rgb , 1 );

	if ( isset( $rgb[ 5 ] ) ){
		$parts = str_split( $rgb , 2 );

		$r = hexdec( $parts[ 0 ] );
		$g = hexdec( $parts[ 1 ] );
		$b = hexdec( $parts[ 2 ] );

		return new RGB( $r , $g , $b );
	}
}

public function getRed(){
	return $this->r;
}

public function getGreen(){
	return $this->g;
}

public function getBlue(){
	return $this->b;
}

public function toHSV(){
	$r = ( $this->r * 100 / 0xff ) / 100;
	$g = ( $this->g * 100 / 0xff ) / 100;
	$b = ( $this->b * 100 / 0xff ) / 100;

	$max = max( array( $r , $g , $b ) );
	$min = min( array( $r , $g , $b ) );

	if ( $max - $min > 0 ){
		if ( $max == $r ){
			if ( $g >= $b ){
				$h = 60 * ( ( $g - $b ) / ( $max - $min ) );
			} else {
				$h = 60 * ( ( $g - $b ) / ( $max - $min ) ) + 360;
			}
		} elseif ( $max == $g ){
			$h = 60 * ( ( $b - $r ) / ( $max - $min ) ) + 120;
		} else {
			$h = 60 * ( ( $r - $g ) / ( $max - $min ) ) + 240;
		}

		$s = ( $max - $min ) / $max;
	} else {
		$h = 0;
		$s = 0;
	}

	$v = $max;

	return new HSV( $h , $s , $v );
}
}

 

HSV.php

<?php
class HSV {
private $h = 0;
private $s = 0;
private $v = 0;

public function __construct( $h , $s , $v ){
	$this->h = $h;
	$this->s = $s;
	$this->v = $v;
}

public function getHue(){
	return $this->h;
}

public function getSaturation(){
	return $this->s * 0xff;
}

public function getValue(){
	return $this->v * 0xff;
}

public function toRGB(){
	$h = $this->h;
	$s = $this->s;
	$v = $this->v;

	if ( $s == 0 ){
		$r = $v;
		$g = $v;
		$b = $v;
	} else {
		$Hi = ( $h / 60 ) % 6;
		$f = ( $h / 60 ) - $Hi;
		$p = $v * ( 1 - $s );
		$q = $v * ( 1 - ( $f * $s ) );
		$t = $v * ( 1 - ( 1 - $f ) * $s );

		switch ( $Hi ){
			case 0 : $r = $v; $g = $t; $b = $p; break;
			case 1 : $r = $q; $g = $v; $b = $p; break;
			case 2 : $r = $p; $g = $v; $b = $t; break;
			case 3 : $r = $p; $g = $q; $b = $v; break;
			case 4 : $r = $t; $g = $p; $b = $v; break;
			case 5 : $r = $v; $g = $p; $b = $q; break;
		}
	}

	return new RGB( $r * 0xff , $g * 0xff , $b * 0xff );
}
}

 

Usando:

<?php
$rgb = new RGB( 170 , 48 , 255 );

echo $rgb , PHP_EOL;

$hsv = $rgb->toHSV();

var_dump( $hsv->getHue() , $hsv->getSaturation() , $hsv->getValue() );

echo $hsv->toRGB();

 

Saída:

#AA30FF
float(275.36231884058)
float(207)
int(255)
#AA30FF

Bruno, já viu http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://forum.imasters.com.br/index.php?/topic/408602-buscar-array/page__view__findpost__p__1610764 Demorei mas respondi.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, eu já havia encontrado RGB -> HSV e até mesmo recriado os algoritimos em PHP, mas andei lendo um trabalho de uns alunos de Ciências da Computação de Santa Catarina (e confirmei depois, com outras fontes estrangeiras) onde dizia que o Espaço de Cor mais adequado para tarefa de identificação de cores (que é bem isso que estou fazendo) seria o HSI

 

Nas pouquíssimas fontes que encontrei sobre a comparação HSB / HSV e HSI, pude comprovar que existem pequenas diferenças, tanto conceituais como de resultados entre esse terceiro "canal", digamos assim" em algumas tonalidades de cor.

 

O H (Hue) é sempre de 0 à 360 graus.

 

O S (Saturation) é sempre de 0 à 100% OU de 0 à 1, variando de 0.001

 

Daí é que vem as diferenças entre B (Brightness), V (Value) e I (Intensity)

 

Nesse trabalho desses alunos que encontrei, tem uma tabela com os intervalos para cada "canal" HSI. Quando transcrevi o algoritimo HSV e fui comparar (aleatoriamente) nesses intervalos, vez ou outra eu obtinha informações que não combinavam, como por exemplo, um tom de cor que visualmente é cinza, mas que algoritmicamente falando era uma mistura de cinza com ciano (chamado de Cyanish Gray).

 

Obviamente para o que eu estou fazendo HOJE isso não seria problema, pois bastaria entrar em contato com designer do projeto e pedir que tomasse cuidado com a escolha de cores, para que não fossem usadas cores visualmente dúbias.

 

Mas quem dirá que,num futuro próximo ou não, tal adapatação, nesse projeto ou em outro, possa ser possível?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.