я следующий кусок кода:Каковы диапазоны координат в цветовом пространстве 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;
}
Ключевой фрагмент (*) это:
result.Add(Tuple.Create(
1.0 * c.R/255,
1.0 * c.G/255,
1.0 * c.B/255);
который добавляет пиксель с его компонентами масштабируется в диапазоне [0, 1]
для дальнейшего использования в классификации задачи с разными классификаторами. Некоторые из них требуют, чтобы атрибуты были нормализованы таким образом, другим это не волнует - отсюда и эта функция.
Однако, что мне делать, если я хотел бы классифицировать пиксели в другом цветовом пространстве, чем RGB
, например L*a*b*
? Хотя значения всех координат в цветовом пространстве RGB
попадают в диапазон [0,256)
в L*a*b*
Цветовое пространство a*
и b*
считаются неограниченными.
Так, при изменении фрагмента (*) для:
Lab lab = c.ToLab();
result.Add(Tuple.Create(
1.0 * lab.L/100,
1.0 * lab.A/?,
1.0 * lab.B/?);
(ToLab
является метод расширения, реализованный с использованием соответствующих алгоритмов из here)
, что я должен поставить на знак вопроса?
Интересный вопрос. Имейте в виду, что ответ зависит от выбора rgb и контрольного белого. Подход, основанный на грубой силе, предложенный BartoszKP, зависит от этих факторов и может потребоваться повторное использование в зависимости от платформы. – SeF