I can't understand the technique how to analyse the shape. So any please help me to understand this concept.
Code is below
function W = Classify(ImageRead)
RGB = imread('test.bmp');
figure,
imshow(RGB),
title('Original Image');
GRAY = rgb2gray(RGB);
figure,
imshow(GRAY),
title('Gray Image');
threshold = graythresh(GRAY);
BW = im2bw(GRAY, threshold);
figure,
imshow(BW),
title('Binary Image');
BW = ~ BW;
figure,
imshow(BW),
title('Inverted Binary Image');
[B,L] = bwboundaries(BW, 'noholes');
STATS = regionprops(L, 'all'); % we need 'BoundingBox' and 'Extent'
% Step 7: Classify Shapes according to properties
% Square = 3 = (1 + 2) = (X=Y + Extent = 1)
% Rectangular = 2 = (0 + 2) = (only Extent = 1)
% Circle = 1 = (1 + 0) = (X=Y , Extent < 1)
% UNKNOWN = 0
figure,
imshow(RGB),
title('Results');
hold on
for i = 1 : length(STATS)
W(i) = uint8(abs(STATS(i).BoundingBox(3)-STATS(i).BoundingBox(4)) < 0.1);
W(i) = W(i) + 2 * uint8((STATS(i).Extent - 1) == 0 );
centroid = STATS(i).Centroid;
switch W(i)
case 1
plot(centroid(1),centroid(2),'wO');
case 2
plot(centroid(1),centroid(2),'wX');
case 3
plot(centroid(1),centroid(2),'wS');
end
end
return

 Akzeptierte Antwort

Image Analyst
Image Analyst am 27 Dez. 2013

1 Stimme

What are the kinds of shapes you have there?
  1. polygons (everything is a polygon)
  2. quadrilaterals, polygons, and ellipsoids
  3. quadrilaterals, rectangles, polygons, and ellipsoids
  4. quadrilaterals, rectangles, polygons, circles, and ellipsoids
  5. quadrilaterals, rectangles, squares, polygons, circles, and ellipsoids
You might look at the solidity, area, and perimeter. And the circularity = perimeter.^2 ./ (4*pi*area).
You may also find this useful to determine how many sides a polygon has: http://matlab.wikia.com/wiki/FAQ#How_do_I_find_.22kinks.22_in_a_curve.3F

7 Kommentare

saravanakumar D
saravanakumar D am 27 Dez. 2013
Bearbeitet: DGM am 13 Feb. 2023
i want to know why programmer using boundingbox in this programme. what is meaning of BoundingBox(3) and BoundingBox(4)
for i = 1 : length(STATS)
W(i) = uint8(abs(STATS(i).BoundingBox(3)-STATS(i).BoundingBox(4)) < 0.1);
W(i) = W(i) + 2 * uint8((STATS(i).Extent - 1) == 0 );
centroid = STATS(i).Centroid;
switch W(i)
case 1
plot(centroid(1),centroid(2),'wO');
case 2
plot(centroid(1),centroid(2),'wX');
case 3
plot(centroid(1),centroid(2),'wS');
end
end
Marc
Marc am 27 Dez. 2013
Boundingbox is a property from regionprops. It's being stored in the structure STATS.
doc regionprops
I assume you have the image processing toolbox?
Image Analyst
Image Analyst am 27 Dez. 2013
Bearbeitet: Image Analyst am 27 Dez. 2013
bounding box won't help unless one of the shape classes bounding box size is known in advance and specified as a characteristic of that shape. In other words "if the width of the bounding box is this and the height of the bounding box is that, then the shape must be this (circle or whatever)."
Good Aftenoon
I am doing a program in Matlab that can detect shapes, but i am having problems in detecting triangles, pentagons and hexagons.
Can you tell me what is the best way to detect this type of shapes? By Circularity?
Image Analyst
Image Analyst am 9 Mai 2022
No I don't think that's best. For your situation, I would find the centroid and the distances to the boundary. Then count the number of peaks in the distances. See attached demo where I compare the two.
Good Afternoon, I want to to do the code by myself, I want just to know what´s the range of circularity of a triangle, pentagon and hexagon?
Image Analyst
Image Analyst am 12 Mai 2022
Then run the demo I attached. It shows you the circularity of a variety of shapes and sizes. Because you're asking I assume you didn't run it or else you'd know the answer.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (4)

Shawn Fernandes
Shawn Fernandes am 21 Mär. 2018
Bearbeitet: DGM am 13 Feb. 2023

1 Stimme

Hi All,
Bounding box gives the smallest possible rectangle / cuboid that fits the given shape, and would support n dimensions. [x_cordinate,y_cordinate,z_cordinate,....nth_cordinate,x_width,y_width,z_width.....nth_width] in this 2 D image, we have bounding box defined for each shapes as [x_cordinate,y_cordinate,x_width,y_width]
Extent gives the ratio of area of the bounding box to area of the region. For squares and rectangles, as the bounding box matches the shape, extent = 1. For circles and ellipses, the ratio of area of region to bounding box is always a constant = pi/4, [ (pi * a * b) / (2*x * 2 * y) is extent of circular region, for circle, a = b = x =y, for ellipse, a=x and b =y ]
So
(1)for Circles, we have x_width = y_width,extent = pi/4
(2)for squares, we have x_width = y_width,extent =1,
(3)for rectangles, we have x_width != y_width,extent =1
(4)For ellipse, we have we have x_width != y_width,extent = pi/4
Reference:-
the below code has been tested and it works
for i = 1 : length(STATS)
centroid = STATS(i).Centroid;
if((STATS(i).BoundingBox(3)~=STATS(i).BoundingBox(4)) && (STATS(i).Extent<1))
plot(centroid(1),centroid(2),'w+');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
if((STATS(i).BoundingBox(3)==STATS(i).BoundingBox(4)) && (STATS(i).Extent==1))
plot(centroid(1),centroid(2),'wS');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
if((STATS(i).BoundingBox(3)==STATS(i).BoundingBox(4)) && (STATS(i).Extent > 0.76 && STATS(i).Extent < .795))
plot(centroid(1),centroid(2),'wO');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
if((STATS(i).BoundingBox(3)~=STATS(i).BoundingBox(4)) && (STATS(i).Extent==1))
plot(centroid(1),centroid(2),'wX');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
if((STATS(i).BoundingBox(3)~=STATS(i).BoundingBox(4)) && (STATS(i).Extent > 0.76 && STATS(i).Extent < .795))
plot(centroid(1),centroid(2),'w*');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
end
Hope this helps..

9 Kommentare

AMAR P
AMAR P am 10 Aug. 2018
Hey Thanks.. Worked on a first go.. Also I added little code to count similar objects.
Gaap NAEM
Gaap NAEM am 16 Okt. 2018
Hey ? can i ask for your codes sir. I have troubles in my codes. Just an example. Thank you sir
Image Analyst
Image Analyst am 16 Okt. 2018
See Steve Eddins's blog: Feret Diameters
Ravi Singh
Ravi Singh am 1 Apr. 2019
hii amar could you share your method to detect similar objects and finding the count of it ?? would be a great help. I need to detect multiple objects in image and based on color or shape and count the similar objects..
Image Analyst
Image Analyst am 1 Apr. 2019
My attached demo does that.
Syukri Yazed
Syukri Yazed am 17 Mai 2021
Hi Image Analyst, I've tested your code. It seems to have an error at line 40 and 54..
Error Message: Undefined function 'findpeaks' for input arguments of type 'double' at line 40
Error in function shape_recognition_demo1() at line 54.
Error Message:
Index exceeds the number of array elements (1).
Image Analyst
Image Analyst am 9 Mai 2022
@Syukri Yazed you must not have the Signal Processing Toolbox.
Joman
Joman am 30 Dez. 2022
how to show the result
complete begginer here
Image Analyst
Image Analyst am 30 Dez. 2022
@Joman depends on what you want the result to show. You could use a marker symbol and plot to put a marker at the centroid of the shape. Or you could use text to put the word for the shape at the centroid. Or you could extract each type of shape (by color or number of vertices) to its own separate image.

Melden Sie sich an, um zu kommentieren.

sss
sss am 26 Dez. 2016
Bearbeitet: Image Analyst am 26 Dez. 2016

0 Stimmen

what is the meaning of this for loop? -----
for i = 1 : length(STATS)
W(i) = uint8(abs(STATS(i).BoundingBox(3)-STATS(i).BoundingBox(4)) < 0.1);
W(i) = W(i) + 2 * uint8((STATS(i).Extent - 1) == 0 );
centroid = STATS(i).Centroid;
switch W(i)
case 1
plot(centroid(1),centroid(2),'wO');
case 2
plot(centroid(1),centroid(2),'wX');
case 3
plot(centroid(1),centroid(2),'wS');
end

1 Kommentar

Image Analyst
Image Analyst am 26 Dez. 2016
It plots w0, wx, or xS at the centroid of blobs in a binary image. If the blob is roughly square it puts a wS at the centroid. If it's a rectangle it will put up wX. Otherwise it will put up w0 for arbitrarily-shaped blobs that fit in a bounding box that is roughly square. I don't see anything being put up for arbitrarily-shaped blobs that have a rectangular bounding box.

Melden Sie sich an, um zu kommentieren.

Syukri Yazed
Syukri Yazed am 17 Mai 2021
Verschoben: Image Analyst am 30 Dez. 2022

0 Stimmen

Hi,
I've tested your code and improved it with the code that have been answered previously..
%https://ch.mathworks.com/matlabcentral/answers/110855-how-to-detect-the-shape-in-matlab
%https://ch.mathworks.com/matlabcentral/answers/245026-shape-detection-in-image
clc
%clear all
close all
%function W = Classify(ImageRead)
baseFileName = 'F:\PhD\MATLAB CODING\BlobsDemo\shape.png';
RGB = imread(baseFileName);
subplot(3, 3, 1);
imshow(RGB),
title('Original Image');
GRAY = rgb2gray(RGB);
subplot(3, 3, 2);
imshow(GRAY),
title('Gray Image');
threshold = graythresh(GRAY);
BW = imbinarize(GRAY, threshold);
subplot(3, 3, 3);
imshow(BW),
title('Binary Image');
BW = ~ BW;
subplot(3, 3, 4);
imshow(BW),
title('Inverted Binary Image');
[B,L] = bwboundaries(BW, 'noholes');
STATS = regionprops(L, 'all'); % we need 'BoundingBox' and 'Extent'
% Step 7: Classify Shapes according to properties
% Square = 3 = (1 + 2) = (X=Y + Extent = 1)
% Rectangular = 2 = (0 + 2) = (only Extent = 1)
% Circle = 1 = (1 + 0) = (X=Y , Extent < 1)
% UNKNOWN = 0
subplot(3, 3, 5);
imshow(RGB),
title('Results');
hold on
for i = 1 : length(STATS)
centroid = STATS(i).Centroid;
if((STATS(i).BoundingBox(3)~=STATS(i).BoundingBox(4)) && (STATS(i).Extent<1))
plot(centroid(1),centroid(2),'w+');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
if((STATS(i).BoundingBox(3)==STATS(i).BoundingBox(4)) && (STATS(i).Extent==1))
plot(centroid(1),centroid(2),'wS');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
if((STATS(i).BoundingBox(3)==STATS(i).BoundingBox(4)) && (STATS(i).Extent > 0.76 && STATS(i).Extent < .795))
plot(centroid(1),centroid(2),'wO');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
if((STATS(i).BoundingBox(3)~=STATS(i).BoundingBox(4)) && (STATS(i).Extent==1))
plot(centroid(1),centroid(2),'wX');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
if((STATS(i).BoundingBox(3)~=STATS(i).BoundingBox(4)) && (STATS(i).Extent > 0.76 && STATS(i).Extent < .795))
plot(centroid(1),centroid(2),'w*');
text(centroid(1),centroid(2),num2str(i),'Color','y');
end
end
%return
Could you please share with us your succesful code in detecting the shapes? Because I don't know the result numbering for.. what is wO, wX, w*, wS, w+?
or maybe Shawn Fernandes and ImageAnalyst can comment something regarding this matter.

1 Kommentar

Image Analyst
Image Analyst am 18 Mai 2021
Verschoben: Image Analyst am 30 Dez. 2022
what is wO, wX, w*, wS, w+?
Those are plot colors and marker shapes. See the plot() function documentation.
  • wo = white circles
  • wx = white x's
  • w* = white stars
  • ws = white squares
  • w+ = white plus signs.

Melden Sie sich an, um zu kommentieren.

Beenish Ishtiaq
Beenish Ishtiaq am 3 Aug. 2021

0 Stimmen

How to detect the shape using GUI

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by