Wyodrębnianie poszczególnych elementów obrazka
Ostatnio zmodyfikowano 2014-09-22 15:57
kubawal Temat założony przez niniejszego użytkownika |
Wyodrębnianie poszczególnych elementów obrazka » 2014-09-21 11:40:11 Witam! Zabrałem się za pisanie programu rozpoznającego pismo. Potrzebuję algorytmu, który z obrazku z białym tłem, na którym są zapisane litery (w pewnych odstępach), dla każdej liter wyznaczyłby prostokątny obszar, który ona zajmuje. Można założyć, że litery będą tylko i wyłącznie czarne, a tło całe białe (mam już algorytm do progowania) std::vector < unsigned char > px; unsigned w, h;
lodepng::decode( px, w, h, infile );
for( int i = 0; i < px.size(); i += 4 ) { unsigned char & r = px[ i ], & g = px[ i + 1 ], & b = px[ i + 2 ], & a = px[ i + 3 ]; }
lodepng::encode( outfile, px, w, h );
Gdyby ktoś dysponował podobnym algorytmem, lub wiedział gdzie go znaleźć to pisać :) |
|
OSA_PL |
» 2014-09-22 12:27:47 Pierwsze co mi wpada na myśl to po znalezieniu czarnego piksela użyć algorytmu flood fill i zapisać minimalną i maksymalną wartość x i y czarnych pikseli. |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2014-09-22 14:52:12 Mi bardziej chodzi o wykrycie, który piksel należy do którego obiektu. Takie samo pytanie zadalem na stackoverflowie i wyszedł całkiem fajny algorytm: Computing AABB of many object on image. Jest tylko jeden problem: litera np. 'i' ma dwie części. Mój algorytm wykryje kropkę i resztę litery jako 2 osobne obiekty. Jak program ma wykryć je jako jedną literę? Nie może to być na podstawie np. odległości kropki od reszty, bo musi rozpoznawać różne kroje pisma. Jedyny pomysł jaki przychodzi mi do głowy to jakaś analiza na podstawie rozmiaru innych liter, ale nie wiem jak by to zrobić. |
|
Parapet |
» 2014-09-22 15:53:35 http://4programmers.net/C_sharp/Gotowce/Sieci_neuronowe_aproksymacja_i_rozpoznawanie_pisma |
|
OSA_PL |
» 2014-09-22 15:57:16 @kubawal Ten algorytm działa tak samo jak ten, który ja podałem. Co do 'i' to przy założeniu, że tekst nie jest napisany pod skosem, ja sprawdzałbym czy nad znalezionym obiektem w odległości np. połowy wysokości tego obiektu(trzeba to dobrać doświadczalnie) nie ma innego obiektu. Jeżeli jest tam jakiś obiekt łączę te dwa obiekty, przepuszczam przez sieć neuronową i sprawdzam czy sieć rozpoznała to jako literę 'i', jeżeli tak to zostawiam te obiekty połączone w innym przypadku zostawiam je oddzielnie. Przydało by się jeszcze porównać wielkość obiektów, żeby nie zrzucać za dużo roboty na sieć neuronową. Ewentualnie można nauczyć sieć neuronową tak by rozpoznawała literę 'i' bez kropki. |
|
« 1 » |