Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Implementacja algorytmu binearyzacji(automatyczne szukanie)

CeHa7 26 Lis 2009 15:01 1903 14
  • #1 26 Lis 2009 15:01
    CeHa7
    Poziom 15  

    Witam! Chciałbym się dowiedzieć drodzy koledzy jak zaimplementować taki algorytm, mianowicie chodzi mi o automatyczne szukanie progu binearyzacji. Czy ktoś posiada dość jasno opisany ten algorytm? Może być w postaci kodu lub jakiegoś schematu blokowego. Dzięki z góry i pozdrawiam!!

    0 14
  • #3 26 Lis 2009 17:29
    CeHa7
    Poziom 15  

    Zagadnienie jest z dziedziny przetwarzania obrazów cyfrowych, chodzi tu o to żeby RGB zamienić na YUV a następnie na obraz monochromatyczny(czarno biały) a przy tym wydobyć obiekt od tła. Binearyzacja polega na tym iż zostaje ustawiony próg(automatyczny albo ręcznie) dla którego barwy poniżej tego progu zamieniamy na biały kolor(tło) a powyżej na czarny(obiekt). Próbowałem już średnią z całej tablicy oraz średnią z max wartości i min ale to nie bardzo się spisuje. Dzięki za zainteresowanie

    0
  • #4 26 Lis 2009 18:16
    Dżyszla
    Poziom 42  

    Jeśli chcesz zamieniać na monochromatyczny, to po prostu ustaliłbym taki próg jako stałą wartość średniej ważonej (bo to odpowiada najlepiej przejściu na skalę szarości/monochrom.) kolorów. Jeśli koniecznie ma to być jakiś adaptacyjny algorytm, to najlepiej, aby była to średnia dla skrajnych wartości kolorów z całego obrazu (z ewentualnym odrzucaniem "błędów" czyli iluś tam skrajnych wartości i przyjmowanie np 3 od lewej i od prawej pod względem średniej dla skali szarości wartości ze wszystkich pikseli obrazu). Jeśli zaś chcesz tworzyć kontur i np wykonać czarną sylwetkę twarzy na białym tle, to powinieneś oprzeć się na kontrastach pomiedzy pikselami (lub grupami pikseli sąsiadujących), w ten sposób wyznaczając krawędzie, a następnie zamalowując zamknięty w ten sposób obszar. Jednakże taka metoda może skończyć się zamalowaniem całego obszaru na jeden kolor.

    0
  • #5 26 Lis 2009 18:43
    CeHa7
    Poziom 15  

    No powiem Ci że masz rację bo właśnie wszystkie te operacje już zrobiłem i wyniki są do siebie uderzająco podobne. Ale nie dało mi to spokoju i sprawdziłem wyniki tych samych obrazów z Matlabem i efekt okazał się ten sam więc powinno być ok. Teraz mam jeszcze jedno pytanie mianowicie program ten ma za zadaniem analizy obrazu z kamery dla robota mobilnego, który będzie się poruszać wyszukując znaczniki w kształcie koła i teraz potrzebuję żeby znaleźć współrzędne środka tego koła oczywiście już po binaryzacji. Potrzebny mi jest najprostszy sposób znalezienia tych współrzędnych. Dzięki

    0
  • #6 26 Lis 2009 18:48
    Dżyszla
    Poziom 42  

    jeśli to koło (a nie elipsa) to wystarczy środek odcinka łączącego najdalej oddalone punkty bądź to w osi x, bądź y. A więc lecisz np wierszami od góry w poszukiwaniu niebiałego piksela (lub dla eliminacji błedów - nie białych 3 sąsiadujących pikseli). Po znalezieniu zapamiętujesz współrzędne. Następnie to samo analizując obraz od dołu. Nastepnie wyznaczasz środek odcinka.

    0
  • #7 28 Lis 2009 14:17
    CeHa7
    Poziom 15  

    Dobra to mam załatwione ładnie wylicza mi współrzędne środka. Ale teraz zastanawiam się jak rozróżnić z pośród tylu przedmiotów które wychwyci kamera, znacznik w kształcie koła(czerwonego). Chodzi o to by pominąć zbędną analizę

    0
  • #8 28 Lis 2009 15:00
    Dżyszla
    Poziom 42  

    mając współrzędne środka oraz dowolny punkt z obrysu możesz sprawdzić, czy znajdziesz punkty tak samo oddalone pod środka pod różnym kątem (od 0 do 360 z jakimś tam skokiem) i czy nieznacznie więcej niż promień nie ma punktu czarnego. Oczywiście doliczyć do tego jakiś margines błędu np poprzez wyznaczenie środka pierścienia lub nieznacznie zmniejszając promień, jeśli jest to koło. Myślę, że taka analiza wystarczy.

    0
  • #9 28 Lis 2009 20:20
    CeHa7
    Poziom 15  

    Dżyszla w sumie nie głupi pomysł ale jest jedno ale, mianowicie nie wiadomo jaki będzie promień koła ponieważ odległość od znacznika może być różna a co za tym idzie i promień koła będzie się zmieniał. A może coś z kolorem?

    0
  • #11 04 Gru 2009 12:17
    CeHa7
    Poziom 15  

    Hmm po przetestowaniu mojego algorytmu na zdjęciach przechwyconych z kamery niestety muszę stwierdzić że nie działa on prawidłowo i wydaje mi się że przyczyną jest tu różnica padającego światła(oświetlenia). W idealizowanych warunkach czyli narysowanych przeze mnie bitmapach wszystko działa prawidłowo no ale jak wiadomo nie o to chodzi. Teraz mam pytanie, a może bardziej problem jak z tym sobie poradzić? Dzięki za zainteresowanie i pozdrawiam!

    0
  • #14 04 Gru 2009 20:43
    Dżyszla
    Poziom 42  

    Obawiam się, że w ten sposób tego nie wyłapiesz :( Tło jest zdecydowanie zbyt złożone. Jeśli kółko jest czerwone można by spróbować popracować wyłącznie na tym kanale. W przeciwnym wypadku chyba będzie trzeba wrócić do algorytmu wyszukiwania krawędzi.

    Tak wygląda obraz po zaakcentowaniu krawędzi (Photoshop):
    Implementacja algorytmu binearyzacji(automatyczne szukanie)

    Można by teraz próbować na podstawie tego coś wyczaić...

    Kłopotem są dwa fakty - skala szarości kółka i tła niewiele się różnią. Dwa: kółko zajmuje bardzo niewielki obszar całego obrazu, przez co odpadają algorytmy bazujące na przeważającym kolorze.

    0
  • #15 04 Gru 2009 21:37
    CeHa7
    Poziom 15  

    No powiem Ci że doszedłem do tego samego wniosku. Ale w sumie gdyby jednak tło było trochę bardziej jednorodne bo w sumie te znaczniki będą raczej na ścianie czy też podłodze to powinno raczej spełnić swoją rolę. Tylko teraz też będzie odgrywać tu pierwsze skrzypce światło o to kilka przykładów. Zdjęcia robione zostały na dywanie, pierwsze poddane binaryzacji tylko a drugie z wydzielenie kanału R i jeszcze jedno z R

    0