How to extract only the object and get the extreme coordinates?
10 views (last 30 days)
Show older comments
Rhandrey Maestri
on 26 Nov 2023
Commented: Image Analyst
on 13 Mar 2024
Dear members, I would be truly grateful if you could assist me in extracting the object indicated in the image and obtaining the coordinates of its extreme points on the right and left. My goal is to calculate the distance between these extreme points and the centroid of the object. Could you please guide me on the correct approach for achieving this?
You can find the code I am working on, the tested image and a preliminar result with the elements that I am interested.
clc
clear all
close all
set(0, 'DefaultAxesFontName', 'Times New Roman');
set(0, 'DefaultUIControlFontName', 'Times New Roman');
set(0, 'defaultUitableFontName', 'Times New Roman');
set(0, 'defaultTextFontName', 'Times New Roman');
set(0, 'defaultUipanelFontName', 'Times New Roman');
font_size = 16;
line_width_size=2;
J=zeros;
number=1;
pixelTomm=50; %Physical scale conversion factor
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% importing Data %%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for framenumbers=53:576
% defining the range of the number of the images
close all
clear_all_but('number','framenumbers','xcentroid1','ycentroid1','xfit_Leading','yfit_Leading','Rfit_Leading','xfit_trailing','yfit_trailing','Rfit_trailing','Thetaleading','Thetatrailing')
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% importing Data %%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I = imread(sprintf('0000200test.jpg',framenumbers)); %Importing tif
I(:,:,3) = []; %%% removing the second and third layer of the image
I(:,:,2) = [];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Plotting the original image %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1), set(gcf,'color','w');
sz_x = 400; sz_y = 400; % size of the figure
y_pos = 600; x_pos =1; % position on the screen
set(1,'pos', [x_pos, y_pos, sz_x, sz_y]);
axes('position',[.1 .15 .8 .8]) % size of the plot in the figure
title('Original image')
figure (1)
hold on
imshow(I, []); %showing the raw image
axis on
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Binarization of the image %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
numberOfcolum = size(I, 1);% calculating the size of the raw image
numberOfrows = size(I, 2);% calculating the size of the raw image
J=zeros(numberOfcolum,numberOfrows);
% defining the matrix to store the Binarized image
for i=1:numberOfcolum
for j=1:numberOfrows
if I(i,j) < 37
%%%%%%%%%%%%%Masking the lower intensity%%%%%%%%%%
J(i,j)=0;
else
J(i,j)=1;
end
j=j+1;
end
i=i+1;
end
figure,imshow(J); %showing the black and white image
J = bwareaopen(J,20000); %Remove small objects from binary image
figure,imshow(J);
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Detect Entire droplet and fill the hollow region %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[~, threshold] = edge(J, 'sobel'); %findig the edge of the bubble
fudgeFactor = .9;
BWs = edge(J,'sobel', threshold * fudgeFactor);
figure, imshow(BWs), title('binary gradient mask');
%showing the detected bubble
%%%%%%%%%%%%% Fill Interior Gaps %%%%%%%%%%%%
BWdfill = imfill(BWs, 'holes');
figure, imshow(BWdfill);
Preprocessed_Image = imcrop(BWdfill,[778.5 10.5 783 2038]);
%Cropping the original image to remove the white border
figure, imshow(BWdfill);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Plotting cropped image %%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(2), set(gcf,'color','w');
sz_x = 400; sz_y = 400; % size of the figure
y_pos = 600; x_pos =401; % position on the screen
set(2,'pos', [x_pos, y_pos, sz_x, sz_y])
axes('position',[.1 .15 .8 .8]) % size of the plot in the figure
title('Pre-processed image')
figure(2)
imshow(Preprocessed_Image);
axis on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% finding the centroid, leading and trailing edge of the bubble %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
stats = regionprops('table',Preprocessed_Image,'Centroid',...
'MajorAxisLength','MinorAxisLength');
xcentroid=stats.Centroid(1,1); % x of the centroid
x_centroid(number)=xcentroid; % storing x-location
ycentroid=stats.Centroid(1,2); % y of the centroid
y_centroid(number)=ycentroid; % storing y-location
MinorAxisLength=stats.MinorAxisLength(1); % length of Minor axis
MajorAxisLength=stats.MajorAxisLength(1); % length of Minor axis
Thanks!
3 Comments
Walter Roberson
on 26 Nov 2023
BMP is good.
It looks like there might be a background grid, possibly intended to help determine the sizes of objects? Is that grid 0.1mm spacing? At the moment I do not know how hard it would be to extract the grid, but if it is a known size and can be extracted, that would give us a way to calculate absolute sizes on the images instead of relative sizes.
Accepted Answer
Akira Agata
on 27 Nov 2023
Edited: Akira Agata
on 27 Nov 2023
How about the following?
% Load the image
I = imread('https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1552757/2000000200.bmp');
% Binarize
BW = imbinarize(I);
% Extract the ROI
BW = ~BW;
se = strel("disk", 5);
BW = imopen(BW, se);
BW = imclearborder(BW);
BW = bwareafilt(BW, 1);
BW = imfill(BW, "holes");
% Calculate the centroid
s = regionprops(BW, "Centroid");
% Calculate the extreme points
idx = any(BW);
pt1 = find(idx, 1);
pt2 = find(idx, 1, "last");
% Visualize the result
imshow(I)
hold on
xline(pt1, "r", sprintf("X = %d", pt1), "FontSize", 18)
xline(pt2, "r", sprintf("X = %d", pt2), "FontSize", 18)
h = scatter(s.Centroid(1), s.Centroid(2), "r", "filled");
legend(h, "Centroid", "FontSize", 18)
3 Comments
Image Analyst
on 13 Mar 2024
@Fernando any() gives you the linear index of all white pixels in the binary image. It is a one dimensional list. Since the list is arranged column-wise, from upper left most pixel in left most column, to lower right pixel in the right most column, it will give you the leftmost and rightmost column, though not necessarily the uppermost and lower most row. That's why I suggested bwferet
More Answers (1)
See Also
Categories
Find more on Image Processing Toolbox 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!