Szukam algorytmu, który porównuje dwa kolory RGB i generuje wartość ich podobieństwa (gdzie podobieństwo oznacza „podobne w stosunku do przeciętnej ludzkiej percepcji”).
Jakieś pomysły?
EDYCJA :
Ponieważ nie mogę już odpowiedzieć, zdecydowałem się umieścić moje „rozwiązanie” jako edycję pytania.
Zdecydowałem się na (bardzo) mały podzbiór kolorów True Color w mojej aplikacji, aby móc samodzielnie porównywać kolory. Pracuję z około 30 kolorami i używam zakodowanych na stałe odległości między nimi.
Ponieważ była to aplikacja na iPhone'a, pracowałem z celem C, a implementacja jest mniej więcej matrycą reprezentującą poniższą tabelę, która pokazuje odległości między kolorami.
algorithm
colors
comparison
rgb
Kai Huppmann
źródło
źródło
Odpowiedzi:
Odległość RGB w przestrzeni euklidesowej nie jest zbyt „podobna do przeciętnej ludzkiej percepcji”
Możesz użyć przestrzeni kolorów YUV , bierze pod uwagę ten czynnik:
W tym celu można również użyć przestrzeni kolorów CIE .
EDYTOWAĆ:
Wspomnę, że przestrzeń kolorów YUV jest niedrogim przybliżeniem, które można obliczyć za pomocą prostych wzorów. Ale nie jest percepcyjnie jednolity. Percepcyjnie jednolity oznacza, że zmiana o tę samą wartość wartości koloru powinna spowodować zmianę o mniej więcej tym samym znaczeniu wizualnym. Jeśli potrzebujesz bardziej precyzyjnych i rygorystycznych danych, zdecydowanie musisz wziąć pod uwagę przestrzeń kolorów CIELAB lub inną percepcyjnie jednolitą przestrzeń (nawet jeśli nie ma prostych wzorów konwersji).
źródło
Poleciłbym użycie CIE94 (DeltaE-1994), mówi się, że jest to przyzwoita reprezentacja ludzkiego postrzegania kolorów. Używałem go dość często w moich aplikacjach związanych z wizją komputerową i jestem raczej zadowolony z wyniku.
Jednak wykonanie takiego porównania jest dość kosztowne obliczeniowo:
RGB to XYZ
dla obu kolorówXYZ to LAB
dla obu kolorówDiff = DeltaE94(LABColor1,LABColor2)
Formuły (pseudokod):
źródło
Ludzka percepcja jest słabsza pod względem barwy niż intensywności.
Na przykład w komercyjnym wideo przestrzenie kolorów YCbCr / YPbPr (zwane również Y'UV) zmniejszają rozdzielczość informacji o barwie, ale zachowują luminancję (Y). W przypadku kompresji cyfrowego wideo, takiej jak 4: 2: 0 i 4: 2: 2, zmniejsza szybkość transmisji chrominancji ze względu na stosunkowo słabszą percepcję.
Uważam, że można obliczyć funkcję odległości, która daje wyższy priorytet nad luminancją (Y) i mniejszy priorytet nad chroma.
Ponadto przy niskiej intensywności ludzki wzrok jest praktycznie czarno-biały. Dlatego funkcja priorytetu jest nieliniowa, ponieważ w przypadku niskiej luminancji (Y) kładzie się coraz mniejszą wagę na nasycenie.
Bardziej naukowe formuły: http://en.wikipedia.org/wiki/Color_difference
źródło
Doskonały opis na temat odległości kolorów znajduje się tutaj: http://www.compuphase.com/cmetric.htm
W przypadku, gdy ten zasób zniknie, wniosek autora jest taki, że najlepsze tanie przybliżenie odległości między dwoma kolorami RGB można uzyskać za pomocą tego wzoru (w kodzie C ).
źródło
Postrzeganie kolorów nie jest euklidesowe. Każda formuła dystansu będzie jednocześnie wystarczająco dobra i straszna. Każda miara oparta na odległości euklidesowej (RGB, HSV, Luv, Lab, ...) będzie wystarczająco dobra dla podobnych kolorów, pokazując, że woda jest zbliżona do turkusu. Ale dla wartości niezamkniętych staje się to arbitralne. Na przykład, czy kolor czerwony jest bliższy zielonemu czy niebieskiemu?
Z FAQ Charlesa Poyntona na temat kolorów :
źródło
Podobieństwo kolorów w kostce RGB jest mierzone odległością euklidesową (użyj wzoru Pitagorasa).
EDYCJA: Po zastanowieniu powinno to dotyczyć również większości innych przestrzeni kolorów.
źródło