How to find the radii of circles, centers of circles,euclidean distance between each circle and angle among (small circle-->large circle -->small circle)?
    3 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
I have 3 circled masks and i want to find the radii , centers of the circles,euclidean distance between each circle and angle between small circle-->large circle -->small circle?
(PS:i have attached the original image)
Here is the code so far (Thanks to Mathworks and Image Analyst, where i followed their guidelines to get upto this point).
% Read the original image (1st convert  from RGB to grey )
clear all;clc;
originalimage=rgb2gray(imread('new_whole_mask_P3290258.jpg'));
subplot(2,4,1);imshow(originalimage);
set(gcf,'units','normalized','outerposition',[0 0 1 1]);
drawnow;
caption=sprintf('original image showing\n1 large circle and 2 small circles.');
title(caption);
axis image;
% Obtain and display the histogram
[pixelCount,greyLevels]=imhist(originalimage);
subplot(2,4,2);
bar(pixelCount);
title('Histogram of original image');
xlim([0 greyLevels(end)]);
grid on;
% In order to get the binary, set the threshold value as 25
thresholdValue=25;
binaryImage=originalimage>thresholdValue;
% Show the threshold as a vertical red bar on the histogram
hold on;
maxYValue = ylim;
line([thresholdValue, thresholdValue], maxYValue, 'Color', 'r');
% Display the binary image
subplot(2, 4, 3);
imshow(binaryImage); 
title('Binary Image, obtained by thresholding'); 
% Label each circle to make it feasibe for calculations
labeledImage = bwlabel(binaryImage, 8);     % Label each circle 
subplot(2,4,4);
imshow(labeledImage,[]);
title('Labeled Image,from bwlabel()');
% calculate the standard deviation of each region
s = regionprops(binaryImage,originalimage, {'Centroid','PixelValues','BoundingBox'});
subplot(2,4,5); imshow(originalimage);
title('Standard Deviation of Regions');
hold on
% compare the weighted with unweighted centroid locations superimpose the centroids 
numObj = numel(s);
for k = 1 : numObj
      s(k).StandardDeviation = std(double(s(k).PixelValues));
      text(s(k).Centroid(1),s(k).Centroid(2), ...
          sprintf('%2.1f', s(k).StandardDeviation), ...
          'EdgeColor','b','Color','r');
end
hold off
% Assign pseudo random colors to each circle
coloredLabels = label2rgb (labeledImage, 'hsv', 'k', 'shuffle'); 
% pseudo random color labels
subplot(2, 4, 6);
imshow(coloredLabels);
axis image; % Make sure image is not artificially stretched 
caption = sprintf('Pseudo colored labels, from label2rgb().\nCircles are numbered from top to bottom,\n then from left to right.');
title(caption);
% Get all the circle properties
circleMeasurements = regionprops(labeledImage, originalimage, 'all');
numberOfCircles = size(circleMeasurements, 1);
% Plot the borders of all the circles on the original grayscale image 
subplot(2, 4, 7);
imshow(originalimage);
title('Outlines, from bwboundaries()'); 
axis image; % Make sure image is not artificially stretched
hold on;
% bwboundaries() returns a cell array, where each cell contains the row/column coor
boundaries = bwboundaries(binaryImage);
numberOfBoundaries = size(boundaries, 1);
for k = 1 : numberOfBoundaries
  thisBoundary = boundaries{k};
  plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);
end
hold off;
%Calculate properties of regions in the image and return the data in a table.
cal= regionprops('table',binaryImage,'Centroid','Area','FilledArea','Perimeter')
Below is the answer which i got:
cal = 
    Area                  Centroid                  FilledArea    Perimeter
      2866    679.763782274948    956.926378227495    2866          187.709  
      5122     837.71710269426     1122.0909800859    5122          258.353  
         1                 814                1157       1                0  
         1                 863                1157       1                0  
      2735    1060.16599634369    964.146983546618    2739           190.81
But this is not what i expect (as i have only 3 circles).
Kindly help me to figure this out.
0 commentaires
Réponse acceptée
  Walter Roberson
      
      
 le 6 Avr 2016
        I do not have the toolbox to test with, so I cannot tell exactly what is happening. I would point out, though, that you are using a JPG file, so you are creating compression artifacts. Depending on the exact level you threshold at, you can end up with isolated around the circles, where due to the compression artifacts a value might happen to be just above the threshold while adjacent values are below the threshold.
With that particular image with a clean black background, you can use
binaryImage = any(originalimage,3);
which is to say that you can threshold against 0.
If you must use JPEG images then your algorithm needs to take into account that the values stored in the array might not be what you think you are seeing.
8 commentaires
  Walter Roberson
      
      
 le 9 Avr 2016
				You should look at either centdists or sq_centdists but not both.
The output of squareform would be expected in this situation to be a 3 x 3 matrix with 0 along the diagonal.
Unfortunately I do not have the toolboxes to test with so I cannot run the code.
Plus de réponses (0)
Voir également
Catégories
				En savoir plus sur Image Processing Toolbox dans Help Center et File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!