我已在下面的代碼段: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