Quelles sont les gammes de coordonnées dans l'espace couleur CIELAB?
J'ai le morceau de code suivant:
public List<Tuple<double, double, double>> GetNormalizedPixels(Bitmap image)
{
System.Drawing.Imaging.BitmapData data = image.LockBits(
new Rectangle(0, 0, image.Width, image.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly,
image.PixelFormat);
int pixelSize = Image.GetPixelFormatSize(image.PixelFormat) / 8;
var result = new List<Tuple<double, double, double>>();
unsafe
{
for (int y = 0; y < data.Height; ++y)
{
byte* row = (byte*)data.Scan0 + (y * data.Stride);
for (int x = 0; x < data.Width; ++x)
{
Color c = Color.FromArgb(
row[x * pixelSize + 3],
row[x * pixelSize + 2],
row[x * pixelSize + 1],
row[x * pixelSize]);
//(*)
result.Add(Tuple.Create(
1.0 * c.R / 255,
1.0 * c.G / 255,
1.0 * c.B / 255);
}
}
}
image.UnlockBits(data);
return result;
}
La clé de fragment (*) est-ce:
result.Add(Tuple.Create(
1.0 * c.R / 255,
1.0 * c.G / 255,
1.0 * c.B / 255);
qui ajoute un pixel avec ses composants de mise à l'échelle pour la gamme [0, 1]
encore être utilisé dans la classification des tâches avec différents classificateurs. Certains d'entre eux exigent les attributs pour être normalisée comme cela, d'autres ne se soucient pas d'où cette fonction.
Cependant, que dois-je faire lorsque je voudrais classer les pixels d'une couleur différente de l'espace que RGB
, comme L*a*b*
? Tandis que les valeurs de toutes les coordonnées dans RGB
l'espace de couleurs de l'automne dans la gamme [0,256)
dans L*a*b*
espace de couleurs a*
et b*
sont dit être sans bornes.
Donc, lors de la modification du fragment ( * ):
Lab lab = c.ToLab();
result.Add(Tuple.Create(
1.0 * lab.L / 100,
1.0 * lab.A / ?,
1.0 * lab.B / ?);
(ToLab
est une extension de la méthode, mise en œuvre en utilisant des algorithmes de ici)
que dois-je mettre pour les points d'interrogation?
OriginalL'auteur BartoszKP | 2013-09-30
Vous devez vous connecter pour publier un commentaire.
En pratique, le nombre de tous les possibles
RGB
couleurs est limité, de sorte que laL*a*b*
l'espace est limité. Il est facile de trouver les gammes de coordonnées avec le programme simple suivant:(ou similaire) à l'aide de toute autre langue.
Donc,
CIELAB
l'espace de coordonner les plages sont comme suit:et la réponse est:
Point très intéressant. Je dirais que cela fonctionne pour n'importe quelle version concrète de RVB, mais je ne suis pas sûr. Ici, le contexte est défini comme GDI+, et dans toute autre langue que cette langue est une bibliothèque graphique.
FWIW L'espace CIELAB comprend 'imaginaire' des couleurs par le design: en.wikipedia.org/wiki/Lab_color_space
Je voulais juste ajouter que peut-être l'aide d'maxA.ToString("R") au lieu de simplement maxA vous donnera plus de détail (mais peut-être pas plus précis) résultat. Dans ma petite expérience avec Lunb* couleurs (à l'aide .NET), j'ai trouvé allers-retours les valeurs RVB->Lunb*->RVB ne fonctionne pas toujours dues à des erreurs de calcul à virgule flottante. Mon code jette sur les valeurs hors de la plage, donc j'ai dû modifier les valeurs de la matrice très légèrement à partir de easyrgb.com. Mes résultats se sont révélés être: L dans [0, 100] dans [-86.188001161251748, 98.249414905267] B [-107.85362559736171, 94.487327241851375]
Pourquoi la plupart des réponses utilisez différentes limites? Par exemple, Adobe utilise -128-127 pour A et B, c'est ici 184, et d'autres endroits où j'ai remarqué qu'il varie. A-t-elle quelque chose à voir avec les profils de couleur ou est-ce est une forme particulière de LABORATOIRE?
OriginalL'auteur BartoszKP
Normalement, les valeurs suivantes, parce que c'est la sortie standard de la commune de la couleur des algorithmes de conversion:
L* axe (légèreté) varie de 0 à 100
a* et b* (attributs de couleur) de l'axe vont de -128 à +127
Plus d'informations peuvent être trouvées ici.
OriginalL'auteur bortizj
Si le Laboratoire de conversion de code est mis en œuvre en accord avec le Laboratoire-les couleurs de la définition (voir, par exemple Espace couleur Lab), alors la fonction
f(...)
, qui est utilisé pour définirL
,a
etb
changements dans les [4/29,1], theforeCertaines personnes (comme bortizj dans sa réponse) normaliser ces valeurs de gamme, dont un octet variable peut contenir. Donc, vous avez à analyser le code afin de déterminer quelle est la portée de ce produit. Mais encore une fois, les formules dans le Wiki vous donnera la gamme au-dessus. La même gamme vous donnera le code ici
OriginalL'auteur John Smith