Size filtering and show the position of centroids on the image
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hassan
am 17 Dez. 2011
Bearbeitet: Image Analyst
am 20 Dez. 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?
0 Kommentare
Akzeptierte Antwort
Image Analyst
am 17 Dez. 2011
Bearbeitet: Image Analyst
am 20 Dez. 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'
0 Kommentare
Weitere Antworten (3)
bym
am 17 Dez. 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 Kommentare
Walter Roberson
am 18 Dez. 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));
Devie Nur AIni
am 20 Dez. 2021
Bearbeitet: Image Analyst
am 20 Dez. 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 Kommentar
Image Analyst
am 20 Dez. 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?
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!