par chstez » 12 Déc 2012, 18:54
Bonjour,
Pour ceux que ça intéresse et pour clore cette discussion je donne la méthode que j'ai trouvée pour résoudre mon problème . Il y en a certainement d'autres.
Rappel :
En RGB, soit une couleur cible T(t1, t2, t3) et 4 autres :
A(a1, a2, a3); B(b1, b2, b3); le blanc W(255, 255, 255) et le noir N(0, 0, 0) dont les présences sont obligatoires.
Trouver les 4 coefficients x1, x2, x3, x4 pour que le mélange M(m1, m2, m3) =
x1*A, x2*B, x3*W, x4*N soit au plus proche de T(t1, t2, t3).
Finalement la méthode d'optimisation itérative de Newton par minimisation et sous contraintes fonctionne parfaitement. (la variante Levenberg-Marquardt serait plus directe, donc plus rapide mais vu la taille du nombre de variables, il faudrait un chronomètre au 1/10000 de seconde pour voir la différence, donc...)
Système d'optimisation :
Mini z=(t1-m1)²+(t2-m2)²+(t3-m3)²
m1=(x1*a1+x2*b1+x3*255+0)/(x1+x2+x3+x4)
m2=(x1*a2+x2*b2+x3*255+0)/(x1+x2+x3+x4)
m3=(x1*a3+x2*b3+x3*255+0)/(x1+x2+x3+x4)
Contrainte
x1+x2+x3+x4 =1
De cette façon, bien que les octets du noir soient nuls, la quantité virtuelle (ici x4) est bien prise en compte et noircit la teinte à l'écran.
Pour alléger le code de l'algorithme de recherche, il me reste à trouver une méthode pour sélectionner les meilleures couleurs candidates aux mélanges (A et B) parmi toutes celles de ma palette. Pour ça j'ouvre une nouvelle discussion.
Merci à fatal_error pour ses conseils éclairés.