Thuật toán kiểm tra độ giống nhau của các màu


82

Tôi đang tìm một thuật toán so sánh hai màu RGB và tạo ra một giá trị về độ giống nhau của chúng (trong đó sự tương đồng có nghĩa là "tương tự đối với nhận thức trung bình của con người").

Có ý kiến ​​gì không?

CHỈNH SỬA :

Vì tôi không thể trả lời được nữa nên tôi quyết định đặt "giải pháp" của mình dưới dạng chỉnh sửa cho câu hỏi.

Tôi quyết định sử dụng một tập hợp con (rất) nhỏ màu sắc trung thực trong ứng dụng của mình, để tôi có thể tự mình xử lý việc so sánh các màu sắc. Tôi làm việc với khoảng 30 màu và sử dụng khoảng cách được mã hóa cứng giữa chúng.

Vì đó là một ứng dụng iPhone nên tôi đã làm việc với mục tiêu-C và việc triển khai ít nhiều là một ma trận đại diện cho bảng bên dưới, hiển thị khoảng cách giữa các màu.

nhập mô tả hình ảnh ở đây


So sánh các giá trị R, G và B là không đủ?
Da đen,

@Kai: tôi đang cố gắng thực hiện điều tương tự. bạn đã đi với phương pháp tiếp cận YUV hay bạn đã chọn một loại không gian màu và khoảng cách không gian khác?
Thariama

3
@Thariama Tôi đã quyết định sử dụng một tập hợp con (rất) nhỏ màu sắc trung thực trong ứng dụng của mình, để tôi có thể tự mình xử lý việc so sánh các màu sắc. Tôi làm việc với khoảng 50 màu và sử dụng khoảng cách được mã hóa cứng giữa chúng. Tuy nhiên, từ tất cả những gì tôi đã đọc và thử và kiểm tra khi sử dụng 2 ^ 24 màu YUV đã làm tốt nhất.
Kai Huppmann

@Kai: rất cảm ơn vì đã cho tôi biết về quyết định của bạn và lý do của nó. điều đó có nghĩa là bạn đang sử dụng RGB và tạo biểu đồ sử dụng 50 màu và tăng tốc độ thuật số của bạn bằng cách sử dụng các khoảng cách được xác định trước, đúng không? bạn đã sử dụng ngôn ngữ nào để triển khai thuật toán của mình?
Thariama

@Thariama Đặt nó dưới dạng một bản chỉnh sửa trong câu hỏi gốc.
Kai Huppmann

Câu trả lời:


57

Khoảng cách RGB trong không gian euclide không "giống với nhận thức của con người"

Bạn có thể sử dụng không gian màu YUV , nó có tính đến yếu tố này:

|  Y' |      |  0.299    0.587    0.114   | | R |
|  U  |  =   | -0.14713 -0.28886  0.436   | | G |
|  V  |      |  0.615   -0.51499 -0.10001 | | B |

Bạn cũng có thể sử dụng không gian màu CIE cho mục đích này.

BIÊN TẬP:

Tôi sẽ đề cập rằng không gian màu YUV là một phép gần đúng rẻ tiền có thể được tính bằng các công thức đơn giản. Nhưng nó không đồng nhất về mặt nhận thức. Đồng nhất về mặt tri giác có nghĩa là sự thay đổi cùng một lượng trong giá trị màu sẽ tạo ra sự thay đổi về mức độ quan trọng trực quan như nhau. Nếu bạn cần một số liệu chính xác và nghiêm ngặt hơn, bạn chắc chắn phải xem xét không gian màu CIELAB hoặc một không gian đồng nhất về mặt tri giác khác (ngay cả khi không có công thức chuyển đổi đơn giản nào).


3
Cảm ơn bạn! Sau đó, tôi có thể đi với khoảng cách không gian euclid của các giá trị Y'UV không?
Kai Huppmann

Chắc chắn, nhưng bạn cũng có thể sử dụng các khoảng cách khác.
Ghassen Hamrouni

2
Có lẽ hầu hết bạn chỉ muốn tính toán khoảng cách euclid giữa các thành phần UV vì Y 'là thành phần luma.
Ross

17
Có ai có thể trích dẫn nguồn cho tuyên bố rằng khoảng cách Euclide trong YUV phản ánh nhận thức của con người về sự khác biệt không?
Hóa đơn

4
@Bill nó không. xem phần "kết quả" tại đây: compuphase.com/cmetric.htm
kritzikratzi

23

Tôi khuyên bạn nên sử dụng CIE94 (DeltaE-1994), nó được cho là đại diện tốt cho nhận thức màu sắc của con người. Tôi đã sử dụng nó khá nhiều trong các ứng dụng liên quan đến thị giác máy tính của mình và tôi khá hài lòng với kết quả.

Tuy nhiên, nó khá tốn kém về tính toán để thực hiện một phép so sánh như vậy:

  1. RGB to XYZ cho cả hai màu
  2. XYZ to LAB cho cả hai màu
  3. Diff = DeltaE94(LABColor1,LABColor2)

Công thức (mã giả):


Tôi thích phương pháp này vì sử dụng không gian màu CIELAB, cảm ơn.
Sergey Voronezhskiy

XYZ thành LAB như trong "Hunter-Lab"?
Zuks

1
Nevermind ... Tôi có thể nhìn thấy Delta E 1994 sử dụng CIE-L * giá trị ab
Zuks

14

Nhận thức của con người yếu hơn về sắc độ so với cường độ.

Ví dụ: trong video thương mại, không gian màu YCbCr / YPbPr (còn được gọi là Y'UV) làm giảm độ phân giải của thông tin sắc độ nhưng vẫn giữ nguyên luma (Y). Trong nén video kỹ thuật số như 4: 2: 0 và 4: 2: 2 làm giảm tốc độ bit sắc độ do cảm nhận tương đối yếu hơn.

Tôi tin rằng bạn có thể tính toán một hàm khoảng cách có mức độ ưu tiên cao hơn so với luma (Y) và ít ưu tiên hơn so với màu sắc.

Ngoài ra, dưới cường độ thấp, thị giác của con người thực tế là đen trắng. Do đó, hàm ưu tiên là phi tuyến tính trong đó đối với luma thấp (Y), bạn đặt càng ngày càng ít trọng lượng về sắc độ.

Các công thức khoa học khác: http://en.wikipedia.org/wiki/Color_difference


14

Có một bài viết tuyệt vời về chủ đề khoảng cách màu ở đây: http://www.compuphase.com/cmetric.htm

Trong trường hợp tài nguyên đó biến mất, kết luận của tác giả là xấp xỉ chi phí thấp nhất cho khoảng cách giữa hai màu RGB có thể đạt được bằng cách sử dụng công thức này (trong mã C ).

typedef struct {
   unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
  long rmean = ( (long)e1.r + (long)e2.r ) / 2;
  long r = (long)e1.r - (long)e2.r;
  long g = (long)e1.g - (long)e2.g;
  long b = (long)e1.b - (long)e2.b;
  return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

3

Cảm nhận màu sắc không phải là Euclidean. Bất kỳ công thức khoảng cách nào sẽ vừa đủ tốt vừa đủ khủng khiếp cùng một lúc. Bất kỳ phép đo nào dựa trên khoảng cách Euclide (RGB, HSV, Luv, Lab, ...) sẽ đủ tốt cho các màu tương tự, thể hiện màu nước gần với màu xanh mòng két. Nhưng đối với các giá trị không đóng thì nó có thể là tùy ý. Ví dụ, màu đỏ gần với màu xanh lá cây hay màu xanh lam?

Từ câu hỏi thường gặp về màu sắc của Charles Poynton :

Hệ thống XYZ và RGB không thể hiện được sự đồng nhất về mặt cảm nhận. Việc tìm kiếm sự biến đổi XYZ thành một không gian đồng nhất về mặt nhận thức đã tiêu tốn một thập kỷ trở lên tại CIE và cuối cùng thì không một hệ thống duy nhất nào có thể được thống nhất.


Cảm ơn bạn. Và đó là một liên kết tuyệt vời, thú vị. Đối với mục đích của tôi, việc biết màu đỏ gần với xanh lục hay xanh lam không quá quan trọng, mà là màu xám nhạt gần với màu trắng hơn là màu đỏ nhạt và tôi hy vọng (nhưng chưa chắc chắn) rằng YUV sẽ làm được.
Kai Huppmann

-5

Độ tương đồng màu trong khối RGB được đo bằng khoảng cách euclid (sử dụng công thức pythagoras).

CHỈNH SỬA: Suy nghĩ lại, điều này cũng đúng với hầu hết các không gian màu khác.


6
Không, khoảng cách Euclide trong không gian RGB không tương ứng với cách mắt người cảm nhận sự khác biệt giữa các màu. Đây là toàn bộ lý do mà không gian màu như Lab được tạo ra.
Hóa đơn

Không. khoảng cách euclide là một cách để đo khoảng cách trong bất kỳ không gian cartesian nào. nó đo khoảng cách, không phải độ tương đồng! bây giờ bạn có thể chọn một không gian vectơ khác (như cie hoặc yuv) trong đó khoảng cách euclid và độ tương tự sắp xếp trùng nhau hoặc bạn sử dụng một số đo khác. nhưng rgb + euclidean không cho kết quả khả quan.
kritzikratzi

tôi cũng nghĩ như vậy, nhưng sau đó mở một chương trình vẽ với số lượng màu hạn chế (ví dụ: adobe flash, với 216 bảng màu mặc định được thiết lập sẵn), và đưa công thức đó vào thử nghiệm và bạn rất nhanh chóng thất vọng, màu vàng khi bạn rõ ràng cần màu nâu, v.v.
Dmitry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.