2011-05-05 2 views
0

J'écris un programme en C++, le programme consistait à ouvrir une image et à déplacer le curseur autour de l'image pour lire la température sous le curseur. L'image a 14 patches de couleurs différentes et je peux lire la couleur et la convertir en température. La prochaine chose que je dois faire est de produire une méthode qui peut visualiser la température avec plus de résolution, c'est-à-dire avec plus de 14 patchs de couleur. Puis dessinez le nouveau patch de couleur au bas de l'interface graphique sur un panneau pour vérifier si je peux différencier visuellement les couleurs pour différentes températures dans la gamme de 300K à 30000K.Conversion de RGB en HSL pour une résolution plus élevée C++

Je ne suis pas sûr sur la façon d'effectuer cette dernière partie. Je pense que cela a quelque chose à voir avec la conversion des valeurs RVB en HSL, mais je ne vois pas comment cela pourrait me donner 28 patchs de couleur.

Toute aide serait appréciée.

Merci

+0

Si vous impliquez HSL, c'est plus pour améliorer les effets de la lerp que vous pouvez utiliser (ne le fait pas tout seul, exactement). – ssube

Répondre

1

Je ne suis pas sûr que je comprends exactement ce que vous voulez faire, mais il semble un peu comme vous cherchez un algorithme interpoler pour agrandir l'image essentiellement, de combler les lacunes avec des valeurs en dehors les 14 couleurs de l'original.

Il existe une myriade de tels algorithmes, mais un simple bicubic interpolation devrait suffire.

2

La conversion de RGB en HSV est une étape de fantaisie que vous pouvez essayer plus tard. Je suppose que vous voulez rendre ce qui ressemble à un dégradé de couleurs en continu:

enter image description here

Ai-je raison? Si vous avez besoin de rendre des centaines de couleurs, mais que vous n'avez que 14 couleurs à portée de main, vous devrez mélanger les couleurs adjacentes, ce qui s'appelle "interpolation".

Nous allons essayer une "interpolation linéaire" parce que c'est simple. Vous pouvez essayer une "interpolation bicubique" plus tard.

Supposons que vous êtes sur le point de rendre l'une des lignes verticales monochromes du dégradé ci-dessus. Vous devez d'abord déterminer de quelle couleur il est censé être. Disons que la position horizontale de la ligne verticale peut être comprise entre 0 et 99.

Ensuite, vous devez trouver les deux de vos 14 couleurs pour mélanger entre:

float x = horizontal_position * 13.f/99.f; 
int a = floorf(x); 
int b = std::min(13, a + 1); 

Maintenant, vous devez mélanger entre les deux couleurs pour trouver la couleur de la ligne verticale:

float blend = x - a; 
color result = palette[a] * (1-blend) + palette[b] * blend; 

« couleur » dans le pseudocode ci-dessus peut être RVB, YUV, HSV, etc. Cette partie est à vous. Gardez à l'esprit que le HSV est un "espace colorimétrique non linéaire" et que le mélange linéaire de deux couleurs HSV peut donc produire des résultats inattendus.

+0

Est-ce que c'est juste moi ou est-ce que les guillemets se sentent un peu "condescendants"? =) – manneorama

+1

C'est un appel difficile à faire quand vous écrivez à un public mixte. Pas de citations, et le jargon va lire comme gobbledygook à des gens qui ne comprennent pas encore. Trop de citations et vous ressemblez à Dr. Evil à des gens qui comprennent déjà: http://www.youtube.com/watch?v=tqos3j07jzc – bmcnett

Questions connexes