Iは、次のコードを持っている: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;
}
キー断片(*)は、このです:
さらに分類に使用する[0, 1]
の範囲にスケーリングされ、その構成要素の画素を加算
result.Add(Tuple.Create(
1.0 * c.R/255,
1.0 * c.G/255,
1.0 * c.B/255);
異なる分類子を持つタスク。それらのうちのいくつかは、このように属性を正規化する必要があり、他の人は気にしません - したがって、この関数です。
L*a*b*
のように、異なる色空間のピクセルをRGB
よりも分類したい場合はどうすればよいですか? 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