|
a |
|
b/Image features calculation code/Working/shape features/ConvexPerim.m |
|
|
1 |
function perimeter = ConvexPerim( bwImage ) |
|
|
2 |
|
|
|
3 |
|
|
|
4 |
STATS = regionprops(bwImage,'ConvexHull'); |
|
|
5 |
vertex = STATS.ConvexHull; |
|
|
6 |
perimeter = 0; |
|
|
7 |
|
|
|
8 |
if size(vertex,1) > 2 |
|
|
9 |
for i=2:size(vertex,1) |
|
|
10 |
% if it is a vertical segment |
|
|
11 |
if vertex(i,1)== vertex (i-1,1) |
|
|
12 |
if vertex(i,2) ~= vertex(i-1,2) |
|
|
13 |
perimeter = perimeter + abs( vertex(i,2) - vertex(i-1,2) ); |
|
|
14 |
end |
|
|
15 |
end |
|
|
16 |
% if it is a horizontal segment |
|
|
17 |
if vertex(i,1)~= vertex (i-1,1) |
|
|
18 |
if vertex(i,2) == vertex(i-1,2) |
|
|
19 |
perimeter = perimeter + abs( vertex(i,1) - vertex(i-1,1) ); |
|
|
20 |
end |
|
|
21 |
end |
|
|
22 |
% if it is any other segment |
|
|
23 |
if vertex(i,1)~= vertex (i-1,1) |
|
|
24 |
if vertex(i,2) ~= vertex(i-1,2) |
|
|
25 |
perimeter = perimeter + sqrt( (vertex(i,1) - vertex(i-1,1) )^2 + (vertex(i,2) - vertex(i-1,2) )^2 ); |
|
|
26 |
end |
|
|
27 |
end |
|
|
28 |
|
|
|
29 |
end |
|
|
30 |
end |
|
|
31 |
|
|
|
32 |
%Consider special cases, because very small objects have large |
|
|
33 |
%errors, so call the facet midpoint method for these, and the exceptional |
|
|
34 |
%cases will be handled correctly. |
|
|
35 |
Icontour = bwboundaries(bwImage, 'noholes'); |
|
|
36 |
pixel = Icontour{1}; |
|
|
37 |
% If the shape is a single pixel, make the perimeter equal to the perimeter of |
|
|
38 |
% a circle with area = 1 |
|
|
39 |
if size(pixel,1)== 2 |
|
|
40 |
perimeter = FacetMidpointPerim(bwImage); |
|
|
41 |
end |
|
|
42 |
|
|
|
43 |
%If the shape is two pixels aligned, make the perimeter equal to the perimeter |
|
|
44 |
% of an eliipse with area = 2 and minor axis equal to 0.5. |
|
|
45 |
if size(pixel,1) == 3 && ( pixel(1,1) == pixel(2,1) || pixel(1,2) == pixel(2,2) ) |
|
|
46 |
perimeter = 6.0774; |
|
|
47 |
end |
|
|
48 |
|
|
|
49 |
%If it is four pixels arranged as a square, make the perimeter equal to |
|
|
50 |
%the periemter of a circle with area = 4 |
|
|
51 |
if(size(pixel, 1) == 5) |
|
|
52 |
x = FacetMidpointPerim(bwImage); |
|
|
53 |
if x == 7.089815; |
|
|
54 |
perimeter = 7.089815; |
|
|
55 |
end |
|
|
56 |
end |
|
|
57 |
end |
|
|
58 |
|