Ho il seguente pezzo di codice:Quali sono gli intervalli di coordinate nello spazio colore CIELAB?
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;
}
Il frammento chiave (*) è questo:
result.Add(Tuple.Create(
1.0 * c.R/255,
1.0 * c.G/255,
1.0 * c.B/255);
che aggiunge un pixel con i suoi componenti scalati alla gamma [0, 1]
essere ulteriormente utilizzati nella classificazione attività con classificatori diversi. Alcuni richiedono che gli attributi siano normalizzati in questo modo, altri non si preoccupano, quindi questa funzione.
Tuttavia, che cosa devo fare quando mi piacerebbe classificare i pixel in uno spazio colore diverso rispetto RGB
, come L*a*b*
? Mentre i valori di tutte le coordinate nello spazio colore RGB
rientrano nell'intervallo [0,256)
nello spazio colore L*a*b*
a*
e b*
si dice che siano illimitati.
Così quando si cambia il frammento (*) a:
Lab lab = c.ToLab();
result.Add(Tuple.Create(
1.0 * lab.L/100,
1.0 * lab.A/?,
1.0 * lab.B/?);
(ToLab
è un metodo di estensione, implementato utilizzando algoritmi appropriati dalla here)
cosa devo mettere i punti interrogativi?
Interessante domanda. Ricorda che la risposta dipende dalla scelta rgb e dal bianco di riferimento. L'approccio della forza bruta proposto da BartoszKP dipende da questi fattori e potrebbe dover essere rieseguito a seconda della piattaforma. – SeF