Mam obraz RGB z różnymi znakami. Moim głównym celem jest policzenie znaków, które mają kontakt z granicami obrazu.
Podejście i problem
Zacząłem od załadowania obrazu [rys. 1], a następnie przekonwertował go na skalę szarości i zastosował filtr środkowy, aby pozbyć się szumów [ryc. 2]. Następnie binaryzowałem go z progiem 0,2, co dało wynik na rycinie 3. W tym momencie dostałem mój binaryzowany obraz, ale problem polega na tym, że niektóre części, które należą do tego samego znaku, pojawiają się w różnych regionach, zamiast tylko jednego. Teraz moim celem jest scalenie regionów należących do tego samego obiektu, dzięki czemu mógłbym bwlabel
policzyć, ile znaków jest na obrazie, i użyć, imclearborder
aby pozbyć się znaków na granicy, i użyć bwlabel
ponownie, aby uzyskać różnicę między dwójka.
Moje podejście było użyć bwmorph
, Dilate
aby rozszerzać obiekty, a następnie starają się wypełnić je imfill
, holes
. Problem polega jednak na tym, że jeśli je rozrzedzę w niewielkiej ilości [ryc. 4], imfill
wydaje się , że ich nie wypełnia, jeśli rozszerzę je o dużą ilość [Ryc. 5] wszystkie obiekty zaczną się łączyć :(
Kod
img=im2double(imread('image.png')); figure, imshow(img)
img_gray=rgb2gray(img); imshow(img_gray);
img_mediana=medfilt2(img_gray, [3 3]); figure, imshow(img_mediana);
img_bin=im2bw(img_mediana, 0.2); imshow(img_bin)
img_dilate=bwmorph(img_bin, 'Dilate', 10); imshow(img_dilate)
img_fill=imfill(img_dilate, 'Holes'); figure, imshow(img_fill)
Ryciny
Ryc. 1 :
Ryc. 1 http://dl.dropbox.com/u/5272012/1.png
Ryc. 2 :
rys. 2 http://dl.dropbox.com/u/5272012/2.png
Ryc. 3 :
rys. 3 http://dl.dropbox.com/u/5272012/3.png
Ryc. 4 :
rys. 4 http://dl.dropbox.com/u/5272012/4.png
Ryc. 5 :
źródło
Odpowiedzi:
Moim zdaniem erozja dylatacyjna jest bardzo podstawowym narzędziem. Masz bardzo silną bazę informacyjną i całkiem przyzwoity obraz wejściowy, aby podejmować takie decyzje.
Oto mój pogląd:
Biorąc pod uwagę rozsądny sukces, który pokazałeś, przechodząc od ryc. 1 do 3, możesz zidentyfikować i podzielić poszczególne znaki.
Zakładając, że znasz wcześniej znaki, możesz zastosować przyzwoite szybkie algorytmy, aby dopasować wzór. W przypadku, gdy dokładne wzory nie są znane, możesz po prostu określić zewnętrzny kształt wzoru.
Na podstawie klasyfikacji zawsze można zdefiniować środek ciężkości każdego dopasowanego wzoru oraz jego szerokość i wysokość. Jeśli położenie środka ciężkości X, Y jest zbyt blisko granicy - tj. lub poza krawędzią, podobnie możesz ubiegać się również o oś Y.centroid(x)<0 centroid(x)>imagewidth−shapewidth
Ponieważ martwisz się tylko tym, co spadnie na krawędź - powinieneś zacząć od każdej krawędzi i rozpocząć dopasowanie wzoru. Zacznij dopasowanie częściowe wzór / kształt i jeśli częściowy wzór / kształt robi test, obiekt JEST odcięciu na krawędzi.
Oto kilka referencji, które mogą pomóc w dobrym sformułowaniu problemu.
Ten artykuł jest bardzo dobry do zrozumienia wielu podstawowych informacji na temat Znaków / żetonów, z którymi masz do czynienia.
Anil K. Jain i Aditya Vailaya Wyszukiwanie oparte na kształtach : studium przypadku z bazami znaków towarowych rozpoznawanie obrazów 1998, vol. 31, nr 9, s. 1369–1390
Istnieje wiele elementów badawczych, które dotyczą częściowego lub niedrożnego dopasowania kształtu / wzoru.
Eli Sabre, Yaowu Xu, A. Murat Tekalp Częściowe rozpoznawanie kształtu przez dopasowanie do macierzy w celu częściowego dopasowania etykietowania obrazu z przewodnikiem Rozpoznawanie wzoru 38 (2005) 1560 - 1573
Rozwinie tę odpowiedź dla bardziej szczegółowych zapytań, jeśli zastosujesz to podejście.
źródło
Oto mała inspiracja pokazująca przeciwieństwo tego, czego szukasz.
Zacznij od rys. 3.
źródło