我有以下代码:
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
是一种扩展方法,使用适当的算法从这里实现)
问号应该填什么?