Switch to side-by-side view

--- a
+++ b/Image features calculation code/Working/shape features/FacetMidpointPerim.m
@@ -0,0 +1,395 @@
+
+function finalPerimeter  = FacetMidpointPerim( I )
+
+    % Create an n x 2 matrix representing an ordered set of boundary pixels.
+    % - The row  of the matrix represents the index of each boundary pixel.
+    % - The first column contains the row index of the boundary pixel in the 
+    %   original image.
+    % - The second column contains the column index of the boundary pixel in the 
+    %    original image.
+    % - Single pixel wide strands are listed twice in the ordered list, once
+    %   going up the strand and once coming down the other side.
+    % - the last member of the list is the first member, so for n pixles,
+    %   there are at least n+1 members of the list
+    
+
+    % Traverse the contour in order, counting perimeter according to the 
+    %relative location of the pixel with respect to the previous one and 
+    % the next one.  
+    
+    Icontour = bwboundaries(I, 'noholes');
+    pixel = Icontour{1};
+    perimeter = 0;
+    for i= 1: size(pixel,1)-1;
+        
+        if i == 1
+            lastPixelIndex = size(pixel,1)-1;
+        end
+        if i ~=1
+            lastPixelIndex = i-1;
+        end
+        
+       %%%%%%%  Determine relative location of last Pixel  %%%%%%%%%%
+        lastPixel = 'Void';
+        if pixel(lastPixelIndex,1) == pixel(i,1) -1 
+            if pixel(lastPixelIndex,2) == pixel(i,2)-1
+                lastPixel = 'TL';
+            end
+        end
+        
+        if pixel(lastPixelIndex,1) == pixel(i,1)-1
+            if pixel(lastPixelIndex,2) == pixel(i,2)
+                lastPixel = 'T';
+            end
+        end
+        
+        if pixel(lastPixelIndex,1) == pixel(i,1)-1
+            if pixel(lastPixelIndex,2) == pixel(i,2)+1
+                lastPixel = 'TR';
+            end
+        end
+        
+        if pixel(lastPixelIndex,1) == pixel(i,1)
+            if pixel(lastPixelIndex,2) == pixel(i,2)-1
+                lastPixel = 'L';
+            end
+        end
+        
+        if pixel(lastPixelIndex,1) == pixel(i,1)
+            if pixel(lastPixelIndex,2) == pixel(i,2)+1
+                lastPixel = 'R';
+            end
+        end
+        
+        if pixel(lastPixelIndex,1) == pixel(i,1)+ 1
+            if pixel(lastPixelIndex,2) == pixel(i,2)-1
+                lastPixel = 'BL';
+            end
+        end
+        
+        if pixel(lastPixelIndex,1) == pixel(i,1)+ 1
+            if pixel(lastPixelIndex,2) == pixel(i,2)
+                lastPixel = 'B';
+            end
+        end
+        
+         if pixel(lastPixelIndex,1) == pixel(i,1)+ 1
+            if pixel(lastPixelIndex,2) == pixel(i,2)+1
+                lastPixel = 'BR';
+            end
+         end
+         
+         %%%%%%%  Determine relative location of next Pixel  %%%%%%%%%%
+        nextPixel = 'void';
+        if pixel(i+1,1) == pixel(i,1) -1 
+            if pixel(i+1,2) == pixel(i,2)-1
+                nextPixel = 'TL';
+            end
+        end
+        
+        if pixel(i+1,1) == pixel(i,1)-1
+            if pixel(i+1,2) == pixel(i,2)
+                nextPixel = 'T';
+            end
+        end
+        
+        if pixel(i+1,1) == pixel(i,1)-1
+            if pixel(i+1,2) == pixel(i,2)+1
+                nextPixel = 'TR';
+            end
+        end
+        
+        if pixel(i+1,1) == pixel(i,1)
+            if pixel(i+1,2) == pixel(i,2)-1
+                nextPixel = 'L';
+            end
+        end
+        
+        if pixel(i+1,1) == pixel(i,1)
+            if pixel(i+1,2) == pixel(i,2)+1
+                nextPixel = 'R';
+            end
+        end
+        
+        if pixel(i+1,1) == pixel(i,1)+ 1
+            if pixel(i+1,2) == pixel(i,2)-1
+                nextPixel = 'BL';
+            end
+        end
+        
+        if pixel(i+1,1) == pixel(i,1)+ 1
+            if pixel(i+1,2) == pixel(i,2)
+                nextPixel = 'B';
+            end
+        end
+        
+         if pixel(i+1,1) == pixel(i,1)+ 1
+            if pixel(i+1,2) == pixel(i,2)+1
+                nextPixel = 'BR';
+            end
+        end
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if strcmp(lastPixel,'TL')
+        if strcmp(nextPixel,'TL')
+            perimeter = perimeter + 4*sqrt(0.5);
+        end
+        if  strcmp(nextPixel, 'T')
+            perimeter = perimeter + (0.5 + (5/2) * sqrt(0.5));
+        end
+        if  strcmp(nextPixel, 'TR')
+            perimeter = perimeter + sqrt(0.5);
+        end
+        if  strcmp(nextPixel, 'R')
+            perimeter = perimeter + (0.5 + 0.5*sqrt(0.5) );
+        end
+        if  strcmp(nextPixel, 'BR')
+            perimeter = perimeter + 2*sqrt(0.5);
+        end
+        if  strcmp(nextPixel, 'B')
+            perimeter = perimeter + 0.5 + (3/2)*sqrt(0.5); 
+        end
+        if  strcmp(nextPixel, 'BL')
+            perimeter = perimeter + 3*sqrt(0.5);
+        end
+        if  strcmp(nextPixel, 'L')
+            perimeter = perimeter + (0.5 + (5/2) * sqrt(0.5));
+        end
+
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    if  strcmp(lastPixel, 'T')
+            if strcmp(nextPixel,'TL')
+                  perimeter = perimeter + (0.5 + (5/2) * sqrt(0.5));
+            end
+            if  strcmp(nextPixel, 'T')
+                    perimeter = perimeter + (1 + 2*sqrt(0.5) );
+            end
+            if  strcmp(nextPixel, 'TR')
+                    perimeter = perimeter + (0.5 + (5/2) * sqrt(0.5));
+            end
+            if  strcmp(nextPixel, 'R')
+                    %not possible
+            end
+            if  strcmp(nextPixel, 'BR')
+                    perimeter = perimeter + 0.5+0.5*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'B')
+                    perimeter = perimeter + 1;
+            end
+            if  strcmp(nextPixel, 'BL')
+                    perimeter = perimeter + 0.5 + (3/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'L')
+                    perimeter = perimeter + 1+sqrt(0.5);
+            end
+
+    end
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    if  strcmp(lastPixel, 'TR')
+            if strcmp(nextPixel,'TL')
+                perimeter = perimeter + 3*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'T')
+                perimeter = perimeter + (0.5 + (5/2) * sqrt(0.5));
+            end
+            if  strcmp(nextPixel, 'TR')
+                perimeter = perimeter + 4*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'R')
+                 perimeter = perimeter + (0.5 + (5/2) * sqrt(0.5));
+            end
+            if  strcmp(nextPixel, 'BR')
+                 perimeter = perimeter + sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'B')
+                    perimeter = perimeter + 0.5 + 0.5*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'BL')
+                    perimeter = perimeter + 2*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'L')
+                    perimeter = perimeter + 0.5 + (3/2)*sqrt(0.5);
+            end
+
+
+    end
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    if  strcmp(lastPixel, 'R')
+            if strcmp(nextPixel,'TL')
+                perimeter = perimeter + 0.5 + (3/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'T')
+                perimeter = perimeter + 1 + sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'TR')
+                perimeter = perimeter + 0.5 + (5/2)* sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'R')
+                perimeter = perimeter + 1+ 2* sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'BR')
+                % not possible
+            end
+            if  strcmp(nextPixel, 'B')
+                % no contribution
+            end
+            if  strcmp(nextPixel, 'BL')
+                perimeter = perimeter + 0.5 + 0.5*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'L')
+                perimeter = perimeter + 1;
+            end
+
+    end
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    if  strcmp(lastPixel, 'BR')
+            if strcmp(nextPixel,'TL')
+                perimeter = perimeter + 2*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'T')
+                perimeter = perimeter + 0.5 + (3/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'TR')
+                perimeter = perimeter + 3*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'R')
+                perimeter = perimeter + 0.5 + (5/2) * sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'BR')
+                perimeter = perimeter + 4*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'B')
+                %no contribution
+            end
+            if  strcmp(nextPixel, 'BL')
+                perimeter = perimeter + sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'L')
+                perimeter = perimeter + 0.5 + 0.5*sqrt(0.5);
+            end
+
+    end
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    if  strcmp(lastPixel, 'B')
+            if strcmp(nextPixel,'TL')
+                perimeter = perimeter + 0.5 + 0.5*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'T')
+                perimeter = perimeter + 1;
+            end
+            if  strcmp(nextPixel, 'TR')
+                perimeter = perimeter + 0.5 + (3/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'R')
+                perimeter = perimeter + 1+ sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'BR')
+                perimeter = perimeter + 0.5 + (5/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'B')
+                perimeter = perimeter + 1 + 2*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'BL')
+                %No contribution
+            end
+            if  strcmp(nextPixel, 'L')
+                %No contribution
+            end
+
+    end
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    if  strcmp(lastPixel, 'BL')
+           if strcmp(nextPixel,'TL')
+                perimeter = perimeter + sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'T')
+                perimeter = perimeter + 0.5 + 0.5*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'TR')
+                perimeter = perimeter + 2*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'R')
+                perimeter = perimeter + 0.5 + (3/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'BR')
+                perimeter = perimeter + 3*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'B')
+                perimeter = perimeter + 0.5 + (5/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'BL')
+                perimeter = perimeter + 4*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'L')
+                %no contribution
+            end
+
+    end
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    if  strcmp(lastPixel, 'L')
+            if strcmp(nextPixel,'TL')
+                %No contribution
+            end
+            if  strcmp(nextPixel, 'T')
+                %No Contribution
+            end
+            if  strcmp(nextPixel, 'TR')
+                perimeter = perimeter + 0.5 + 0.5*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'R')
+                perimeter = perimeter + 1;
+            end
+            if  strcmp(nextPixel, 'BR')
+                perimeter = perimeter + 0.5 + (3/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'B')
+                perimeter = perimeter + 1 + sqrt(0.5);
+                
+                
+            end
+            if  strcmp(nextPixel, 'BL')
+                perimeter = perimeter + 0.5 + (5/2)*sqrt(0.5);
+            end
+            if  strcmp(nextPixel, 'L')
+                perimeter = perimeter + 1 + 2*sqrt(0.5); 
+            end
+           
+    end
+    
+    
+    
+    end
+    finalPerimeter = perimeter;
+    
+    % In three cases, P^2 < 4*pi*A, which is not possible in Euclidean geometry
+    % so we adjust the perimeter to equal a value which satisfies this relationship
+        
+    % if it is just one pixel, make the perimeter equal to the perimeter of
+    % a circle with area equal to 1
+    if size(pixel,1)== 2
+        finalPerimeter = 2*sqrt(pi); %3.544908;
+    end
+    %If it is two pixels aligned, make the perimeter equal to the perimeter of 
+    %an ellipse with ara equal to 2 and minor axis = 0.5
+    if size(pixel,1) == 3 && ( pixel(1,1) == pixel(2,1) || pixel(1,2) == pixel(2,2) )
+        finalPerimeter =  6.0774;
+    end
+    %If it is four pixels arranged as a square
+    if(size(pixel, 1) == 5) 
+        if (perimeter < 6.8285)
+            finalPerimeter = 7.089815;
+        end
+    end
+    
+end
+
+
+
+
+
+
+
+