Calculate the distance between two objects automatically using matlab.
Ältere Kommentare anzeigen
hi there!
i am currently doing project on image processing in matlab, in which I'm assigned to calculate the Euclidean distance between two object automatically.here is the image link https://imageshack.com/i/pcUJ9tQgj i first converted the image to binary using 'im2bw', then i applied 'canny' edge detection method and obtained the edges, and by using 'find' function i got the corresponding pixel values. And i am not able to processed further, problem is i have to get array of pixel coordinates for object A and object B separately. and the code has to find which pixel coordinates is nearer between both objects and calculate the nearer distance. I'd very much appreciate your input.
Sincrely, lakshya
Akzeptierte Antwort
Weitere Antworten (6)
5 Kommentare
Image Analyst
am 31 Aug. 2014
I think you misunderstood your guide. You do need to find the edges because of the measurement you need to make, but that does not mean that you do edge detection like Canny, Sobel, etc. It means that you first need to find the objects (and thresholding will do a great job here), and then find the boundary with bwboundaries. That is just what I did in my answer.
Steve Eddins of the image processing team at the Mathworks has also written a book. Go here to amazon.com to see it.
Coursera has some online university level classes: https://www.coursera.org/courses?search=image%20processing
You can find several others via Google.
Lakshya
am 2 Sep. 2014
Image Analyst
am 2 Sep. 2014
For images that are flat and perpendicular to the optic axis, you can adapt my spatial calibration demo, attached.
For scenes at some arbitrary oddball angle, you'll need the Computer Vision System Toolbox http://www.mathworks.com/products/computer-vision/features.html#camera-calibration because the spatial calibration factor at different locations in the scene will be different.
Lakshya
am 20 Sep. 2014
Image Analyst
am 20 Sep. 2014
I can't really add more than what I said in my prior comment.
Ahmed Mehar
am 1 Jul. 2015
0 Stimmen
You Can calculate the Distance of multiple Objects of Center point by using this code:
k=2; for i=1:1:length(g)-1 x(i) = g(i).Centroid(1); y(i) = g(i).Centroid(2);
x(k)=g(k).Centroid(1); y(k)=g(k).Centroid(2);
distance=sqrt((x(i)-x(k))^2+(y(i)-y(k))^2);
Mehul Sompura
am 9 Okt. 2019
0 Stimmen
How do i find the distance between these two cars??
1 Kommentar
Image Analyst
am 10 Okt. 2019
Try imdistline()
Vihan P
am 23 Apr. 2021
0 Stimmen
@Image Analyst I have been following the code you attached above 'test3' for finding the distance between two objects. I am unable to find the distance between the objects, instead I am able to find the distance between the boudary of the image to one of the objects. I am attaching the input as well as the output image that I am getting after applying your code, please help me find the minimum distance between these two bones. 


5 Kommentare
Image Analyst
am 23 Apr. 2021
Vihan P
am 23 Apr. 2021
@Image Analyst I have started my own question and tagged you in it as well!
Image Analyst
am 25 Apr. 2021
Vihan, it looks like Matt J answered your question and you accepted it.
Vihan P
am 25 Apr. 2021
Hello @Image Analyst Yes, he did help me find a solution. Although, I would love to understand how things can be changed in the code that you have provided.
Image Analyst
am 26 Apr. 2021
@Vihan P, see code adapted for your image. I also did it both ways, using sqrt(), where I just plotted one of the closest pairs, and pdist2() where I plotted all 3 of the closest pairs.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fprintf('Beginning to run %s.m ...\n', mfilename);
fontSize = 13;
% 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
%===============================================================================
% Read in a standard MATLAB color demo image.
folder = pwd; %'C:\Users\Lakshya\Documents\Temporary';
baseFileName = 'knee.png';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
% Didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image. numberOfColorBands should be = 3.
[rows, columns, numberOfColorBands] = size(grayImage);
% Display the original image.
subplot(2, 2, 1);
imshow(grayImage);
axis on;
title('Original Gray Scale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Binarize the image
binaryImage = imbinarize(grayImage);
% Display the image.
subplot(2, 2, 2);
imshow(binaryImage);
title('Binary Image', 'FontSize', fontSize);
% Fill the outline to make it solid so we don't get boundaries
% on both the inside of the shape and the outside of the shape.
binaryImage = imfill(binaryImage, 'holes');
% Display the image.
subplot(2, 2, 3);
imshow(binaryImage);
% bwboundaries() returns a cell array, where each cell contains the row/column coordinates for an object in the image.
% Plot the borders of all the coins on the original grayscale image using the coordinates returned by bwboundaries.
hold on;
boundaries = bwboundaries(binaryImage);
numberOfBoundaries = size(boundaries, 1);
for k = 1 : numberOfBoundaries
thisBoundary = boundaries{k};
plot(thisBoundary(:,2), thisBoundary(:,1), 'r', 'LineWidth', 3);
end
title('Filled Binary Image with Boundaries', 'FontSize', fontSize);
hold off;
% Define object boundaries
numberOfBoundaries = size(boundaries, 1)
boundary1 = boundaries{1};
boundary2 = boundaries{2};
boundary1x = boundary1(:, 2);
boundary1y = boundary1(:, 1);
x1=1;
y1=1;
x2=1;
y2=1;
overallMinDistance = inf; % Initialize.
index1 = 1;
index2 = 1;
for k = 1 : length(boundary2)
boundary2x = boundary2(k, 2);
boundary2y = boundary2(k, 1);
% For this blob, compute distances from boundaries to edge.
allDistances = sqrt((boundary1x - boundary2x).^2 + (boundary1y - boundary2y).^2);
% Find closest point, min distance.
[minDistance(k), indexOfMin] = min(allDistances);
if minDistance(k) < overallMinDistance
overallMinDistance = minDistance(k);
x1 = boundary1x(indexOfMin);
y1 = boundary1y(indexOfMin);
x2 = boundary2x;
y2 = boundary2y;
index2 = k;
index1 = indexOfMin;
end
end
% Report to command window.
fprintf('Min Distance from sqrt() method = %f at index %d of boundary 1 and index %d of boundary 2.\n', ...
overallMinDistance, index1, index2);
hFig = figure;
h1 = subplot(1, 2, 1);
imshow(binaryImage);
axis on;
title('Closest Distance from sqrt()', 'FontSize', fontSize);
h2 = subplot(1, 2, 2);
imshow(binaryImage);
axis on;
title('Closest Distances from pdist2()', 'FontSize', fontSize);
hFig.WindowState = 'maximized';
hold on;
% Draw a line between point 1 and 2
line(h1, [x1, x2], [y1, y2], 'Color', 'y', 'LineWidth', 3);
%======================================================================================
% For comparison, use pdist2()
allDistances2 = pdist2(boundary1, boundary2);
minDistance2 = min(allDistances2(:));
% Find all points that have that min distance - there may be several that have it.
[r, c] = find(allDistances2 == minDistance2)
boundary1x = boundary1(:, 2);
boundary1y = boundary1(:, 1);
boundary2x = boundary2(:, 2);
boundary2y = boundary2(:, 1);
for k = 1 : length(r)
% Report to command window.
index1 = r(k);
index2 = c(k);
fprintf('Min Distance from pdist2() method = %f at index %d of boundary 1 and index %d of boundary 2.\n', ...
minDistance2, index1, index2);
xLine = [boundary1x(index1), boundary2x(index2)];
yLine = [boundary1y(index1), boundary2y(index2)];
line(h2, xLine, yLine, 'Color', 'm', 'LineWidth', 1.5);
end

You can't see the magenta lines in the right image very well, but they're there.
Rhandrey Maestri
am 17 Sep. 2022
Bearbeitet: Rhandrey Maestri
am 17 Sep. 2022
0 Stimmen
Following this code. Can you tell me how to detect the bubble border(black region) and the tube wall(this black line near the bubble). And then calculate the distance between the border of the bubble and the closest wall pixel near this bubble?
Also if I know that the inside diameter is 15 mm. Can I have this distances in mm?
Appreciate

1 Kommentar
Image Analyst
am 17 Sep. 2022
@Rhandrey Maestri, start a new question with this since it's sufficiently different. In there, show us how you processed the horizontal profile
horizontalProfile = mean(grayImage);
plot(horizontalProfile, 'b-');
to find the two valleys, and how you used thresholding to get the bubble, then how you use find() to find the edges, row-by-row, of the inner walls and the outer bubble walls. If you still need help, I'll help you there.
There is a variety of ways to do this, and it could be easier if you knew that the walls and bubbles were in approximately the same location every time, like just mask off the middle part and deal with only the central part, then threshold and take the 3 largest blobs with bwareafilt.
Fariya
am 20 Dez. 2022
0 Stimmen
1 Kommentar
Image Analyst
am 20 Dez. 2022
Use imdistline to find the distance in pixels. Use the camera calibration functionality in the Computer Vision Toolbox if you need real world distances.
Kategorien
Mehr zu Object Analysis finden Sie in Hilfe-Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!






