Algorytm sprawdzania podobieństwa kolorów

84

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.

wprowadź opis obrazu tutaj

Kai Huppmann
źródło
Porównanie wartości R, G i B nie wystarczy?
BlackBear
@Kai: próbuję zaimplementować to samo. czy wybrałeś podejście YUV, czy też wybrałeś inny rodzaj przestrzeni kolorów i odległości przestrzennej?
Thariama
3
@Thariama 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 50 kolorami i używam zakodowanych na stałe odległości między nimi. Jednak ze wszystkiego, co przeczytałem i wypróbowałem i przetestowałem przy użyciu 2 ^ 24 kolorów, YUV wykonał najlepszą robotę.
Kai Huppmann
@Kai: bardzo dziękuję za poinformowanie mnie o swojej decyzji i jej powodach. oznacza to, że używasz RGB i tworzysz histogram przy użyciu 50 kolorów i przyspieszasz alogithm używając predefiniowanych odległości, prawda? w jakim języku zaimplementowałeś swój algorytm?
Thariama,
@Thariama Umieść to jako zmiana w oryginalnym pytaniu.
Kai Huppmann,

Odpowiedzi:

57

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:

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

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).

Ghassen Hamrouni
źródło
3
Dziękuję Ci! Czy mogę zatem przyjąć odległość przestrzenną euklidesową wartości Y'UV?
Kai Huppmann
Jasne, ale możesz też użyć innych odległości.
Ghassen Hamrouni
2
Najprawdopodobniej chcesz obliczyć odległość euklidesową między składowymi UV tylko dlatego, że Y 'jest składową luminancji.
Ross
17
Czy ktoś może przytoczyć źródło twierdzenia, że ​​odległość euklidesowa w YUV odzwierciedla ludzkie postrzeganie różnic?
Bill
4
@Bill nie. zobacz sekcję „wyniki” tutaj: compuphase.com/cmetric.htm
kritzikratzi
23

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:

  1. RGB to XYZ dla obu kolorów
  2. XYZ to LAB dla obu kolorów
  3. Diff = DeltaE94(LABColor1,LABColor2)

Formuły (pseudokod):

JHolta
źródło
Wolałem tę metodę ze względu na użycie przestrzeni barw CIELAB, dzięki.
Sergey Voronezhskiy
XYZ do LAB jak w „Hunter-Lab”?
Zuks
1
Nieważne ... Widzę, że Delta E 1994 używa wartości CIE-L * ab
Zuks
14

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

Stephen Chung
źródło
14

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 ).

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));
}
strttn
źródło
3

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 :

Systemy XYZ i RGB są dalekie od wykazywania jednorodności percepcyjnej. Znalezienie transformacji XYZ w racjonalnie jednolitą percepcyjnie przestrzeń zajęło na CIE dekadę lub więcej i ostatecznie nie udało się uzgodnić żadnego pojedynczego systemu.

xan
źródło
Dziękuję Ci. To świetny, interesujący link. Dla mojego celu nie jest tak ważne, aby stwierdzić, czy czerwony jest bliższy zielonemu czy niebieskiemu, ale jasnoszary jest bliżej białego niż jasnoczerwony i mam nadzieję (ale nie jestem jeszcze pewien), że YUV to zrobi.
Kai Huppmann
-5

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.

Damon
źródło
6
Nie, odległość euklidesowa w przestrzeni RGB nie odpowiada sposobowi, w jaki ludzkie oko postrzega różnice między kolorami. Z tego powodu powstały przestrzenie kolorów, takie jak Lab.
Bill
Nie. odległość euklidesowa jest jednym ze sposobów pomiaru odległości w dowolnej przestrzeni kartezjańskiej. mierzy odległość, a nie podobieństwo! teraz możesz albo wybrać inną przestrzeń wektorową (jak cie lub yuv), w której odległość euklidesowa i podobieństwo są zbieżne, lub możesz użyć innej miary. ale rgb + euclidean nie dają zadowalających wyników.
kritzikratzi
też o tym myślałem, ale potem otworzyłem program do rysowania z ograniczoną liczbą kolorów (na przykład Adobe Flash z 216 wstępnie ustawioną paletą domyślną) i przetestowałem tę formułę, a bardzo szybko się rozczarujesz, żółknie, gdy wyraźnie potrzeba brązu itp.
Dmitry