Dzielenie kolorów z obrazka na jakieś składowe

0

To co widzicie na rysunku to czerwony balon sciana jest zielona to czarne to cień, a to niby brązowe to szafka.

Ogólnie to chcialbym wlasnie rozróżnić poszczególne piksele: Powiedzmy ze mam taki algorytm.

zmienna kolor (trzyma w sobie r,g,b)
to samo zmienna kolorA= (0,0,0)

for y = 0 do wysokosc obrazka rob
for x = 0 do szerokosc obrazka rob
kolor = piksel[x,y];

jezeli kolorA != kolor wtedy kolorA = kolor

piksel[x,y] = kolorA

---no powiedzmy ze to porpawnie dziala (ale tak nie jest) ogolnie to idea algorytmu jest taka, ze jak znajdzie rozniacy sie kolor ktorego jeszcze nie ma w bazie kolorow (tablcy) to go dodaje i szuka dalej po pikselach (jak znajdzie podobny kolor do takiego co zostal juz przypisany to przypisze mu ten przypisany kolor) [ten algorytm juz mam napisany]

problem w tym, ze nie wiem za bardzo jak porównać np. czerwony kolor balonu dla mnie jako czlowieka normalne jest ze ten balon jest caly czzerwony z bialym wzorkiem), ale komputer jak do tąd znajduje mi na tym balonie troche za duzo kolorów tak o 3-4 lub wiecej za duzo

porownoje te kolory takimi funkcjami

int __fastcall TRCcolor(Byte r,Byte  g,Byte b,Byte  cr,Byte cg,Byte cb)
{

return abs(  (r+b+g) - (cr+cg+cb)  );

}

bool __fastcall fimilar_color(Byte r,Byte  g,Byte b,Byte  cr,Byte cg,Byte cb, int tolerance3x)
{

if ( abs((r+b+g) - (cr+cg+cb)) > tolerance3x ) return false; else return true;

}

ten funkcje chce wyrzucic bo wiem ze nie dzialaja

próbowałem też zrobić coś na zasadzie ze kolor definiujemy przez 2 zmienne) kolor = { X , Y }

X = R / (R + G + B);

Y = G / (R + G + B);

z czasem zamieniłem to na jedną zmienną kolor = R / G / B


No ale nic mi z tego konkretnego nie wyszlo. chociaz zawsze moglem cos przeoczyć

idea jest taka mamy kolor odpowiednio RGB - 160, 50, 0 (brazowo-sraczkowaty), kolorem podobnym bedzie 80, 25, 0 no i to juz jest ciemniejszy brąz ale jest to też brąz a nie pomarancz czy zielony

A oto i obrazek: (ten po prawej ma byc juz po przefiltrowaniu)
http://img408.imageshack.us/my.php?image=baloonpv8.jpg
user image

obraz z kamerki USB, moglem odfiltorwać szzum, zeby kolory byly bardziej wyraziste, ale i tak nie odwzoruje to mojego oka...

Moje pytanie brzmi jak ja mam porównywać kolory i przypisywać je do już dodanych w tablicy? :s

0

Może skonwertuj kolory do postaci HSV, wtedy kolor (hue) będziesz miał w postaci kąta (0-360).

Oto kanał hue po przesunięciu o +180 stopni:
user image

0
  1. jezeli kolor jest w rgb wtedy masz przestrzen rgb to szescian (w 3D) od punktu (0,0,0) czarny do (1,1,1) bialy. dzieki temu mozesz wyznaczyc odleglosc miedzy kolorami tj sqrt( (r1 - r2)2 + (g1 - g2)2 + (b1 - b2)^2 ) im odleglosc jest mniejsza tym bardziej kolory sa podobne

  2. jezeli chcesz ograniczyc liczbe kolorow to je skwantyzuj (median cut lub octree)

0

Yyyyy testowałem tak i wychodziły błędy rzędu przechodzenia jednego koloru w drugi np. żólty był bardziej pomarańczowy niż inny pomarańcz.

0

dziwne bo ogolnie porownywanie ogleglosci dziala calkiem sprawnie, zawsze mozesz przekonwertowac na HSV i prawdzac kat miedzy barwami im mniejszy tym blizej siebie sa barwy, dodatkowo pozbedziesz sie problemu z jasnoscia :P
tzn odleglosc wektorowa pomiedzy ciemnym zielonym a ciemnym czerownym moze byc mala ale na hsv wyjdzie spory kat :P

0

czyli trzeba dpowiednio ustawić światło

1 użytkowników online, w tym zalogowanych: 0, gości: 1