Info
This question is closed. Reopen it to edit or answer.
Why does not my code work?
    1 view (last 30 days)
  
       Show older comments
    
My code is about shape recognition for a circle and rectangle, I'm having one error in the code and didn't know how to make it right. can any one help me please.
    clc
  close all
  clear
  %%Reading Image.
  Image = 'Image.JPG';
  RGBImage = imread(Image);
  RGBImage = imresize(RGBImage,[500,500]);
  subplot(2,2,1)
  imshow(RGBImage)
  title('Input Image')
  %%Image Conversions To GrayScale.
  GrayImage = rgb2gray(RGBImage);
  subplot(2,2,2)
  imshow(GrayImage)
  title('GrayScale Image')
  %%Binarize The Image.
  BinaryImage = imbinarize(GrayImage);
  subplot(2,2,3)
  imshow(BinaryImage)
  title('Initial (Noisy) Binary Image')
  %%Remove Small Objects.
  BinaryImage = bwareaopen(BinaryImage, 100000);
  BinaryImage = imcomplement(BinaryImage); % Complement image
  subplot(2,2,4)
  imshow(BinaryImage)
  title('Cleaned Binary Image')
  %%Measure Properties Of BinaryImage Regions.
  [LabeledImage, NumberOfObjects] = bwlabel(BinaryImage);
  Stats = regionprops('Table', LabeledImage, 'All');
  %%Get The Outermost Boundaries Of The Objects.
  FilledImage = imfill(BinaryImage, 'holes');
  Boundaries = bwboundaries(FilledImage);
  %%Collect Some Of The Measurements Into Individual Arrays.
  Perimeter = [Stats.Perimeter];
  Area = [Stats.Area];
  FilledArea = [Stats.FilledArea];
  Solidities = [Stats.Solidity];
  %%Calculate Circularies.
  Circularities = Perimeter.^2./(4*pi*FilledArea);
  %%Print To Command Window.
  fprintf('#, Perimeter, Area, Filled Area, Solidity, Circulariity\n');
  for BlobNumber = 1:NumberOfObjects
      fprintf('%d, %9.3f, %11.3f, %11.3f, %8.3f, %11.3f\n',...
          BlobNumber, Perimeter(BlobNumber), Area(BlobNumber),...
          FilledArea(BlobNumber), Solidities(BlobNumber), Circularities(BlobNumber));
  end
  for BlobNumber = 1:NumberOfObjects
      % Outline the object so the user can see it.
      ThisBoundary = Boundaries{BlobNumber};
      subplot(2,2,2); % Switch to upper right image.
      hold on
      % Display previous boundaries in blue.
      for k = 1:BlobNumber-1
          ThisBoundary = Boundaries(k);
          plot(ThisBoundary(:,2), ThisBoundary(:,1), 'b', 'LineWidth', 3);
      end 
      % Display this boundary in red.
      ThisBoundary = Boundaries{BlobNumber};
      plot(ThisBoundary(:,2), ThisBoundary(:,1), 'r', 'LineWidth', 3);
      subplot(2,2,4); % Switch to lower right image.
      %%Determaine The Shape.
      if Circularities(BlobNumber) < 1.10
       Message = sprintf('The Circularity Of Object #%d is %.3f, \nso The Object Is Circle',...
           BlobNumber, Circularities(BlobNumber));
       Shape = 'Circle';
      elseif Circularities(BlobNumber) < 2.0
       Message = sprintf('The Circularity Of Object #%d is %.3f, \nso The Object Is Retangle',...
           BlobNumber, Circularities(BlobNumber));
       Shape = 'Rectangle';
      else
           Message = sprintf('The Circularity Of Object #%d is %.3f, \nso The Object Is Something else',...
           BlobNumber, Circularities(BlobNumber));
       Shape = 'Something else';
      end
      %%Display In Overlay Above The Object.
      OverlayMessage = sprintf('Object #%d = %s\ncirc = %.2f, s = %.2f',...
          BlobNumber, Shape, Circularities(BlobNumber), Solidities(BlobNumber));
     text(Stats(BlobNumber).Centroid(1), Stats(BlobNumber).Centroid(2),...
         OverlayMessage, 'color', 'r');
     button = questdlg(Message, 'Continue', 'Continue', 'Cancel', 'Continue');
     if strcmp(button, 'Cancel')
         break;
      end
  end
2 Comments
Answers (0)
This question is closed.
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
