Switch to unified view

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