Tôi có đoạn mã sau:Phạm vi tọa độ trong không gian màu CIELAB là gì?
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;
}
Đoạn quan trọng (*) là thế này:
result.Add(Tuple.Create(
1.0 * c.R/255,
1.0 * c.G/255,
1.0 * c.B/255);
có thêm một pixel với thành phần của nó thu nhỏ lại để dao động [0, 1]
để được tiếp tục sử dụng trong phân loại nhiệm vụ với các trình phân loại khác nhau. Một số người trong số họ yêu cầu các thuộc tính được bình thường hóa như thế này, những người khác không quan tâm - do đó chức năng này.
Tuy nhiên, tôi nên làm gì khi tôi muốn phân loại pixel trong một không gian màu khác với RGB
, như L*a*b*
? Trong khi giá trị của tất cả các tọa độ trong không gian màu RGB
rơi vào khoảng [0,256)
trong L*a*b*
không gian màu a*
và b*
được cho là không bị chặn.
Vì vậy, khi thay đổi phần phân đoạn (*) tới:
Lab lab = c.ToLab();
result.Add(Tuple.Create(
1.0 * lab.L/100,
1.0 * lab.A/?,
1.0 * lab.B/?);
(ToLab
là một phương pháp mở rộng, triển khai sử dụng các thuật toán thích hợp từ here)
những gì tôi nên đặt cho dấu hỏi?
Câu hỏi thú vị. Hãy nhớ rằng câu trả lời phụ thuộc vào lựa chọn rgb và màu trắng tham chiếu. Phương pháp tiếp cận vũ lực do BartoszKP đề xuất phụ thuộc vào các yếu tố này và có thể cần phải chạy lại tùy theo nền tảng. – SeF