Jaki jest najdokładniejszy sposób określenia koloru obiektu?

33

Napisałem program komputerowy, który potrafi wykrywać monety na obrazie statycznym (.jpeg, .png itp.) Przy użyciu standardowych technik wizji komputerowej (rozmycie gaussowskie, progowanie, transformata Hougha itp.). Używając proporcji monet zebranych z danego obrazu, mogę z całą pewnością ustalić, które monety są. Chciałbym jednak dodać do moich poziomów ufności, a także ustalić, czy moneta, którą dedykuję, że jest typu A (ze współczynników promienia), również ma poprawne kolory. Problem polega na tym, że w przypadku monet brytyjskich i in. (miedź, srebro, złoto), odpowiednie kolory (zwłaszcza miedzi do złota) są bardzo podobne.

Mam procedurę, która wyodrębnia średni kolor danej monety w kategoriach „przestrzeni kolorów” RedGreenBlue (RGB) i procedury przekształcania tego koloru w „przestrzeń kolorów” HueSaturationBrightness (HSB lub HSV).

RGB nie jest zbyt przyjemny w pracy przy rozróżnianiu trzech kolorów monet (patrz przykład w załączonym [podstawowym] obrazie). Mam następujące zakresy i typowe wartości kolorów różnych typów monet:

Uwaga: typową wartością tutaj jest wartość wybrana za pomocą „rzeczywistego obrazu w pikselach”.

**Copper RGB/HSB:** typicalRGB = (153, 117, 89)/(26, 0.42, 0.60).

**Silver RGB/HSB:** typicalRGB = (174, 176, 180)/(220, 0.03, 0.71).

**Gold RGB/HSB:** typicalRGB = (220, 205, 160)/(45, 0.27, 0.86) 

Najpierw próbowałem użyć „odległości euklidesowej” między danym średnim kolorem monety (używając RGB) a typowymi wartościami dla każdego rodzaju monety podanymi powyżej, traktując wartości RGB jako wektor; dla miedzi mielibyśmy:

Dcopper=((RtypeRcopper)2+(GtypeGcopper)2+(BtypeBcopper)2)

gdzie najmniejsza wartość różnicy ( D ) powiedziałaby nam, jaki typ będzie prawdopodobnie dana moneta. Ta metoda okazała się bardzo niedokładna.

Próbowałem też po prostu porównać odcień monet z typowymi wartościami typów podanymi powyżej. Chociaż teoretycznie zapewnia to znacznie lepszą „przestrzeń kolorów” do radzenia sobie ze zmiennymi poziomami jasności i nasycenia obrazów, to jednak również nie była wystarczająco dokładna.

Pytanie: Jaka jest najlepsza metoda określenia rodzaju monet na podstawie koloru (na podstawie obrazu statycznego)?

Bardzo dziękuje za twój czas.

Typowe kolory monet

Edytuj 1

Uwaga: Wypróbowałem wszystkie omówione poniżej pomysły i osiągnąłem prawie nic. Różnice w warunkach oświetleniowych (nawet na tym samym obrazie) sprawiają, że ten problem jest bardzo trudny i należy go wziąć pod uwagę.

Edycja 2 (Podsumowanie wyniku)

Dziękuję Ci za Twoje odpowiedzi. Dalsze własne badania (w tym twoje odpowiedzi i komentarze) pokazały, jak trudny jest ten problem w ogólnym przypadku arbitralnego oświetlenia, dowolnej kamery (urządzenia mobilnego), wahań koloru monety (nawet dla tego samego gatunku / typu) itd. Najpierw spojrzałem na rozpoznawanie koloru skóry (bardzo aktywna dziedzina badań) jako punkt wyjścia i wciąż istnieje wiele problemów, nawet z rozpoznawaniem koloru skóry dla samych Kaukazów (zobacz ten artykuł, aby przejrzeć obecne techniki), a fakt, że ten problem zawiera trzy różne kolorowe obiekty, z których wszystkie mogą mieć ciągłe i różne chromacje, sprawia, że ​​ten temat wizji komputerowej jest bardzo trudny do sklasyfikowania i odpowiednio sobie z nim poradzić (w rzeczywistości możesz zrobić na nim dobry doktorat !).

Spojrzałem na Metodę Ograniczenia Gamuty z bardzo pomocnego postu DW poniżej. Na pierwszy rzut oka było to bardzo obiecujące jako etap wstępnego przetwarzania obrazu i osobnych monet w kolory niezależne od warunków oświetleniowych. Jednak nawet ta technika nie działa idealnie (i obejmuje bibliotekę obrazów / histogramów dla mapowań - do których nie chcę wchodzić) i nie robi to również o wiele bardziej skomplikowana metodologia architektury sieci neuronowej. W rzeczywistości ten dokument stwierdza w sposób abstrakcyjny, że:

"current machine colour constancy algorithms are not good enough for colour-based 
 object recognition.".

Nie oznacza to, że nie ma tam o wiele więcej aktualnych artykułów na ten temat, ale nie mogę ich znaleźć i nie wydaje się, aby był to obecnie bardzo aktywny obszar badawczy.

Odpowiedź przez AVB był również pomocny i mam spojrzał na L B * krótko.

"The nonlinear relations for L*, a*, and b* are intended to mimic the nonlinear
response of the eye. Furthermore, uniform changes of components in the L*a*b* colour
space aim to correspond to uniform changes in perceived colour, so the relative 
perceptual differences between any two colours in L*a*b* can be approximated by 
treating each colour as a point in a three dimensional space."

Z tego, co przeczytałem, transformacja do tej przestrzeni kolorów dla obrazów zależnych od urządzenia będzie trudna - ale przyjrzę się temu szczegółowo (z myślą o jakiejś implementacji), kiedy będę miał trochę więcej czasu.

Nie wstrzymuję oddechu na konkretne rozwiązanie tego problemu i po próbie z L A B * będę zaniedbywał kolor monety i chciałbym sprawdzić moje obecne algorytmy detekcji geometrycznej (dokładna eliptyczna transformacja Hougha itp.).

Dziękuję wam wszystkim. I na koniec do tego pytania, oto ten sam obraz z nowym algorytmem detekcji geometrycznej, który nie ma rozpoznawania kolorów:

wprowadź opis zdjęcia tutaj

Księżycowy rycerz
źródło
1
Czy obrazy zawsze będą miały ten sam kolor tła? Czy możesz wprowadzić do obrazu jakiś inny obiekt o „standardowym kolorze”? Jeśli tak, możesz dostosować się do różnych warunków oświetleniowych. Jeśli nie, może być ciężko ..
onestop
2
To nie tylko oczywiście kolorowe światło. Jestem prawie pewien, że światło słoneczne, światło fluorescencyjne i światło żarowe mają kolory, które są wystarczająco różne, aby zaburzyć dopasowanie kolorów HSB, nawet jeśli nasze oczy w jakiś sposób dostosowują się, aby nie dostrzegać, że rzeczy zmieniają kolor.
Peter Shor
2
(+1) Pytanie jest interesujące i trudne. Wydaje mi się, że wymaga to dopracowania, aby mieć szansę na dobrą odpowiedź. Jak obecnie stwierdzono, graniczy z byciem złym. Aby uzyskać praktyczne rozwiązanie, musisz podać więcej szczegółów na temat zakresu środowisk, w których chcesz móc przeprowadzić tę klasyfikację. Jakie są kolorowe tła? Zawsze ta sama liczba monet? Czy zawsze będziesz mieć kolorowy obraz? Dobre oświetlenie otoczenia? Znajomość tego rodzaju cech może dostarczyć wskazówek w kierunku rozwiązania.
kardynał
2
Myślę, że masz do czynienia z problemem „trwałości kolorów”. Inne wyszukiwane hasła to „pomijanie źródła światła” lub „pomijanie tła”. Jest to nierozwiązany problem w nauce o wizji.
caracal
1
Żałuję, że nie mogę dać +1 ponownie za miłe uzupełnienie! Bardzo interesujące rzeczy.
Matt Parker

Odpowiedzi:

6

Dwie rzeczy na początek.

Jeden, definitywnie nie działa w RGB. Ustawieniem domyślnym powinna być przestrzeń kolorów Lab (aka CIE L * a * b *). Odrzuć L. Od obrazu to wygląda awspółrzędnych daje najwięcej informacji, ale prawdopodobnie powinien wykonać analizę głównych komponentów na ai bi pracy wzdłuż pierwszej (najważniejsze) komponentu, tak aby zachować rzeczy proste. Jeśli to nie zadziała, możesz spróbować przejść na model 2D.

Aby to wyczuć, w atrzech żółtawych monetach wskaźniki STD są niższe niż 6, a środki 137 („złote”), 154 i 162 - powinny być rozróżnialne.

Po drugie, problem z oświetleniem. Tutaj musisz dokładnie zdefiniować swój problem. Jeśli chcesz rozróżniać bliskie kolory pod dowolnym oświetleniem i w dowolnym kontekście - i tak nie możesz tego nie lubić. Jeśli martwisz się tylko lokalnymi zmianami jasności, Lab w większości się tym zajmie. Jeśli chcesz pracować zarówno w świetle dziennym, jak i żarowym, czy możesz zapewnić jednolite białe tło, jak na przykładowym obrazie? Ogólnie, jakie są twoje warunki oświetleniowe?

Wygląda na to, że Twoje zdjęcie zostało zrobione za pomocą dość taniego aparatu. Prawdopodobnie ma jakąś funkcję automatycznego balansu bieli, która bardzo źle psuje kolory - wyłącz ją, jeśli możesz. Wygląda również na to, że obraz został zakodowany w YCbCr w pewnym momencie (zdarza się często, jeśli jest to kamera wideo) lub w podobnym wariancie JPG; informacja o kolorze jest poważnie niedopróbkowana. W twoim przypadku może to być naprawdę dobre - oznacza to, że kamera zrobiła dla ciebie odszumianie w kanałach kolorów. Z drugiej strony prawdopodobnie oznacza to, że w pewnym momencie informacja o kolorze również została skwantowana silniej niż jasność - to nie jest tak dobre. Najważniejsze tutaj - aparat ma znaczenie, a to, co zrobisz, powinno zależeć od aparatu, którego będziesz używać.

Jeśli coś tu nie ma sensu - zostaw komentarz.

AVB
źródło
Dzięki za odpowiedź. Nie mogę zapewnić żadnego z powyższych. Jest to aplikacja mobilna, która zlicza monety (dowolną liczbę monet) jednym kliknięciem przycisku (i jest bardzo szybka!). Tak więc oświetlenie może się bardzo różnić i nie ma spójnego tła. Uważam, że klasyfikacja typów monet według kolorów w ten sposób (jak zauważyłeś) nie jest możliwa. Jednak podoba mi się twoja odpowiedź dotycząca używania L A B * i uważam, że jest to najlepsza oferowana odpowiedź. W świetle tego masz odpowiedź i nagrodę. Dzięki jeszcze raz.
MoonKnight
6

W duchu burzy mózgów podzielę się pomysłami, które możesz wypróbować:

  1. Wypróbuj Bardziej? Wygląda na to, że Hue dał ci całkiem niezły rozróżnienie między srebrem a miedzią / złotem, choć nie między miedzią a złotem, przynajmniej w jednym pokazanym tutaj przykładzie. Czy badałeś bardziej szczegółowo przy użyciu Barwy, aby sprawdzić, czy odróżnienie srebra od miedzi / złota jest opłacalne?

    Mógłbym zacząć od zebrania kilku przykładowych obrazów, które ręcznie oznaczyłeś etykietą, i obliczenia Barwy każdej monety na każdym obrazie. Następnie możesz spróbować histogramować je, aby sprawdzić, czy Hue wygląda na wiarygodny sposób dyskryminacji. Mógłbym również spróbować spojrzeć na średni Odcień każdej monety, na garść przykładów takich jak ten, który tutaj przedstawiłeś. Możesz także wypróbować Nasycenie, ponieważ wyglądało to na pomocne.

    Jeśli to się nie powiedzie, możesz zredagować swoje pytanie, aby pokazać, co próbowałeś i podać kilka przykładów, aby zwięźle zilustrować, dlaczego jest to trudne lub gdzie nie.

  2. Inne przestrzenie kolorów? Podobnie możesz spróbować przekształcić w chromacity rg, a następnie eksperymentować, aby sprawdzić, czy wynik jest pomocny w odróżnieniu srebra od miedzi / złota. Możliwe, że pomoże to dostosować się do zmienności oświetlenia, więc warto spróbować.

  3. nnn

    npnnonp,oToT(p)oiT(pi)TT(x)=x+c(mod360)c

  4. Porównaj z obrazkami referencyjnymi? Zamiast używać koloru monety, możesz spróbować dopasować to, co jest wydrukowane na monecie. Załóżmy na przykład, że wykryłeś monetę na obrazie i przypuszczasz, że jest to moneta jednofuntowa. Można wziąć obraz odniesienia z monety jednego funta i test czy wydaje się dopasować .CRRC

    Musisz uwzględnić różnice w pozie. Zacznę od założenia, że ​​masz czołowy wizerunek monety, jak na przykładowym zdjęciu. Zatem najważniejszą rzeczą, którą musisz uwzględnić, jest rotacja: nie wiesz z góry, ile jest obróconych. Prostym podejściem może być zgarniania zakres możliwych kątów obrotu , obrót w i sprawdza, czy wydaje się dopasować . Aby przetestować dopasowanie, możesz użyć prostej miary różnicowej opartej na pikselach: tj. Dla każdej współrzędnej obliczyć (różnica między wartością piksela wCθRθRθC(x,y)D(x,y)=Rθ(x,y)C(x,y)Rθi wartość piksela w ); następnie normę (suma kwadratów) lub coś takiego, aby połączyć wszystkie wartości różnic w jedną miarę, jak blisko masz dopasowania (tj. ). Konieczne będzie użycie dostatecznie małego kroku, aby różnica pikseli prawdopodobnie zadziałała. Na przykład na przykładowym zdjęciu moneta o wadze 1 funta ma promień około 127 pikseli; jeśli przeskakujesz wartości , zwiększając się o stopnia na każdym kroku, wtedy będziesz musiał wypróbować tylko około 1460 różnych wartości obrotu, a błąd na obwodzie monety będzie najbliższy przybliżeniu do prawdziwejCL2(x,y)D(x,y)2θ0.25θ powinna wynosić co najwyżej jedną czwartą piksela, który jest wystarczająco mały, aby różnica pikseli mogła się powieść.

    Możesz poeksperymentować z wieloma odmianami tego pomysłu. Na przykład możesz pracować z wersją obrazu w skali szarości; pełny RGB i użyj normy wszystkich trzech różnic R, G, B; pełny HSB i stosuje normę wszystkich trzech różnic H, S, B; lub pracuj tylko z płaszczyzną Barwa, Nasycenie lub Jasność. Inną możliwością byłoby uruchomienie detektora krawędzi zarówno na jak i , a następnie dopasowanie uzyskanego obrazu krawędzi.L2L2RC

    Aby uzyskać solidność, możesz mieć wiele różnych obrazów odniesienia dla każdej monety (w rzeczywistości każdej strony każdej monety) i wypróbować wszystkie obrazy odniesienia, aby znaleźć najlepsze dopasowanie.

    Jeśli zdjęcia monet nie są pobierane bezpośrednio od siebie, w pierwszej kolejności możesz obliczyć elipsę reprezentującą obwód monety na obrazie i określić kąt, pod jakim moneta jest oglądana. Pozwoli ci to obliczyć, jak wyglądałby pod tym kątem, przed wykonaniem dopasowania.CR

  5. Sprawdź, jak zmienia się kolor w zależności od odległości od centrum? Oto możliwy pośredni krok pomiędzy „średnim kolorem monety” (pojedyncza liczba, tj. 0-wymiarowa) a „całym obrazem monety” (obraz 2-wymiarowy). Dla każdej monety można obliczyć 1-wymiarowy wektor lub funkcję , gdzie reprezentuje średni kolor pikseli w odległości około od środka monety. Możesz następnie spróbować dopasować wektor dla monety na obrazie do wektora dla obrazu odniesienia tej monety.ff(r)rfCCfRR

    Może to pomóc skorygować różnice w oświetleniu. Na przykład możesz pracować w skali szarości lub w pojedynczej płaszczyźnie bitowej (np. Barwa, Nasycenie lub Jasność). Lub możesz najpierw znormalizować funkcję , odejmując średnią: , gdzie jest średnim kolorem monety - a następnie spróbuj dopasować do .fg(r)=f(r)μμgCgR

    Zaletą tego podejścia jest to, że nie trzeba wnioskować, o ile moneta została obrócona: funkcja jest niezmienna.f

    Jeśli chcesz eksperymentować z tym pomysłem, funkcję dla wielu różnych przykładowych obrazów i je. Następnie powinieneś być w stanie je wizualnie sprawdzić, aby zobaczyć, czy funkcja wydaje się mieć względnie spójny kształt, niezależnie od oświetlenia. Może być konieczne wypróbowanie tego dla wielu różnych możliwości (skala szarości, każdy z bitplanów HSB itp.).fC

    Jeśli moneta mogła nie zostać sfotografowana bezpośrednio z przodu, ale prawdopodobnie pod kątem, najpierw musisz prześledzić elipsę obwodu , aby wydedukować kąt, z którego została sfotografowana, a następnie skorygować to w obliczenie .CCf

  6. Spójrz na algorytmy widzenia dla stałości kolorów. Społeczność zajmująca się wizją komputerową badała stałość kolorów , problem korygowania nieznanego źródła oświetlenia; patrz np. ten przegląd . Możesz zbadać niektóre algorytmy uzyskane dla tego problemu; próbują wywnioskować źródło oświetlenia, a następnie je skorygować, aby uzyskać obraz, który zostałby uzyskany, gdyby zdjęcie zostało zrobione z referencyjnym źródłem oświetlenia.

  7. Spójrz na indeksowanie stałymi kolorami. Podstawową ideą CCCI , jak rozumiem, jest najpierw anulowanie nieznanego źródła oświetlenia poprzez zastąpienie wartości R każdego piksela stosunkiem między jego wartością R a jedną z wartości R sąsiada; i podobnie dla samolotów G i B. Chodzi o to, że (miejmy nadzieję) te współczynniki powinny być teraz w większości niezależne od źródła oświetlenia. Następnie, gdy uzyskasz te proporcje, obliczasz histogram proporcji obecnych na obrazie i używasz tego jako sygnatury obrazu. Teraz, jeśli chcesz porównać obraz monety z obrazem referencyjnym , możesz porównać ich podpisy, aby zobaczyć, czy pasują do siebie. W twoim przypadku może być konieczne dostosowanie kąta, jeśli obraz monetyCRC nie zostało postawione na czele - ale wydaje się, że może to pomóc zmniejszyć zależność od źródła oświetlenia.

Nie wiem, czy któryś z nich ma szansę zadziałać, ale są to pomysły, które możesz wypróbować.

DW
źródło
3

Ciekawy problem i dobra praca.

Spróbuj użyć środkowej wartości koloru zamiast średniej. Będzie to bardziej odporne na wartości odstające z powodu jasności i nasycenia. Spróbuj użyć tylko jednego ze składników RGB zamiast wszystkich trzech. Wybierz komponent, który najlepiej rozróżnia kolory. Możesz spróbować wydrukować histogramy wartości pikseli (np. Jeden ze składników RGB), aby uzyskać wyobrażenie o właściwościach rozkładu pikseli. Może to sugerować rozwiązanie, które nie jest od razu oczywiste. Spróbuj narysować komponenty RGB w przestrzeni 3D, aby zobaczyć, czy podążają za jakimkolwiek wzorem, na przykład mogą leżeć blisko linii wskazującej, że liniowa kombinacja komponentów RGB może być lepszym klasyfikatorem niż pojedynczy.

martino
źródło
Dobry krzyk z medianą, w rzeczywistości również to zakodowałem i to również kiepskie pod względem ustalenia prawidłowego koloru. Dzięki podejściu histogramowemu jestem świadomy kosztów obliczeniowych; jak tylko zacznę zapętlać piksele w 2D, poniosę opłaty! Niemniej jednak może być warte umieszczenia czegoś takiego (jak wskazałeś) w celu ustalenia jakichkolwiek korelacji. Stworzyłem różnego rodzaju wykresy dla komponentów RGB, a ze względu na różne warunki oświetleniowe (w wyniku robienia zdjęć w różnych lokalizacjach) wartości RGB mogą się mocno nakładać na wszystkie trzy typy monet.
MoonKnight
Zastanawiałem się również nad dopasowaniem modelu do oszacowania prawdopodobieństwa, że ​​punkt przestrzeni kolorów należy do określonego typu monety. Patrzyłem również na modelowanie mieszanki Gaussa, ale jak dotąd nie posunąłem się za daleko. Zostałem również poinformowany o innym (nieco arbitralnym, ale prostszym) podejściu, a mianowicie interpolacji najbliższego sąsiada. Dziękuję za Twój czas.
MoonKnight
1
Na zupełnie innym torze, inną różnicą między monetami jest wzór z przodu / tyłu (chociaż niektóre mogą mieć ten sam wzór z jednej strony). Co z krzyżem korelującym zestaw wzorów z pikselami monety (lub z wykorzystaniem wzajemnych informacji) aby pomóc ustalić, na którą monetę patrzysz. Dzięki kombinacji proporcji, koloru w pikselach i dopasowanemu projektowi prawdopodobnie będziesz w stanie zmniejszyć liczbę fałszywych odkryć.
martino
Myślałem o tym - ale wymaga to zbyt wiele od obecnego oprogramowania do rozpoznawania i byłoby ogromnym zadaniem do pisania od zera (OCR?). Istnieje również ogromna różnorodność grafiki na takich monetach, co sprawia, że ​​taka implementacja jest koszmarem konserwacyjnym. Później zamierzam zagrać - opiszę to, co znajdę. Dzięki jeszcze raz.
MoonKnight
Dlaczego głosowanie negatywne? Jeśli jest jakiś problem z odpowiedzią, pomocne byłoby wskazanie go - nie widzę żadnego
martino