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);

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:

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.
Dies bedeutet, dass der Index "i" größer ist als die Anzahl der Zeilen (Matrixdimension) in "bbox". – excaza
ich glaube, das Problem ist mit Dimesions für 'img' und nicht' bbox', ich habe versucht, 'bbox' separat zu drucken, das funktioniert gut – Harjatin
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