detect Circles and squares on the image using regionprops
9 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Ahmed Emad
il 6 Dic 2019
Commentato: Image Analyst
il 6 Dic 2019
Now , i have image called "test.png" and my question is how to detect circles with & without holes and display each of them in single figure and here is my code but desn't work with me , so need help
I = imread('test.png');
imshow(I);
I = rgb2gray(I);
I = im2bw(I,0.01);
[L ,num] = bwlabel(I);
stats1 = regionprops (L,'EulerNumber' , 'Area' , 'Perimeter' , 'BoundingBox');
sum = 0;
for R=1:num
% this way desn't work but maybe it just need a little changes
% x = uint8 (stats1(R).BoundingBox(1));
% y = uint8 (stats1(R).BoundingBox(2));
% if (I(x,y) == 0)
% sum = sum + 1;
% bb = stats1(R).BoundingBox;
% rectangle('position',bb,'edgecolor','r','linewidth',1.3);
% end
circularity = (stats1(R).Perimeter .^ 2) ./ (4 * pi * stats1(R).Area);
if (circularity >= 1.1)
sum = sum + 1;
bb = stats1(R).BoundingBox;
rectangle('position',bb,'edgecolor','r','linewidth',1.3);
end
end
disp(sum);
Risposta accettata
Marcel Kreuzberg
il 6 Dic 2019
try this
I = imread('test.png');
imshow(I);
I = rgb2gray(I);
I = im2bw(I,0.01);
[L ,num] = bwlabel(I);
stats1 = regionprops (L,'EulerNumber' , 'Area' ,'ConvexArea', 'Perimeter' , 'BoundingBox');
sum1 = 0;
sum2 = 0;
for R=1:num
circularity = (stats1(R).Perimeter .^ 2) ./ (4 * pi * stats1(R).ConvexArea);
if (circularity < 1) %Circles
if stats1(R).EulerNumber == 1
sum1 = sum1 + 1;
bb = stats1(R).BoundingBox;
rectangle('position',bb,'edgecolor','r','linewidth',1.3);
end
if stats1(R).EulerNumber < 1
sum2 = sum2 + 1;
bb = stats1(R).BoundingBox;
rectangle('position',bb,'edgecolor','y','linewidth',1.3);
end
end
end
disp(sum1); %circle without holes
disp
(sum2); %circle with holes
2 Commenti
Image Analyst
il 6 Dic 2019
Convex area does not include holes or "bays" in the outer perimeter. Basically think like if you put a rubber band around your shape. The area inside the rubber band is the convex hull area. The regular area would be the actual area of the white pixels, i.e., it does not include holes.
Circularity is 1 for a circle and higher for non-circular things. If the blob is a perfect circle the perimeter squared equals 4 * pi * the area. The more non-circular and tortuous the shape becomes, the perimeter gets larger faster than the area does and so the circularity metric will get larger. The smallest it can theoretically be is 1 for a perfect circle, though I've seen some as low as 0.9 presumably due to quantization error because we have an image compoaed of square blocks (pixels).
For another demo, see my attached shape recognition demos and see some of the links on the left of this page.
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Dimensionality Reduction and Feature Extraction in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!