2012-06-21 34 views
5

Tôi có 4 màu mà tôi đã chuyển đổi từ RGB sang CIELAB Mô hình L * a * b *.Cách tính tổng hợp 4 màu được xác định trong mô hình CIELAB L * a * b *?

  1. Làm cách nào để tính tổng hợp 4 màu này khi tôi có (L,a,b) cho mỗi màu như vậy?

  2. Làm cách nào tôi có thể tính toán kết hợp tương tự, nếu tôi muốn đặt trọng số (w1, w2, w3, w4) trên 4 màu như vậy, có tối đa 1 và 0 tối thiểu (không) trọng lượng?

+4

Bạn mong đợi sự pha trộn này để sản xuất ra sao? Bạn có thể trung bình 4 màu với nhau theo từng thành phần, với trọng số và bạn sẽ nhận được các màu hợp lệ. Nhưng cho dù họ sẽ là những màu sắc bạn mong đợi hay không là khó để nói mà không có thêm thông tin. Bạn đã thử nhân lên từng cái theo trọng số tương ứng của họ rồi thêm chúng lại với nhau thành phần khôn ngoan và chia cho 4? Nếu điều đó không cung cấp cho bạn những gì bạn mong đợi, bạn có thể chính xác hơn về những gì bạn mong đợi không? Nếu bạn đăng ảnh, nó sẽ giúp ích. – user1118321

+4

Bạn vừa bao gồm một loạt các thẻ ngôn ngữ lập trình có hy vọng thu hút nhiều người xem tiềm năng nhất có thể không? – DavidO

+0

@DavidO - Tôi đã bao gồm những ngôn ngữ lập trình mà tôi làm việc trong hơn 10 năm. –

Trả lời

10

Giả sử bạn có một cấu trúc như thế này:

typedef struct LabColor { 
    uint8_t L; 
    uint8_t a; 
    uint8_t b; 
} LabColor; 

và một mảng của 4 trong số họ:

LabColor colors[4]; 
getMeSomeColors (colors); 

và trọng lượng:

float weights[4]; 
getMeSomeWeights (weights); 

Một pha trộn có thể phương pháp này sẽ là:

float LSum = 0.0; 
float aSum = 0.0; 
float bSum = 0.0; 
float weightSum = 0.0; 
for (int i = 0; i < 4; i++) 
{ 
    LSum += ((float)colors [ i ].L * weights [ i ]); 
    aSum += ((float)colors [ i ].a * weights [ i ]); 
    bSum += ((float)colors [ i ].b * weights [ i ]); 
    weightSum += weights[i]; 
} 
LabColor result; 
result.L = (uint8_t)(LSum/weightSum); 
result.a = (uint8_t)((aSum/weightSum) + 127); 
result.b = (uint8_t)((bSum/weightSum) + 127); 

Giả thiết trọng số này là từ 0 đến 1. Nếu không, bạn sẽ phải thực hiện một số thao tác kẹp. Nếu trọng số tổng là 1, thì bạn có thể bỏ qua bước phân chia.

Có vô số cách khác để pha trộn màu sắc. Nếu điều này không làm những gì bạn muốn, bạn sẽ cần phải cung cấp thêm chi tiết cụ thể như những gì bạn muốn.

+0

Fro một [weighted average] (https://en.wikipedia.org/wiki/Weighted_mean), bạn chia cho * tổng của các trọng số *, không phải số thứ bạn đang tính trung bình. Vì vậy, bạn sẽ làm 'result.L = (uint8_t) ((float) LSum/wSum)', trong đó 'wSum = trọng số [0] + trọng số [1] + trọng số [2] + trọng số [3]'. – Rahul

+0

@RahulNarain Điểm tốt! Cảm ơn vì đã bắt được điều đó. Tôi đã sửa nó. – user1118321

+0

a và b là các giá trị đã ký trong không gian L * a * b *. – ergosys

5

Kết quả thực tế nhất sẽ đến từ việc chuyển đổi giá trị L*a*b* sang không gian RGB tuyến tính (không được gamma), tổng hợp các giá trị đó và chuyển đổi lại. Đây là cách các nguồn ánh sáng vật lý tương tác.

Không gian màu L*a*b* không được phát minh để thao tác màu vì nó vốn không tuyến tính.

+0

Kết hợp RGB sẽ không tạo ra màu sắc thực tế: http://farm1.static.flickr.com/147/417347616_60b05096f3_o.png –

+2

@ user1215106, người đã nói gì về "chế độ trộn nhân"? Tôi nói "tổng hợp". Mặc dù trong trường hợp của bạn, bạn có thể đang tìm kiếm một "pha trộn", nhưng điều đó đòi hỏi phải xác định thứ tự và độ mờ đục của mỗi màu. –

+0

Không giống như các mô hình màu RGB và CMYK, màu Lab được thiết kế để gần đúng tầm nhìn của con người - http://en.wikipedia.org/wiki/CIE_Lab. CIE L * a * b * (CIELAB) là không gian màu hoàn chỉnh nhất được chỉ định bởi Ủy ban Quốc tế về Chiếu sáng (Ủy ban Pháp ngữ quốc tế de l'éclairage, do đó ban đầu là CIE). Nó mô tả tất cả các màu sắc có thể nhìn thấy bằng mắt người và được tạo ra để phục vụ như một mô hình độc lập của thiết bị được sử dụng làm tham chiếu. –