2016-10-09 2 views
-2

Je dois écrire une fonction qui prend l'entrée RGB (0-255) et sort 5 valeurs pour piloter une LED RGBAW (puce intégrée qui a rouge LED individuelles, bleu, vert, ambre et blanc dans un module). La sortie de ma fonction doit être 5x 0-255. Ma langue préférée est C#, mais je peux probablement convertir à partir de n'importe quelle langue.Comment calculer RGB + A + W (Ambre + Blanc) à partir de RVB pour les LEDs

J'ai fondamentalement une entrée RVB (appelez-la Ri, Gi, Bi) chacun à 0-255. Les DEL sont supposées être étalonnées à la même intensité lumineuse. A partir de la sortie, je veux calculer quelle sortie je devrais avoir pour chacune des cinq LED (R, G, B, A, W).

Je veux m'assurer que la sortie de lumière n'est pas délavée avec du blanc lorsque par exemple 100% rouge (Ri = 255).

La fonction devrait ressembler à ceci:

public void CalculateRGBAW(byte ri, byte gi, byte bi, out byte r, out byte g, out byte b, out byte a, out byte w) 
{ 
    r = ri; 
    g = gi; 
    b = bi; 
    a = XXXXXXXXXXXXXXXXXXXXXXX; 
    w = XXXXXXXXXXXXXXXXXXXXXXX; 
} 

C'est le type de luminaire LED ce pilotera: MARQ Gamut PAR H7, le guide de l'utilisateur est lié là aussi (ce qui ne dit rien sur la façon dont ces sont calibrés, ce luminaire n'est pas haut de gamme donc c'est probablement pourquoi, je pense que nous devons juste supposer qu'ils sont calibrés en ce qui concerne cette question).

+0

S'il vous plaît laissez-moi savoir si les modifications que j'ai apportées a amélioré cette question, et si non, s'il vous plaît laissez-moi savoir ce que je peux fournir pour supprimer les votes vers le bas . Merci. – Haukman

Répondre

2

d'abord tout ce que vous devez calibrer votre LED s pour obtenir des coefficients de normalisation

  1. R, G, B

    si R=G=B la couleur de sortie doit être teinte de gris. Pour y parvenir, les coefficients d'échelle d'utilisation par exemple:

    R'=r*R 
    G'=g*G 
    B'=b*B 
    

    r,g,b sont des coefficients d'échelle et R,G,B sont vos valeurs d'entrée idéales. Les R',G',B' sont des valeurs envoyées à votre pilote LED. Cette équation suppose un comportement linéaire sinon le cas, vous devez changer l'équation par exemple polynôme comme:

    R'=r0 + r1*R + r2*R^2 + ... 
    

    Maintenant vous envoyer R'=G'=B'=10 et vérifiez la couleur claire. Si ce n'est pas en blanc, décrémentez la couleur qui dépasse le blanc. faites-le jusqu'à ce que vous obteniez la couleur blanc-ish. Procédez ainsi pour plus de valeurs de départ, telles que R'=G'=B'=10 , R'=G'=B'=20 , R'=G'=B'=30 , ..., et rappelez-vous les valeurs après avoir réglé le blanc. Par exemple

    R` G` B` beg 
    10 10 12 10 
    20 20 24 20 
    30 30 36 30 
    

    donc dans cet exemple, le LED bleu est pas aussi brillant que le R,G il besoin d'être mis à l'échelle.A partir de ces quelques points que vous pouvez estimer la dépendance est linéaire sans décalage si

    r=1 
    g=1 
    b=36/30=24/20=12/10=1.2 
    

    Vous avez besoin d'entiers de sorte que vous pouvez utiliser Arithmétique à virgule fixe comme

    b=(12*256)/10 = 307 
    B'=(B*b)/256 
    
  2. Blanc

    Vous avez besoin d'équilibre blanc à blanc. Dans l'idéal, vous trouverez des valeurs correspondant à W. et créer des fonctions

    Rw(W),Gw(W),Bw(W) 
    

    qui correspondront W avec RGBLED s. ce ne sera pas facile et peut-être une webcam avec un outil de sélection de pixel aidera (mais doit également être équilibré).

  3. Ambre

    De même, vous devez trouver

    Ra(A),Ga(A),Ba(A) 
    

    qui correspondent à A avec RGB LED. comme dans le # 2

mélange de couleurs

Après calibration, vous devriez avoir R,G,B,A,W valeurs linéarisé afin que vous pouvez utiliser sur eux Arithmétique. Donc, pour améliorer votre gamme dynamique, supposons que Ri,Gi,Bi sont vos valeurs de couleur d'entrée que vous voulez conduire. Voici quelques dépendances pour la LED s

  R G B 
White = (W/3,W/3,W/3) 
Amber = (A ,A/2,0 ) 

So White peut soulager toute la R,G,B

W = min(Ri,Gi,Bi)/3 
R = Ri-W 
G = Gi-W 
B = Bi-W 

Ambre peut soulager jusqu'à R,G afin de trouver A

A = R 
if (A>G*2) A=G*2 
R = Ri-A 
G = Gi-A/2 
B = Bi 

Et quand mettre tous ensemble

W = min(Ri,Gi,Bi)/3 
A = Ri-W 
if (A>(Gi-W)*2) A=(Gi-W)*2 
R = Ri-W-A 
G = Gi-W-A/2 
B = Bi-W 

Alors maintenant, vous pouvez utiliser Ri,Gi,Bi même au-dessus <0-255> (pour certaines couleurs) et ont encore R,G,B dans <0,255>. Vous pouvez également utiliser W comme luminosité et A comme balance jaune (chaleur)

+0

Une question, si j'ai 100% de rouge (Ri) par exemple, cela signifie que la formule ci-dessus ajoutera 33% de blanc, ce qui rendra la sortie plus rose. Y at-il une alternative pour que le blanc ne lave pas les couleurs? – Haukman

+1

@Haukman si vous avez 100% de rouge ce qui signifie 0% de vert et 0% de bleu si min (255,0,0) est 0 donc pas de blanc et pas de rose du tout – Spektre

+0

Oh, mon mauvais, j'ai raté la partie "min" , Je le vois maintenant, merci! – Haukman

0

Je ne peux pas tester, il en est ainsi juste une supposition, hors de ma tête:

w = min (r, g, b) 
a = min(r - w, g - w) 
r = r - w - a 
g = g - w - a 
b = b - w 

Attend un peu clair, bien que, peut-être w = w/3 et aussi a = a/2 ..? Vous aurez certainement besoin de syntoniser les couleurs réelles de LED.

+0

pas sûr de ce que pour le downvote est mais n'est pas ambre 'R = 2G, B = 0'? vous avez 'R = G, B = 0' à la place. Je peux me tromper Je viens de google couleur image ambre et utiliser outil de sélection de couleur ... (pas bon avec les noms de couleurs en anglais en dehors de la palette de spectre ZX :)) – Spektre

+0

L'ambre est une couleur jaune-orange. Color.Gold est la plus proche parmi les couleurs nommées. Donc, oui, une petite correction sera nécessaire; mais les nombres réels doivent être trouvés en regardant les LED réelles. – TaW

+0

Beaucoup de luminaires commerciaux ont ces puces RGBAW, je suis sûr qu'ils peuvent être étalonnés (et peuvent en avoir besoin), mais j'aimerais voir s'il y a une fonction générique que je peux implémenter qui sera mathématiquement correcte pour une puce LED idéale au moins. – Haukman