Centroid detection for irregular shape objects
Show older comments
I am trying to find the centroid of irregular shaped objects from a binary image. For some objects, no centroid is detected and for some, more than one centroid is detected. I am using regionprops with bwconncomp(8-neighbourhood). Some objects have holes in them whereas others are filled.Please advice on how to proceed?
Answers (3)
Image Analyst
on 17 Mar 2015
0 votes
That sounds really bizarre. Please attach your binary image so I can try it. There can be a few reasons why you might think that some objects have two centroids, for example if you have a disc surrounded by a C - both centroids would lie in the disc. And so you might think the C had no centroid while the disc had two centroids. Be aware that the centroid of a region does not necessarily lie within the region, like in the example of a C-shaped region.
6 Comments
Image Analyst
on 17 Mar 2015
nitin, which of the 85 blobs has it's centroid in the wrong location? Run this code and tell me the number of the blob that has none or 2 or more centroids:
clc;
close all;
workspace; % Make sure the workspace panel with all the variables is showing.
format longg;
format compact;
fontSize = 20;
% Check that user has the Image Processing Toolbox installed.
hasIPT = license('test', 'image_toolbox');
if ~hasIPT
% User does not have the toolbox installed.
message = sprintf('Sorry, but you do not seem to have the Image Processing Toolbox.\nDo you want to try to continue anyway?');
reply = questdlg(message, 'Toolbox missing', 'Yes', 'No', 'Yes');
if strcmpi(reply, 'No')
% User said No, so exit.
return;
end
end
%==========================================================================
baseFileName = '1.jpg';
folder = 'C:\Temp';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% File doesn't exist -- didn't find it there. Check the search path for it.
fullFileNameOnSearchPath = baseFileName; % No path this time.
if ~exist(fullFileNameOnSearchPath, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image.
% numberOfColorBands should be = 1.
[rows, columns, numberOfColorBands] = size(grayImage);
if numberOfColorBands > 1
% It's not really gray scale like we expected - it's color.
% Convert it to gray scale by taking only the green channel.
grayImage = grayImage(:, :, 2); % Take green channel.
end
% Display the original gray scale image.
subplot(1, 2, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
% Threshold the image.
binaryImage = grayImage > 128;
% Label each blob with 8-connectivity, so we can make measurements of it
[labeledImage, numberOfBlobs] = bwlabel(binaryImage, 8);
% Apply a variety of pseudo-colors to the regions.
coloredLabelsImage = label2rgb (labeledImage, 'hsv', 'k', 'shuffle');
% Display the pseudo-colored image.
subplot(1,2, 2);
imshow(coloredLabelsImage);
caption = sprintf('%d Labeled Regions', numberOfBlobs);
title(caption, 'FontSize', fontSize);
% Get all the blob properties.
blobMeasurements = regionprops(labeledImage, 'Centroid');
numberOfBlobs = size(blobMeasurements, 1);
% Loop though showing all the blobs and their centroids
promptMessage = sprintf('Do you want to look at each blob centroid,\nor Cancel?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
subplot(1,1,1);
for k = 1 : numberOfBlobs
binaryImage = labeledImage == k;
imshow(binaryImage);
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
drawnow;
x = blobMeasurements(k).Centroid(1);
y = blobMeasurements(k).Centroid(2);
hold on;
plot(x, y, 'r+', 'MarkerSize', 30, 'LineWidth', 2);
promptMessage = sprintf('That is blob #%d of %d.\nDo you want to Continue,\nor Cancel?',...
k, numberOfBlobs);
caption = sprintf('That is blob #%d of %d.', k, numberOfBlobs);
title(caption, 'FontSize', fontSize);
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
break;
end
end

Of course your segmentation looks all messed up because I don't think blob 1 (the green one) should be virtually the entire background.
nitin arora
on 18 Mar 2015
Image Analyst
on 18 Mar 2015
Give me a blob number. I show you all the blobs one by one. What is the number of the blobs that have no centroids or two centroids? If there aren't any, then it's not a bug with regionprops but a problem in your segmentation algorithm.
nitin arora
on 23 Mar 2015
Image Analyst
on 23 Mar 2015
Well the answer is that each blob that you identified has one and exactly one centroid. Not two. Not three or four. One.
The real problem is that your segmentation is all messed up. It sort of looks like you did an edge filter, then dilated it and thresholded it, or something like that. Whatever you did, the binary image it produces (in your "Answer" below) is all messed up. I mean, you've identified virtually the whole background as one big foreground blob! Moreover, the solid black particles do not appear correctly in the segmentation. What did you do? Actually I don't know if it's even worth fixing or if it would be best to just start over with a brand new, but effective, algorithm. Anyway, attach your segmentation code so I can look at it and instruct you why it didn't work.
nitin arora
on 24 Mar 2015
nitin arora
on 17 Mar 2015
Edited: Image Analyst
on 17 Mar 2015
0 votes
Avinash Andhale
on 1 Dec 2017
0 votes
i want to find centroid of the detected object in a image ..How to do that ?
Categories
Find more on Object Analysis in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
