2016-06-10 3 views
3

In MatLab habe ich ein Binärbild und ich versuche, ein Loch zu füllen. Das Problem ist, dass das Gebiet größtenteils (aber nicht vollständig) geschlossen ist. Gibt es vorhandene visuelle Verarbeitungsfunktionen, die das können? Muss ich meinen eigenen Algorithmus schreiben?Füllen Sie einen Bereich eines binären Bildes, das nicht vollständig geschlossen ist

Original/

Wunsch

enter image description here enter image description here

Ein weiteres anderes Problem ist, dass ich in einem binären Bild Problemerkennungs dünne schweifartigen Strukturen habe. Ich muss diese Art von Strukturen entfernen, ohne den größeren Körper zu entfernen, an dem sie befestigt ist. Gibt es vorhandene visuelle Verarbeitungsfunktionen, die das können? Muss ich meinen eigenen Algorithmus schreiben?

Original/

Wunsch

Original Image Desired Image

+0

Ein solcher Algorithmus als auch die Beine abhacken wird. – karakfa

+0

Das wäre okay. Ich brauche nur den Hauptkörperbereich – user3315340

Antwort

4

Im ersten Beispiel, Sie imclose verwenden können, eine Dilatation gefolgt von einer Erosion auszuführen, diese Kanten zu schließen. Dann können Sie mit imfill folgen bis sie vollständig ausfüllen.

img = imread('http://i.stack.imgur.com/Pt3nl.png'); 
img = img(:,:,1) > 0; 

% You can play with the structured element (2nd input) size 
closed = imclose(img, strel('disk', 13)); 
filled = imfill(closed, 'holes'); 

enter image description here In ähnlicher Weise mit Ihrem zweiten Satz von Bildern, können Sie imopen (Erosion gefolgt von Dilatation) den Schwanz zu entfernen.

img = imread('http://i.stack.imgur.com/yj32n.png'); 
img = img(:,:,1); 

% You can play with the structured element (2nd input) size 
% Increase this number if you want to remove the legs and more of the tail 
opened = imopen(img, strel('disk', 7)); 

enter image description here

aktualisieren

Wenn Sie den Schwerpunkt der zentralen Öffnung der „geschlossenen“ Bild oben wollen, können Sie eine Maske erhalten, die durch Subtrahieren closed gerade diese Öffnung ist aus filled.

% Find pixels that were in the filled region but not the closed region 
hole = filled - closed; 

% Then compute the centroid of this 
[r,c] = find(hole); 
centroid = [mean(r), mean(c)]; 

enter image description here

+0

Es funktioniert! Ich danke dir sehr. Ich habe seit 3 ​​Stunden gekämpft, um dieses Problem zu lösen! – user3315340

+0

@ user3315340 Wenn es für Sie funktioniert, sollten Sie es als die Lösung für andere mit einem ähnlichen Problem markieren. – Suever

+0

Eine andere schnelle Frage. Ist es möglich, die Schwerpunktskoordinaten des schwarzen eingeschlossenen Kreises des "geschlossenen Bildes" zu finden? – user3315340

Verwandte Themen