Size filtering and show the position of centroids on the image

64 views (last 30 days)
Hassan
Hassan on 17 Dec 2011
Edited: Image Analyst on 20 Dec 2021
I have a binary image, BW and a grayscale image, I. I want to select only regions in the binary image with the same value that have an area > 50. For example there are 70 regions with area>50 and BW==1. I wonder how to show the position of the centroids of these regions with their number (1:70) on the image. Any suggestions?

Accepted Answer

Image Analyst
Image Analyst on 17 Dec 2011
Edited: Image Analyst on 20 Dec 2021
Size filtering and finding and displaying centroids is done in my demo "BlobsDemo" as well as some other useful things.
Otherwise, here's a shortened demo:
% Demo by Image Analyst, December, 2021.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clearvars;
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 16;
fprintf('Beginning to run %s.m ...\n', mfilename);
numSpaces = 6;
myBoard = zeros(numSpaces+1,numSpaces+1);
computersBoard = zeros(numSpaces+1,numSpaces+1);
% Read in sample image
grayImage = imread('kobi.png');
if ndims(grayImage) >= 3
grayImage = rgb2gray(grayImage);
end
% Resize this image to get our blobs in the range where 50 is a good blob area.
grayImage = imresize(grayImage, 0.6);
subplot(2, 2, 1);
imshow(grayImage, []);
impixelinfo
title('Original Image', 'FontSize', fontSize);
% Get histogram
subplot(2, 2, 2);
imhist(grayImage);
grid on;
title('Gray Level Histogram', 'FontSize', fontSize);
% Get mask
threshold = 65;
xline(threshold, 'Color', 'r', 'LineWidth', 2)
mask = grayImage < threshold;
% Fill holes
mask = imfill(mask, 'holes');
% Erode to separate them.
mask = imerode(mask, true(11));
subplot(2, 2, 3);
imshow(mask);
% Get areas of this mask
props = regionprops(mask, 'Area', 'Centroid');
allAreas = sort([props.Area])
centroids = vertcat(props.Centroid);
% Make title
caption = sprintf('%d blobs ranging from %d to %d pixels', length(props), min(allAreas), max(allAreas))
title(caption, 'FontSize', fontSize);
% Place crosshairs on the centroids.
xc = centroids(:, 1);
yc = centroids(:, 2);
hold on
plot(xc, yc, 'r+', 'MarkerSize', 15, 'LineWidth', 2);
% Now extract only those blobs with area >= 50 pixels using bwareaopen() or bwareafilt().
mask = bwareaopen(mask, 50);
subplot(2, 2, 4);
imshow(mask);
% Now redo the analysis.
% Get areas of this mask
props = regionprops(mask, 'Area', 'Centroid');
allAreas = sort([props.Area])
% Make title
caption = sprintf('%d blobs ranging from %d to %d pixels', length(props), min(allAreas), max(allAreas))
title(caption, 'FontSize', fontSize);
% Mark centroids on the image
for k = 1 : length(props)
xc = props(k).Centroid(1);
yc = props(k).Centroid(2);
caption = sprintf('+ #%d at (%.1f, %.1f)', k, xc, yc);
text(xc, yc, caption, 'Color', 'r', 'FontWeight', 'bold')
end
g = gcf;
g.WindowState = 'maximized'

More Answers (3)

bym
bym on 17 Dec 2011
from the documentation:
I = imread('coins.png');
figure, imshow(I)
bw = im2bw(I, graythresh(getimage));
figure, imshow(bw)
bw2 = imfill(bw,'holes');
L = bwlabel(bw2);
s = regionprops(L, 'centroid');
centroids = cat(1, s.Centroid);
%Display original image and superimpose centroids.
imshow(I)
hold(imgca,'on')
plot(imgca,centroids(:,1), centroids(:,2), 'r*')
hold(imgca,'off')
  3 Comments

Sign in to comment.


Walter Roberson
Walter Roberson on 18 Dec 2011
If centroid #K is at position x, y, then to label that point on the graph with that number, use
text(x,y,num2str(K));
  1 Comment
Hassan
Hassan on 19 Dec 2011
thanks Walter. this was what I wanted to complete proecsm's code for my work.

Sign in to comment.


Devie Nur AIni
Devie Nur AIni on 20 Dec 2021
Edited: Image Analyst on 20 Dec 2021
Ada yang tau ga kenapa pas coba aku running dia eror dan tulisannya
"check for missing argument or incorrect argument data tupe in call to function 'centroid'
% Peroleh pusat massa dan letakkan di tengah citra
[xc, yc] = centroid(m,n);
xc = round(xc);
yc = round(yc);
xc = xc - round((n/2));
yc = yc - round((m/2));
  1 Comment
Image Analyst
Image Analyst on 20 Dec 2021
@Devie Nur AIni, you have evidently, according to the error message, created a function called centroid, and that function does not expect two inputs m and n. Place your cursor in there and type control-D to edit that function. Or else do this on the command line:
>> edit centroid.m
I don't know what that function is supposed to do. Did you write it, or did someone else write it and you just put it on your computer?

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!