2009-11-05 36 views
27

Tôi có một mảng khoảng 200 màu ở định dạng RGB. Tôi muốn viết một chương trình mà có bất kỳ màu RGB và cố gắng để phù hợp với một màu từ mảng đó là hầu hết "tương tự".Thuật toán tốt nhất cho màu phù hợp.

Tôi cần định nghĩa tốt cho "tương tự", càng gần với nhận thức của con người càng tốt.

Tôi cũng muốn hiển thị một số thông tin về độ chính xác phù hợp. Ví dụ: đen trắng: 100% và có màu tương tự với màu hơi khác: -4%.

Tôi có cần sử dụng mạng thần kinh không? Có cách nào khác dễ hơn không?

+0

là câu hỏi về một đề nghị như những gì có thể là một chức năng tương tự tốt, hoặc là nó về một thuật toán để nhanh chóng tìm thấy màu sắc tương tự như hầu hết (s) trong mảng, tương ứng với một màu sắc Hãy cho ? – mjv

+0

Cả hai. Nếu trước tiên tôi cần một số định nghĩa tương tự trước khi tôi có thể thử thuật toán crating. Tôi nghĩ rằng "cảm nhận tương tự" là những gì tôi đang tìm kiếm. –

Trả lời

34

Chuyển đổi tất cả các màu sắc để các CIE Lab color space và tính toán khoảng cách trong không gian đó

deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2) 

Màu sắc với deltaE thấp nhất là perceptually giống nhất với nhau.

+0

Cảm ơn bạn, đó là chính xác những gì tôi cần. –

+11

Hãy nhớ rằng bạn không cần phải làm sqrt - sqrt là một hàm ngày càng tăng, do đó bước này là thừa. – Rooke

+2

Bạn nói đúng, nếu bạn không làm gì hơn là phân loại, hình vuông của khoảng cách đó cũng tốt bằng khoảng cách. – hobbs

4

Không, bạn không cần mạng thần kinh ở đây! Đơn giản chỉ cần xem xét một giá trị HSL màu một vector và định nghĩa một hàm modulus trọng cho vector như thế này:

modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1); 

where a,b,c are weights you should decide based on your visual definition of what 
creates a bigger difference in perceived color - a 1% change in Hue or a 1% 
change in Saturation 

tôi sẽ đề nghị bạn sử dụng a = b = 0,5 và c = 1

Cuối cùng, tìm ra phạm vi mô đun của bạn sẽ mất và xác định màu sắc tương tự là những người có moduli của họ rất gần nhau (nói 5%)

+2

Đó là một sự thay thế đơn giản. để HSL đơn giản hơn nhiều so với việc chuyển đổi từ RGB sang Lab. :) – hobbs

+0

Ok, vì vậy tôi sẽ thử nó trước. –

+0

Crimson, yo có thể u kiểm tra toán học trên modulus của bạn ở đó? Tôi không nghĩ nó đúng. Bạn muốn một cái gì đó giống như 'a * (H1 - H2) ** 2 +' ..., yeah? – hobbs

1

Tôi cũng chỉ ra phương pháp least squares, cũng giống như một cái gì đó hơi đơn giản. Đó là, bạn lấy sự khác biệt của một số, vuông nó, sau đó tổng hợp tất cả những khác biệt bình phương.

0

Tôi đang tìm kiếm điều nhưng không tìm thấy nhiều câu trả lời xung quanh tôi quyết định tạo thư viện nhỏ này.

https://github.com/sebastienjouhans/c-sharp-colour-utilities

+0

Hãy rất cẩn thận khi đăng câu trả lời quảng cáo cho công việc của riêng bạn. Đảm bảo rằng bạn thực sự trả lời câu hỏi ở đây và chỉ sử dụng blog/nguồn của bạn làm dự phòng và tham chiếu. Hiện tại, điều này có thể bị gắn cờ là spam. – ChrisF

Các vấn đề liên quan