2010-10-26 15 views
3

J'ai un triplet (R, G, B), où chaque couleur est comprise entre 0,0 et 1,0. Étant donné un facteur F (0.0 signifie que la couleur d'origine et 1.0 signifie blanc), je veux calculer un nouveau triplet qui est la version «filigranée» de la couleur.Étant donné un triplet R, G, B et un facteur F, comment puis-je calculer une version «filigrane» de la couleur?

J'utilise l'expression suivante (pseudo-code):

for each c in R, G, B: 
    new_c ← c + F × (1 - c) 

Ce produit quelque chose qui ressemble peu près correct, mais je comprends cela présente des écarts à la teinte de la couleur (vérifier l'équivalent HSV avant et après la transformation), et je ne sais pas si cela est à prévoir.

Existe-t-il un algorithme "standard" (avec ou sans guillemets) pour calculer la version "tatouée" de la couleur? Si oui, lequel est-ce? Si non, quels autres algorithmes pour le même effet pouvez-vous me dire?

Répondre

3

En fait, cela ressemble, il devrait donner la teinte correcte, moins de petites variations pour les erreurs d'arrondi arithmétiques.

Ceci est certainement un raisonnable, simple était d'obtenir un effet de filigrane. Je ne connais pas d'autres standards, il y a plusieurs façons de le faire.

Les alternatives sont:
Mélanger avec du blanc mais le faire de manière non linéaire sur F, par ex. new_c = c + sqrt(F)*(1-c), ou vous pourriez utiliser d'autres fonctions non linéaires - cela pourrait aider le filigrane à paraître plus ou moins "plat".

Vous pouvez le faire de manière plus efficace en procédant comme suit (où F prend la 0..INF gamme):

new_c = 1 - (1-c)/pow(2, F) 

pour les valeurs de pixel réel (0..255) ceci convertir en:

new_c = 255 - (255-c)>>F 

Non seulement cela est raisonnablement rapide en arithmétique entière, mais vous pouvez le faire dans un entier 32b en parallèle.

+0

Savez-vous: mon algorithme est-il le même que le blanc mélangé avec l'opacité F sur la couleur initiale? Parce que ce serait une alternative, mais je pense que c'est la même chose. Quoi qu'il en soit, si vous connaissez d'autres façons de le faire, veuillez mettre à jour votre réponse. Je vous remercie. – tzot

+0

Oui, votre chemin est le même que le mélange de blanc avec l'opacité F, exactement à droite. – andrewmu

0

Pourquoi pas juste?

new_c = F*c 

Je pense que vous devriez aller d'abord sur les pixels watermarking et savoir si elle devrait être plus foncée ou plus claire.

Pour la formule plus légère peut être new_c = 1-F * (c-1)

+1

Cela ne donne pas de blanc pour F = 1.0 – andrewmu

+0

Il fait pour F = 0.0, la première formule est pour devenir plus sombre et la seconde pour obtenir plus léger –

+0

F == 0.0 produit du blanc dans la deuxième formule (qui est l'inverse de mon sauf pour ce 'c-1' qui devrait être' 1-c'), mais je suis sûr qu'il n'y a pas de F qui produise du blanc dans la première formule pour tous les triplets possibles. Et de toute façon, j'étais spécifique: 0.0 couleur originale, 1.0 blanc. Merci quand même. – tzot