2014-03-19 12 views
6

Ich versuche, das größte Objekt in einem Bild zu finden und alle anderen Objekte im Bild zu entfernen, die kleiner als das Bild sind.Wählen Sie das größte Objekt in einem Bild

Dies ist, was ich habe, aber ich kann es nicht zur Arbeit bringen.

l=bwlabel(BW); 

%the area of all objects in the image is calculated 
stat = regionprops(l,'Area','PixelIdxList'); 
[maxValue,index] = max([stat.Area]); 

    %remove any connected areas smaller than the biggest object 
    BW2=bwareaopen(BW,[maxValue,index],8); 
    subplot(5, 5, 4); 
    imshow(BW2, []); 

Ich arbeite mit digitalen Mammogrammen wie these. Ich versuche alle Objekte aus dem Bild zu entfernen, mit Ausnahme der Brustregion.

Antwort

7

Verwenden bwconncomp statt, da es die Koordinatenindizes für Region in einer separaten Zelle zurückkehrt, wo die Größe von jedem leicht zu erkennen ist:

>> BW = [1 0 0; 0 0 0; 0 1 1]; % two regions 
>> CC = bwconncomp(BW) 
CC = 
    Connectivity: 8 
     ImageSize: [3 3] 
     NumObjects: 2 
    PixelIdxList: {[1] [2x1 double]} 

Das PixelIdxList Feld ist ein Zellenfeld mit dem Indizes der Koordinaten für jeden Region. Die Länge jeder Anordnung ist die Größe der jeweiligen Region:

>> numPixels = cellfun(@numel,CC.PixelIdxList) 
numPixels = 
    1  2 
>> [biggestSize,idx] = max(numPixels) 
biggestSize = 
    2 
idx = 
    2 

Dann können Sie einfach ein neues Bild machen mit nur diese Komponente:

BW2 = false(size(BW)); 
BW2(CC.PixelIdxList{idx}) = true; 

EDIT: Aus den Kommentaren, die Notwendigkeit, das Ausgabebild zu beschneiden, so dass die Region an die Ränder kommt, kann mit regionprops unter Verwendung der Option "BoundingBox" adressiert werden:

s = regionprops(BW2, 'BoundingBox'); 

das gibt Ihnen ein Rechteck s.BoundingBox, die Sie verwenden können, um mit BW3 = imcrop(BW2,s.BoundingBox); zu beschneiden.

+0

so viel Dank für Ihre Hilfe! Genau das habe ich gebraucht! – user1853871

+0

Ich frage mich, ob Sie mir helfen könnten, diese größte Region so zu beschneiden, dass sie alle vier Ecken des Bildes berührt. Ich bin mir nicht sicher, wie ich das machen soll, wäre eine Bounding Box die beste Methode? – user1853871

+1

@ user1853871 Sicher, siehe 'regionprops' mit der Option '' BoundingBox'':' s = regionprops (BW2, 'BoundingBox'); 'gibt dir ein Rechteck' s.BoundingBox', mit dem du mit 'BW3 zuschneiden kannst = imcrop (BW2, s.BoundingBox); '. Vielen Dank für die Annahme und bitte upvote jetzt, dass Sie die erforderliche rep haben! – chappjc

5

Wenn Sie mit dem bwlabel Ansatz fortsetzen möchten, können Sie diese verwenden -

-Code

BW = im2bw(imread('coins.png')); %%// Coins photo from MATLAB Library 

[L, num] = bwlabel(BW, 8); 
count_pixels_per_obj = sum(bsxfun(@eq,L(:),1:num)); 
[~,ind] = max(count_pixels_per_obj); 
biggest_blob = (L==ind); 

%%// Display the images 
figure, 
subplot(211),imshow(BW) 
subplot(212),imshow(biggest_blob) 

Ausgabe

enter image description here

+0

Danke für Ihre Hilfe! – user1853871

+0

Ja, ich dachte, es ist einfach zu verstehen und zu folgen. – Divakar