Zählen der Anzahl der Objekte, die in MATLAB vom Bildrand geschnitten werden


9

Ich habe ein RGB-Bild mit verschiedenen Zeichen. Mein Hauptziel ist es, die Zeichen zu zählen, die mit den Bildrändern in Kontakt stehen.

Ansatz und Problem

Ich begann mit dem Laden des Bildes [Abb. 1], konvertierte es dann in Graustufen und wandte einen Medianfilter an, um etwas Rauschen zu beseitigen [Abb. 2]. Dann habe ich es mit einem Schwellenwert von 0,2 binärisiert, was zu Abbildung 3 führte. Zu diesem Zeitpunkt habe ich mein binärisiertes Bild erhalten, aber das Problem ist, dass einige Teile, die zum selben Zeichen gehören, in verschiedenen Regionen statt nur in einem angezeigt werden. Jetzt ist es mein Ziel, die Regionen, die zu demselben Objekt gehören, zusammenzuführen, damit ich bwlabelzählen kann, wie viele Zeichen sich im Bild befinden, und die Zeichen imclearborderim Rand entfernen und bwlabelerneut verwenden kann, um den Unterschied zwischen den Objekten zu ermitteln die Zwei.

Mein Ansatz war es bwmorph, Dilatedie Objekte zu verwenden , zu erweitern und dann zu versuchen, sie mit imfill, holes. Das Problem ist jedoch, dass wenn ich sie in einer kleinen Menge dehne [Abb. 4], das imfillscheint sie nicht zu füllen, wenn ich sie um einen großen Betrag erweitere [Abb. 5], beginnen alle Objekte zu verschmelzen :(

Code

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)

Zahlen

Abb. 1 :

Abb. 1 http://dl.dropbox.com/u/5272012/1.png

Abb. 2 :

Abb. 2 http://dl.dropbox.com/u/5272012/2.png

Abb. 3 :

Abb. 3 http://dl.dropbox.com/u/5272012/3.png

Abb. 4 :

Abb. 4 http://dl.dropbox.com/u/5272012/4.png

Abb. 5 :

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


Meine Frage ist, was genau sagt Ihnen, dass das Zeichen gebrochen ist? Wie wollen Sie die Ausgabe wirklich setzen? Ich meine - willst du nur alle Zeichen kolorieren, die geschnitten werden? oder möchten Sie wirklich jedes Zeichen auflisten und cut / full klassifizieren?
Dipan Mehta

Antworten:


3

Meiner Meinung nach sind Dilatationserosion sehr grundlegende Werkzeuge. Sie haben eine sehr starke Informationsbasis und ein recht anständiges Eingabebild, um solche Entscheidungen zu treffen.

Hier ist meine Ansicht:

  1. Bei einem vernünftigen Erfolg, den Sie von Abb. 1 bis 3 gezeigt haben, können Sie einzelne Zeichen identifizieren und segmentieren.

  2. Angenommen, Sie kennen bereits Zeichen, können Sie einen anständigen schnellen Algorithmus anwenden, um den Mustervergleich durchzuführen. Falls die genauen Muster nicht bekannt sind, können Sie einfach die äußere Form des Musters identifizieren.

  3. Basierend auf der Klassifizierung können Sie immer den Schwerpunkt jedes übereinstimmenden Musters und seine jeweilige Breite und Höhe definieren. Wenn sich die Position des Schwerpunkts X, Y zu nahe am Rand befindet - dh oder außerhalb des Randes, können Sie auch die Y-Achse anwenden.c e n t r o i d ( x ) > i m a g e w i d t h - s h a p e w i d t hcentroid(x)<0centroid(x)>imagewidthshapewidth

  4. Da Sie sich nur Gedanken darüber machen, was auf die Kante fällt, sollten Sie nur mit jeder Kante beginnen und dort mit dem Mustervergleich beginnen. Starten Sie die Teilmuster / Formschluss und wenn das Teilmuster / Form Spiel macht das Objekt IS geschnitten auf dem Rand.

Hier sind einige Referenzen, die Ihnen helfen könnten, das Problem gut zu formulieren.

Dieses Papier ist sehr gut zu verstehen, viele Grundlagen über Zeichen / Token, mit denen Sie es zu tun haben.

Anil K. Jain und Aditya Vailaya Shape-Based Retrieval: Eine Fallstudie mit Markenbilddatenbanken Pattern Recognition 1998, vol. 31, Nr. 9, S. 1369-1390

Es gibt viele Forschungselemente, die sich mit partieller oder okkludierter Form- / Musterübereinstimmung befassen.

Eli Sabre, Yaowu Xu, A. Murat Tekalp Teilformerkennung durch Submatrixanpassung zur Teilanpassung geführte Bildbeschriftung Pattern Recognition 38 (2005) 1560 - 1573

Erweitert diese Antwort für spezifischere Fragen, wenn Sie diesen Ansatz wählen.


Hallo! Ich kann den Mustervergleich nicht verwenden, da dies sehr lange dauert und zu viel Rechenarbeit erfordert. Auch die Skalierung der Objekte (Zeichen) kann variabel sein (der Professor gibt uns zufällige Bilder, bei denen die Skalierung der Zeichen sehr zwischen + 30% und -30% liegen kann, sodass ein Mustervergleich nutzlos ist. Ich brauche einen schnelleren Ansatz in um dieses
Problem

@ RuiTrovisco Ich verstehe das. Deshalb habe ich geschrieben - ich würde die Antwort basierend auf Ihrem Feedback verbessern. Ich habe einige Kommentare zu Ihrer Frage abgegeben. Bitte kehren Sie dort zurück.
Dipan Mehta

1

Hier ist eine kleine Inspiration, die das Gegenteil von dem zeigt, was Sie suchen.

Beginnen Sie mit Abb. 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));

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.