2016-12-14 3 views
0

Ich verwende bwareaopen, um kleine Objekte zu entfernen. Gibt es eine Funktion zum Entfernen der großen Objekte? Ich versuche bwareaopen anzupassen, war aber bisher nicht erfolgreich. DankeWählen Sie die zweitgrößte Fläche in Bild

Für ref: Hier ist ein Link zur Hilfe von bwareaopen.

+0

bitte ein Beispiel für eine Eingabe zur Verfügung stellen Bild, mit weiterer Erläuterung bezüglich der gewünschten Ausgabe. – drorco

Antwort

1

Ein anderer Weg, wenn Sie nicht wollen, bwareaopen zu verwenden ist regionprops zu verwenden, und zwar mit den Area und PixelIdxList Attribute, filtern Sie die Elemente aus, die in den Bereich nicht entsprechen Bereich Sie wollen, dann die übrigen Elemente verwenden und Erstelle eine neue Maske. Area erfasst die Gesamtfläche jeder Form, während PixelIdxList die Spalte große lineare Indizes der Positionen innerhalb des Bildes erfasst, die zu jeder Form gehören. Sie würden verwenden, um die Area Attribut Ihre Filterung durchzuführen, während Sie das PixelIdxList Attribut verwenden würde ein neues Ausgabebild und setzen diese Standorte true, die innerhalb des gewünschten Bereichs Bereich zu schaffen:

% Specify lower and upper bounds 
LB = 30; 
UB = 50; 

% Run regionprops 
s = regionprops(I, 'Area', 'PixelIdxList'); 

% Get all of the areas for each shape 
areas = [s.Area]; 

% Remove elements from output of regionprops 
% that are not within the range 
s = s(areas >= LB & areas <= UB); 

% Get the column-major locations of the shapes 
% that have passed the check 
idx = {s.PixelIdxList}; 
idx = cat(1, idx{:}); 

% Create an output image with the passed shapes 
Iout = false(size(I)); 
Iout(idx) = true; 
+0

Mein Vergnügen! ... Die Verwendung von XOR mit 'bwareaopen' ist sehr schlau. – rayryeng

+1

@ user2305193 BTW, können Sie das Gegenteil von 'bwareaopen' implementieren. Alles, was Sie tun müssen, ist die Ausgabe von 'bwareaopen', um in Ihr Bild zu indizieren und die Speicherorte derer, die bleiben, auf false zu setzen. Dies führt dazu, dass die kleinen Objekte behalten werden, während die großen Objekte entfernt werden .... so etwas wie "Iout = bwareaopen (I, 50); I (Iout) = falsch; ' – rayryeng

3

fand ich eine einfache Möglichkeit, dieses Problem here beschrieben in Angriff zu nehmen:

„Nur Objekte zwischen halten, sagen wir, 30 Pixel und 50 Pixel in dem Bereich, können Sie den BWAREAOPEN Befehl wie folgt verwenden:“

LB = 30; 
UB = 50; 
Iout = xor(bwareaopen(I,LB), bwareaopen(I,UB)); 
Verwandte Themen