Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Porównywanie kolorów - zagadka matematyczna?

Moderatorzy: Jacek Bogusz, Moderatorzy

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 18:30

Nie testowałem mocno tego Twojego programu, ale i na wpadke nei natrafilem.
O to chodziło ;).
Jesli nei widzisz podobienstwa miedzy Twoim wzorem a moim no cóz
W pewnych miejscach widzę... w sumie mnożenie i dodawanie też są do siebie podone, nie? :)
w kazdym razie kwadraty zwalniaja Cie z odejmowania liczby mniejszej od wiekszej, ale zawsze mozna tez zastosowac funkcje ABS().
...którą sobię napisałem prywatną i stosowałem :D.

Demo bardzo ladne (w czym pisales?).
A dziękować, dziękować :). Pisałem je w Dev-C++ używając biblioteki Allegro :idea: :) (nie mylić z serwisem aukcyjnym, czekoladą z Biedronki ani tempem w muzyce :))
trzeba zrobic test porownawczy, i to w trudniejszych warunkach (przy wiekszej liczbie kolorow z palety - przejscia plynne).
Sęk w tym, że chodzi o to, żeby było max 256 kolorów :). W końcu 8bit ;). Z większą liczbą kolorów to cała ta sprawa chyba nie miałaby sensu :570:.

Szybko zrobiłem demo na 50000 kolorów - u mnie za każdym razem są praktycznie identyczne :). Oczywiście wyświetla tylko pierwsze 256 kolorów... :)

Pozdr.
Załączniki
50 000.rar
(3.12 KiB) Pobrany 264 razy

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 18:33

petersz - a post pajączka widziałeś?

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 18:51

Tak, już widziałem... Hmmm... Jak to określić? Może wyjątek potwierdzający regułę? :) Myślę, że to, czy dany kolor pasuje to zależy od wielu czynników... Raz może być podobniejszy mój, a raz pajączka :P. Trudno to ocenić, który jest bardziej podobny, myślę, że zależy to w dużej mierze od pozostałych kolorów np. w obrazku. Po za tym, jak już wcześniej wspomniałem, z pustego i Salomon nie naleje, a algorytm z założenia nie będzie porównywał czy bardziej podobny do niebieskiego jest pomarańczowy, czy zielony... Kompletnie inna idea jest mojego projektu :).

Pozdr.

P.S.
Sorry, że długo nie odpisywałem...
Acha, z dużą ilością kolorów też się chyba sprawdza :).

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 18:55

Nie rozumiesz. Pajaczek podal kolor zielony, ktory jest podobny do bazowego zielonego bardziej, niz inny kolor zielony, znaleziony przez Twoj program. A na tym przeciez polegac ma jego idea. Jak najbardziej swiadczy to o jego ulomnosci (programu). Nie ma tu mowy o porownywaniu zielonego z niebieskim i pomaranczowym, itp.

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 18:55

Spróbujcie znaleść jeszcze jakieś wpadki... ;)

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 18:57

A podasz wzor, czy chcesz go opatentowac ;) (i tak nie nie da)?

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 19:01

Trudno mi tłumaczyć, ale spróbuję: ideą mojego programu nie jest to, co myślicie! :) Chodzi mi o to, że 8bitowy obrazek kożysta z palety. Kolory są złe, bo nie odnoszą się do odpowiednich indeksów palety. Chodzi o to, żeby podać obrazek z duża głębią kolorów, paletę z najczęściej używanymi kolorami i aby program "naprawił" obrazek... :)

Pozdr.

[ Dodano: 14-03-2006, 18:02 ]
Acha, wzór... może być fragment kodu? :)

Kod: Zaznacz cały

// a tutaj rozpoczynamy porównywanie... for (int i = 0; i < 256; i++) { suma_roznic = abs(kolor.r - paleta[i].r) + abs(kolor.g - paleta[i].g) + abs(kolor.b - paleta[i].b); // jeśli suma różnic aktualnego koloru palety i koloru podstawowego jest // mniejsza od wcześniejszej sumy, to aktualny kolor jest podobniejszy if (suma_roznic < poprzednia_roznica) { // zapamiętujemy najmniejszą różnicę... poprzednia_roznica = suma_roznic; // ...i rysujemy podobny kolor :) rectfill(screen, 400, 0, 519, 120, makecol(paleta[i].r * 4, paleta[i].g * 4, paleta[i].b * 4)); } }
...i nawet z komentarzem macie :)

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 19:11

Chyba jednak rozumiemy....

Czyli tak jak myslalem (i pisalem) - badasz roznice skladowych.

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 19:16

Też znacie (trochę, jak i ja ;)) C++? Jak tak, to nie powinniście mieć problemów ze zrozumieniem... :). Czy jeszcze jakieś wpadki znaleźliście? A co do tego, że mówiłeś, że im więcej kolorów, tym trudniej, to mi się wydaje, że na odwrót - im mniej kolorów, tym trudniej znaleść podobny moją metodą, ponieważ... a nie chce mi się pisać :). IMO press nie miał racji mówiąc, że przekształciłem "jego" wzór :P.

Pozdr.
Ostatnio zmieniony 14 mar 2006, o 19:21 przez petersz, łącznie zmieniany 1 raz.

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 19:20

Zmodyfikuj program nastepujaco, i porownaj wyniki (zalacz nowy program):

Kod: Zaznacz cały

// a tutaj rozpoczynamy porównywanie... for (int i = 0; i < 256; i++) { suma_kwadratow = sqr(kolor.r - paleta[i].r) + sqr(kolor.g - paleta[i].g) + sqr(kolor.b - paleta[i].b); //dalej to, co bylo....

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 19:33

Zmieniłem tylko abs(...) na sqr(...), o to Ci chodziło? Jeśli tak, to nie jest dobrze, czasem znajduje kolor, a czasem nie, tak jak tu: (kolor ten, który wylosował się pajączkowi - mój algrytm znalazł przynajmniej zielony, a ten... :))

[ Dodano: 14-03-2006, 18:34 ]
Zmodyfikuj program nastepujaco, i porownaj wyniki (zalacz nowy program):

Kod: Zaznacz cały

// a tutaj rozpoczynamy porównywanie... for (int i = 0; i < 256; i++) { suma_kwadratow = sqr(kolor.r - paleta[i].r) + sqr(kolor.g - paleta[i].g) + sqr(kolor.b - paleta[i].b); //dalej to, co bylo....
Właśnie tak zrobiłem :)
Kurczę, piszę odpowiedź, wysyłam, a tu się okazuje, że pełno postów pozmienianych i wychodzę na półgłówka ;).

[ Dodano: 14-03-2006, 18:44 ]
A tak na logikę - co to miałoby dać, że podniesiemy do kwadratu? :?
Załączniki
nowy algorytm.rar
(3.41 KiB) Pobrany 262 razy
bł±d.jpg

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 20:57

Jakiego typu jest suma_kwadratow? r, g i b są 8-bitowe?

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 21:12

suma_kwadratow (suma_roznic) jest 4bajtowa, zaś r, g i b są faktycznie 1bajtowe:

Kod: Zaznacz cały

typedef struct RGB { unsigned char r, g, b; } RGB;
:one: A czemu pytasz?

Pozdr.

P.S.
Acha! I jeszcze dodam, że kolory w trybie 8bitowym podaje się do 63, a nie 255 ;). Mimo iż demka są w 32bitowym, maksymalne wartości r, g i b mogą wynosić 63. Nie chcę mi się zagłębiać w szczegóły, ale tak już jest... :)
Palette entries are stored in an RGB structure, which contains red, green and blue intensities in the VGA hardware format, ranging from 0-63, and is defined as...

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 21:27

Ten blad byl z nowa wersja? Ja sie nia troche pobawilem - nie zauwazylem, ale to o niczym nie swiadczy. Jesli byl z nowa wersja - musi cos byc zle, bo suma kwadratow dla zielonego i dla prawie-czarnego jest duuuza, i sa blizsze kolory, ktore ten algorytm musi wykryc.

Pytalem, bo obawialem sie przepelnienia. Ale z 32-bitowa suma jest ok.

Dlaczego kwadraty? tak jak pisalem - przestrzen barw RGB jest euklidesowa, a tak wlasnie oblicza sie odleglosc w przestrzeni euklidesowej (wynika to wprost z tw. Pitagorasa). Ty przyjales inna metryke (nota bene tzw. metryke Manhattan), niezgodna z natura tej przestrzeni, czyli.... stworzyles inna przestrzen metryczna (jak sie czujesz w roli Kreatora Przestrzeni? :) ). Ale zostaw takie rowazania na razie :).

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 14 mar 2006, o 21:40

Chcialbym tylko dodac, ze ten "moj" zielony to bylo pierwsze uruchomienie Twojego demka :twisted:

Dlaczego kwadraty ?? Bo moze sie zdazyc ze przyblizajacy bedzie sie roznil tylko 1 skladowa, ale znacznie. Wowczas w Twoim algorytmie moze zostac zakwalifikowany jako bliski, podczas gdy przy kwadratach roznic, blizszym bedzie taki ktorego wszystkie 3 skladowe sie roznia, ale zadna w az takim stopniu.

Dlaczego pytal o typ ?? Jak to dlaczego ?? potega... chyba powinienes sie domyslic ;)

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 21:42

Tak, ten błąd jest z nową wersją, u mnie gdzieś mniej więcej co trzeci raz występuje... :roll: Nie wiem, czemu tak. W każdym bądź razie, nawet gdy jest dobrze, to wcale nie jest lepiej... od mojego sposobu :). Jak chcesz się pobawić, to zainstaluj sobię DevPak'a z Allegro i już ;).

Pozdr.

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 21:53

petersz - nie rozumiesz, ze dla bardzo ziarnistego zbioru palety roznic moze nie byc - pisze to ostatni raz, wiecej mi sie nie chce. Ty bierzesz jakis zbior, w ktorym kolory dosc istotnie sie roznia, stwierdzasz ze mniej dokladny alg. daje takie same wyniki jak bardziej i uwazasz, ze to dowod na to, ze w ogolnosci algorytmy sie nie roznia efektami. roznia sie.

co do bledu - musisz go miec w programie, a nie w samym algorytmie.

pajączek - nie zrozumialem...

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 22:00

petersz - nie rozumiesz, ze dla bardzo ziarnistego zbioru palety roznic moze nie byc - pisze to ostatni raz, wiecej mi sie nie chce. Ty bierzesz jakis zbior, w ktorym kolory dosc istotnie sie roznia, stwierdzasz ze mniej dokladny alg. daje takie same wyniki jak bardziej i uwazasz, ze to dowod na to, ze w ogolnosci algorytmy sie nie roznia efektami. roznia sie.
Gdzie ja powiedziałem, że mój algorytm jest najlepszy?! :) Po prostu nie widziałem różnicy, mniędzy moim (nie znalazłem podobniejszego koloru), a Twoim (też nie znalazłem podobniejszego koloru). Co do błędu, to jeszcze nie znalazłem - takie są najgorsze :|.
pajączek - nie zrozumialem...
A ja właśnie zrozumiałem... z tymi potęgami chyba faktycznie masz rację ;).

Pozdr.

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 22:07

Dlaczego kwadraty ?? Bo moze sie zdazyc ze przyblizajacy bedzie sie roznil tylko 1 skladowa, ale znacznie. Wowczas w Twoim algorytmie moze zostac zakwalifikowany jako bliski, podczas gdy przy kwadratach roznic, blizszym bedzie taki ktorego wszystkie 3 skladowe sie roznia, ale zadna w az takim stopniu.
w sposobie petersza (Manhattan) tez bliszy bedzie ten, ktorego wszystkie skladowe sie roznia, ale zadna az w takim stopniu. do tego nie potrzeba zadnych kwadratow.

petersz
-
-
Posty: 579
Rejestracja: 2 gru 2005, o 18:26
Lokalizacja: ---

Postautor: petersz » 14 mar 2006, o 22:09

Zaraz... muszę zbadać sytuację. Najprościej chyba będzie coś "namalować"... :) Sugerujesz, że raz będzie lepszy mój algorytm, a raz pajączka?

[ Dodano: 14-03-2006, 21:35 ]
Hmmm... Chyba jednak pajączku to nie będzie dobre rozwiązanie :roll:, look - kolor podstawowy (w środku): 100, 180, 30. Drugi: 20, 180, 30 (po prawej) i trzeci 140, 150, 10 (po lewej). Wg Twojego algorytmu podobniejszy byłby kolor nr 3: 40^2 + 30^2 + 20^2 = 2900. A drugi kolor (przypominam, po prawej :)): 80^2 = 6400, a więc niby podobniejszy kolor 3, ale... :twisted: Wg. mojego algorytmu podobniejszy byłby kolor 2... :P
Załączniki
porĂłwnanie.gif
porĂłwnanie.gif (1.24 KiB) Przejrzano 9157 razy
porĂłwnanie.gif
porĂłwnanie.gif (1.24 KiB) Przejrzano 9157 razy

Wróć do „Nie(elektroniczny) Hyde Park”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 41 gości