Zliczanie liczby obiektów przeciętych ramką obrazu w MATLAB

9

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 bwlabelpoliczyć, ile znaków jest na obrazie, i użyć, imclearborderaby pozbyć się znaków na granicy, i użyć bwlabelponownie, aby uzyskać różnicę między dwójka.

Moje podejście było użyć bwmorph, Dilateaby 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], imfillwydaje 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 :

rys. 5 http://dl.dropbox.com/u/5272012/5.png

Rui Trovisco
źródło
Moje pytanie brzmi: co dokładnie mówi ci, że znak jest zepsuty? Jak naprawdę chcesz umieścić wynik? mam na myśli - czy chcesz po prostu pokolorować wszystkie wycięte znaki? czy naprawdę chcesz wymienić każdy znak i sklasyfikować cut / full?
Dipan Mehta

Odpowiedzi:

3

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:

  1. 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.

  2. 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.

  3. 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)<0centroid(x)>imagewidthshapewidth

  4. 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.

Dipan Mehta
źródło
Hej! Nie mogę używać dopasowywania wzorców, ponieważ zajmie to bardzo dużo czasu i zbyt dużo pracy obliczeniowej. Również skala obiektów (znaków) może być zmienna (profesor daje nam losowe obrazy, w których skala znaków może wynosić od + 30% do -30%, więc dopasowanie wzorca jest bezużyteczne. Potrzebuję szybszego podejścia w aby rozwiązać ten problem
Rui Trovisco
@RuiTrovisco Rozumiem to. Właśnie dlatego napisałem - poprawiłbym odpowiedź na podstawie twoich opinii. Dodałem kilka komentarzy do twojego pytania. Cofnij się tam.
Dipan Mehta
1

Oto mała inspiracja pokazująca przeciwieństwo tego, czego szukasz.

Zacznij od rys. 3.

% Find background
labels = bwlabel(~fig3);
[n,idx] = hist(labels(:),0:max(labels(:)));
[bgrSize bgrLableIdx] = max(n);
bgr = (labels == idx(bgrLableIdx));
bgr = imopen(bgr,strel('disk',3));

% Remove border objects and cleanup
borderCleared = imclearborder(~bgr);
borderCleared = imopen(borderCleared,strel('disk',3));

wprowadź opis zdjęcia tutaj

mola
źródło