2012-11-23 44 views
5

thể trùng lặp:
“Distance” between colours in PHPDetect nếu màu nằm trong phạm vi

Tôi muốn phát hiện nếu một giá trị RGB là một bóng nhất định hồng. Tôi không chắc chắn làm thế nào để tiến hành với điều này vì dường như không có một loạt các giá trị RGB hoặc hex theo một thứ tự tuyến tính cho màu hồng (một bóng màu hồng là 255, 182, 193; #FFB6C1, trong khi một màu khác là 238, 162, 173; #EEA2AD). Bạn có bất kỳ ý tưởng về những gì để làm, giả sử tôi biết bắt đầu và kết thúc RGB/hex giá trị của phạm vi của tôi?

+0

Thử chuyển đổi sang HSV và thực hiện so sánh ở đó. –

+2

đọc kỹ trước khi bạn đánh dấu một kẻ lừa đảo ... – goat

Trả lời

10

Có vẻ khá tuyến tính với tôi. Tuy nhiên, bạn cần phải hiểu một chút về lý thuyết màu sắc.

Tôi hy vọng bạn không nhớ tôi bao gồm một bồi dưỡng đơn giản về lý thuyết màu sắc ở đây trước khi trả lời câu hỏi của bạn. Nhưng nó giúp hiểu hay xây dựng bất kỳ giải pháp nào.

Đầu tiên, tôi chắc chắn rằng hầu hết sẽ nhớ bánh xe màu họ đã học được ở trường mẫu giáo:

          Red 
     Red      Orange | Purple 
     |        \_|_/ 
     _o_  ---------->    _o_ 
    / \       /| \ 
    Yellow Blue     Yellow | Blue 
             Green 

Vâng, chúng ta cần phải sửa đổi nó một chút. Bởi vì nó chỉ ra rằng màu đỏ và màu xanh không thực sự màu cơ bản vì bạn có thể nhận được màu đỏ bằng cách trộn Magenta với màu vàng và bạn có thể nhận được màu xanh bằng cách trộn Cyan với một chút màu đỏ. Vì vậy, Bánh xe màu biến đổi sử dụng in màu sắc: CMY:

 Magenta 
    Red | Blue 
     \_|_/ 
      _o_ 
     /| \ 
    Yellow | Cyan 
     Green 

này về cơ bản là không gian màu HSV (với S thường được vẽ đi từ trung tâm đến các cạnh của bánh xe và V không vẽ ở tất cả nhưng thông thường có thể được thay đổi bởi một thanh trượt). Nó có nguồn gốc từ in màu CMY. Vậy làm thế nào điều này có thể giúp chúng tôi với màn hình màu RGB?

Vâng, nếu bạn nhìn kỹ vào nó, bạn sẽ nhận thấy rằng nó thực sự là một hỗn hợp của cả không gian in và màn hình màu. Nó thực sự mô tả mối quan hệ giữa CMY và RGB:

 Magenta     Magenta 
    Red | Blue    |   Red  Blue 
     \_|_/      |    \_ _/ 
      _o_   ==  _o_  +  o 
     /| \     / \    | 
    Yellow | Cyan   Yellow Cyan   | 
     Green         Green 

Vì vậy, bất kỳ màu RGB nào cũng có thể hiểu được bằng bánh xe màu này. Ví dụ, không có màu vàng trong RGB. Nhưng chú ý rằng Yellow là đối diện của Blue. Vì vậy, để có được màu vàng, bạn trừ màu xanh từ một màu:

rgb(100,80,10) is a "yellowish" version of rgb(100,80,120) 
      ^          ^

Khi bạn hiểu bánh xe màu này làm việc với giá trị RGB có ý nghĩa hơn. Với thực hành đủ, bạn có thể soạn thảo và chỉnh sửa màu trực tiếp theo cú pháp #rrggbb mà không cần tham khảo biểu đồ màu.

Vì vậy, để trả lời câu hỏi của bạn. Nói bóng mục tiêu của bạn hồng là:

rgb(255,182,193) 

Chúng ta biết hai điều về màu "hồng":

  1. Chúng tôi percieve nó như là một loại đỏ. Vì vậy, nó có ý nghĩa rằng màu mục tiêu có giá trị Red cao (trên thực tế nó là tối đa).

  2. Chúng tôi coi nó là màu đỏ rất nhẹ. Vì vậy, nó có ý nghĩa rằng các thành phần không phải là màu đỏ cũng khá cao (trên 150).

Vì vậy, để có được màu gần với màu sắc mục tiêu của bạn, chúng tôi cần:

  1. giá trị R cao hơn G hay B.
  2. Tất cả các giá trị đáng kể là khá cao (trên 150 hoặc lâu hơn) .

Theo định nghĩa này, chúng ta có thể xác định màu hồng như:

// Pseudo code: 

is_pink (R,G,B) { 
    return R > 200 && // make sure R is high 
      G > 150 && // make sure G & B are relatively high 
      B > 150 && 
      R > G && // make sure G & B are not higher than R 
      R > B; 
} 

Chúng ta có thể thêm điều kiện khác để từ chối "màu hồng" mà là hơi hơi xanh hoặc xanh bằng cách đảm bảo rằng G & B là khá tương tự:

// Pseudo code: 

is_pink (R,G,B) { 
    return R > 200 && 
      G > 150 && 
      B > 150 && 
      R > G && 
      R > B && 
      abs(G-B) < 20; // make sure it's neither bluish or greenish 
} 

Bạn có thể tinh chỉnh các giá trị 200, 150 và 20 cho phù hợp với khẩu vị hơi hồng nhưng bạn sẽ thấy rằng nếu áp dụng chức năng trên cho cả hai màu thử nghiệm (255,182,193)(238,162,173) cả hai đều sẽ được xác định là "hồng".

+0

Đây là một trong những câu trả lời hay nhất tôi đã đọc trên Stackoverflow. Cảm ơn nhiều. – JSHelp

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