2010-11-13 25 views
5

kazano mi użyć wzoru na odległość, aby dowiedzieć się, czy kolor pasuje ten drugi tak mam,Znalezienie najbliższy kolor RGB

struct RGB_SPACE 
{ 
    float R, G, B; 
}; 

RGB_SPACE p = (255, 164, 32); //pre-defined 
RGB_SPACE u = (192, 35, 111); //user defined 

long distance = static_cast<long>(pow(u.R - p.R, 2) + pow(u.G - p.G, 2) + pow(u.B - p.B, 2)); 

to daje tylko odległość, ale skąd mam wiedzieć, czy kolor pasuje do zdefiniowane przez użytkownika co najmniej 25%?

Nie jestem tylko pewien, ale mam pomysł, aby sprawdzić każdą wartość koloru, aby zobaczyć, czy różnica wynosi 25%. na przykład.

float R = u.R/p.R * 100; 
float G = u.G/p.G * 100; 
float B = u.B/p.B * 100; 

if (R <= 25 && G <= 25 && B <= 25) 
{ 
    //color matches with pre-defined color. 
} 

Odpowiedz

7

Proponuję nie sprawdzać w przestrzeni RGB. Jeśli masz (0,0,0) i (100,0,0), są one podobne według formuły cababungas (jak również według casablanki, która bierze pod uwagę zbyt wiele kolorów podobnych). Jednak wyglądają całkiem inaczej.

Modele kolorów HSL and HSV opierają się na ludzkiej interpretacji kolorów, a następnie można łatwo określić odległość dla barwy, nasycenia i jasności niezależnie od siebie (w zależności od tego, co "podobny" oznacza w twoim przypadku).

+0

w rzeczywistości jest to [laboratorium] (http: //en.wikipedia.org/wiki/Lab_color_space) przestrzeń oparta na ludzkiej interpretacji – zenpoy

2

że maksymalny możliwy dystans między (255, 255, 255) i (0, 0, 0), które znajdują się w odległości 3 * 255^2. Oczywiście te dwa kolory pasują do najmniejszego (0% dopasowania) i są oddalone o 100%. Następnie co najmniej 25% dopasowania oznacza odległość mniejszą niż 75%, tj. 3/4 * 3 * 255^2 = 9/4 * 255 * 255. Więc możesz po prostu sprawdzić, czy:

distance <= 9/4 * 255 * 255 
+0

Maksymalna odległość to oczywiście sqrt (3 * 255^2). 25% dopasowania, jak sądzę, powinno oznaczać różnicę nie większą niż 1/4 całego zakresu. Tak więc ostateczna formuła powinna być: odległość <= sqrt (3)/4 * 255. – cababunga

+0

@cababunga: Masz rację co do 'sqrt', przeoczyłem to, ponieważ PO nie uwzględnił tego w swoim równaniu. Jednak "co najmniej 25% dopasowania" nadal oznacza mniej niż 75% odległości, ponieważ większa odległość oznacza mniejszą zgodność. – casablanca

4

"Dopasowania co najmniej 25%" nie jest dobrze zdefiniowanym problemem. Dopasowuje co najmniej 25% tego i według jakich miar? Istnieje mnóstwo możliwych wyborów. Jeśli porównamy kolory RGB, oczywiste są metryki odległości uzyskane od norm wektorowych. Trzy najważniejsze z nich to:

  • 1-normą lub "odległość Manhattan" odległość = abs (R1-R2) + ABS (G1, G2) + ABS (B1-B2)
  • 2-normą lub odległość euklidesowa: odległość = sqrt (pow (r1-r2, 2) + pow (g1-g2, 2) + pow (b1-b2, 2)) (obliczasz kwadrat tego, co jest w porządku - możesz uniknąć sqrt, jeśli po prostu sprawdzasz przy progu, również poprzez podniesienie wartości progowej)
  • Norma nieskończoności: odległość = max (abs (r1-r2), abs (g1-g2), abs (b1-b2))

Oczywiście istnieje wiele innych możliwości. Możesz sprawdzić, czy znajdują się w pewnej odległości od siebie: Jeśli chcesz pozwolić na różnicę do 25% (w zakresie możliwych wartości RGB) w jednym kanale koloru, progi dla 3 metod to 3/4 * 255, sqrt (3)/4 * 255 i 255/4, odpowiednio. Jest to jednak bardzo gruba metryka.

Lepszym sposobem na zmierzenie odległości między kolorami jest przekształcenie kolorów w percepcyjnie jednolitą przestrzeń kolorów, taką jak CIELAB i dokonanie porównania; jest też całkiem niezły Wikipedia article. To może być przesada w zależności od planowanego zastosowania, ale są to przestrzenie kolorów, w których zmierzone odległości mają najlepszą korelację z odległościami postrzeganymi przez ludzki system wizualny.

+0

+1. Odpowiadasz sobie na dobre pytanie! – augustin

+0

Chodzi mi o zdefiniowany przez użytkownika kolor pasuje do predefiniowanego koloru co najmniej 25%. – user963241