2016-05-04 9 views
2

Ich lese einfach ein Bild und möchte die Bounding-Boxen visualisieren, die von der Blob-Analyse von Matlab zurückgegeben werden, die Positionsvektoren zurückgibt. Hier ist mein CodeIndex überschreitet Matrixabmessungen beim Versuch, auf Positionsvektoren zuzugreifen

img = imread(file_name); 
img = im2bw(img); 

gblob = vision.BlobAnalysis('AreaOutputPort', true, ... % Set blob analysis handling 
       'CentroidOutputPort', true, ... 
       'BoundingBoxOutputPort', true', ... 
       'MinimumBlobArea', 0, ... 
       'MaximumBlobArea', 600000, ... 
       'MaximumCount', 1000, ... 
       'MajorAxisLengthOutputPort',true, ... 
       'MinorAxisLengthOutputPort',true, ... 
       'OrientationOutputPort',true); 


      [Area,centroid, bbox, MajorAxis, MinorAxis,Orientation] = step(gblob, img); 
      % each bbox is position vector of the form [x y width height] 
      for i = 1:1:length(MajorAxis) 
       figure;imshow(img(bbox(i,2):bbox(i,2) + bbox(i,4),bbox(i,1):bbox(i,1)+bbox(i,3))); 
      end 

Auf Dabei bekomme ich einen Fehler Index exceeds matrix dimensions. ich auch

versucht haben
figure;imshow(img(bbox(i,1):bbox(i,1) + bbox(i,3),bbox(i,2):bbox(i,2)+bbox(i,4))); 

aber ich immer noch die gleichen Fehler enden.

hier ist ein Beispielbild, wo dieser Code einen Fehler

https://www.aagga.com/wp-content/uploads/2016/02/Sample.jpg

+0

Dies bedeutet, dass der Index "i" größer ist als die Anzahl der Zeilen (Matrixdimension) in "bbox". – excaza

+0

ich glaube, das Problem ist mit Dimesions für 'img' und nicht' bbox', ich habe versucht, 'bbox' separat zu drucken, das funktioniert gut – Harjatin

+0

Ok, großartig, dann bedeutet es, dass der Index,' bbox (i, 1): bbox (i, 1) + bbox (i, 3), bbox (i, 2): bbox (i, 2) + bbox (i, 4) ', ist größer als die Matrixdimensionen von' img'. – excaza

Antwort

3

Es ist ein einfacher Fall von Fehl Indizierung gibt. Der Blob-Detektor gibt die Koordinaten x und y der oberen linken Ecke des Blobs zurück. x In diesem Fall sind die horizontalen Koordinaten während y ist die vertikale. Daher müssen Sie nur den Zugriff auf das Bild ändern, da die Vertikale zuerst und dann die Horizontale benötigt wird.

Auch in Bezug auf Ihr Bild würde ich invertieren das Bild, weil das Objekt als ein dunkles Objekt auf weißem Hintergrund betrachtet werden würde, sobald Sie es in Binär konvertieren. Der Blob-Detektor erkennt weiße Objekte auf schwarzem Hintergrund. Deshalb invertieren das Bild und einige morphologische Schließung um den Lärm zu bereinigen, sobald das passiert:

img = imread('http://www.aagga.com/wp-content/uploads/2016/02/Sample.jpg'); 
img = ~im2bw(img); %// Change - invert 
img_clean = imclose(img, strel('square', 7)); %// Change, clean the image 

ich dieses Bild jetzt:

imshow(img_clean); 

enter image description here

Nicht schlecht .... Führen Sie jetzt Ihren tatsächlichen Blob-Detektor aus. Beachten Sie, dass das Bild, das Sie in den Blob-Detektor legen, der Name der Laufvariablen ist. Sie werden es img_clean jetzt rufen müssen:

gblob = vision.BlobAnalysis('AreaOutputPort', true, ... 
      'CentroidOutputPort', true, ... 
      'BoundingBoxOutputPort', true', ... 
      'MinimumBlobArea', 0, ... 
      'MaximumBlobArea', 600000, ... 
      'MaximumCount', 1000, ... 
      'MajorAxisLengthOutputPort',true, ... 
      'MinorAxisLengthOutputPort',true, ... 
      'OrientationOutputPort',true); 


[Area,centroid, bbox, MajorAxis, MinorAxis,Orientation] = step(gblob, img_clean); 

nun endlich jeder Klecks extrahieren:

% each bbox is position vector of the form [x y width height] 
for i = 1:1:length(MajorAxis) 
    figure; 
    imshow(img_clean(bbox(i,2):bbox(i,2) + bbox(i,4),bbox(i,1):bbox(i,1)+bbox(i,3))); %// Change 
end 

ich jetzt die folgenden neun Figuren:

enter image description here

Beachten dass das obige nicht perfekt ist, weil der Umfang des Zeichens getrennt ist, so dass der Fleckdetektor dies als verschiedene Flecken interpretiert. Eine Möglichkeit, dies zu bekämpfen, besteht darin, den Schwellenwert des Bildes zu variieren oder graythresh für die adaptive Schwellenwertbildung zu verwenden, um sicherzustellen, dass der Rahmen ordnungsgemäß verbunden ist. Dies ist jedoch eine gute Möglichkeit, Ihr Problem anzugehen.

Minor Hinweis

Ein viel einfachen Weg, dies zu tun, ist mit der Computer Vision Toolbox zu beseitigen und das Image Processing Toolbox verwenden.Insbesondere regionprops verwenden und die Image Eigenschaft verwenden, um die aktuellen Bilder zu extrahieren, dass der Blobs selbst enthalten:

%// Code from before 
img = imread('http://www.aagga.com/wp-content/uploads/2016/02/Sample.jpg'); 
img = ~im2bw(img); %// Change - invert 
img_clean = imclose(img, strel('square', 7)); %// Change, clean the image 

%// Create regionprops structure with desired properties 
out = regionprops(img_clean, 'BoundingBox', 'Image'); 

%// Cycle through each blob and show the image 
for ii = 1 : numel(out) 
    figure; 
    imshow(out(ii).Image); 
end 

Dies sollte das Gleiche erreichen, wie ich Sie oben zeigte. Sie können in der Dokumentation nachsehen, welche Eigenschaften regionprops für Sie pro Blob zurückgibt.

+0

der Teil 'img (bbox (i, 2): bbox (i, 2) + bbox (i, 4), bbox (ich, 1): bbox (i, 1) + bbox (i, 3)) ist immer noch dasselbe wie mein Code. Ich schätze das Problem ist, dass die Bounding Boxes, die von der Funktion ausgegeben werden, manchmal außerhalb des Bildes liegen. korrigiere mich, wenn ich falsch liege. Danke für deine Antwort – Harjatin

+0

Das kann es tatsächlich sein. Ich habe nicht gesehen, dass Sie die richtige Reihenfolge der Koordinaten in Ihrem Code verwendet haben. Ich habe nur den letzten Teil gesehen, den du als separate Zeile am Ende hattest. OK, stellen Sie sicher, dass Sie das Bild vor der Erkennung invertieren. Ich vermute, dass Sie aufgrund der Inversion der Objekte in ihrer Intensität in Ihrer Analyse richtig liegen. – rayryeng

Verwandte Themen