How to calculate the distance, in pixels, between each centroid in a binary image.
29 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
David Mabwa
el 14 de Jun. de 2019
Comentada: David Mabwa
el 18 de Jun. de 2019
Hi All,
In short, my question is, "how do you calculate or find out the distance in pixels, between each centroid in a binary image?". I have looked at numerous other questions and can't seem to find one that explains it in a way that I can understand. I am relatively new to Matlab (2 months to be exact, with no previous experience in any other computer language). I have attached the "original image (unprocessed)", the "binary (and rotated) figure", and the "cropped binary figure" I am working with.
I have plotted the centroids onto the cropped binary image using this code:
a1RP=regionprops(a1C,'Centroid','MajorAxisLength',...
'MinorAxisLength','Orientation', 'Eccentricity');
CentroidS=cat(1,a1RP.Centroid);
figure
imshow(a1C)
hold on
plot(CentroidS(:,1),CentroidS(:,2),'b*')
hold off
which, gives the following figure: attached as "binary image with plotted centroids"
I have tried pdist() and pdist2() but I don't understand what the output means. I get a 100x100 double output, and I am not sure how to interpret that. The code I used for that is as follows:
CentroidDistances=pdist2(CentroidS(:,1),CentroidS(:,2),'euclidean');
The reason I want to know the distance between each centroid is because I want to know what the pitch is, in the grid I am imaging, in pixels. The pitch is ~64 microns, but I want to know how many pixels in the image, correspond to 64 microns, and I think the distance between each neighbouring centroid would give me that. In my mind, I expected each of these distances to be the same, but the 100x100 array threw me off.
I really hope I am making sense. If I am not, please feel free to ask me to clarify or expand, if you want more detail
Thank you.
P.s. This is the full code I used:
imshow(a1) % a1=original image (unprocessed)
a1G=mat2gray(a1);
a1GC=imadjust(a1G);
a1GCT=graythresh(a1GC);
a1B=imbinarize(a1GC,a1GCT);
a1R=imrotate(a1B,17,'nearest','loose');
a1C=imcrop(a1R);
a1RP=regionprops(a1C,'Centroid','MajorAxisLength',...
'MinorAxisLength','Orientation', 'Eccentricity');
CentroidS=cat(1,a1RP.Centroid);
figure
imshow(a1C)
hold on
plot(CentroidS(:,1),CentroidS(:,2),'b*')
hold off
CentroidDistances=pdist2(CentroidS(:,1),CentroidS(:,2),'euclidean');
0 comentarios
Respuesta aceptada
Image Analyst
el 15 de Jun. de 2019
Try
xy = vertcat(a1RP.Centroid)
distances = pdist2(xy, xy)
Be aware that centroids are x,y, which is (column, row), not (row, column) -- just in case you ever need to do anything with the image itself. plot() should be okay though because it uses x & y.
So you did basically that and got a 100x100 array that gives the distances in pixels between every one of the 100 blobs in your image.
For the spatial calibration, what is 64 microns? What is "pitch"? Is that the distance between pixels, or the full field of view of the image?
If you used XData and YData options in imshow(), then pdist2 should give the output in microns already. If you didn't then the result in in pixels and you'll have to multiply those distances by the spatial calibration factor. Let's say that the pixel to pixel spacing is 64 microns, and you want the distance between the 34th blob and the 78th blob. You can do
dist = distances(34, 78) * 64;
If you want, you can convert the whole distances matrix at once so you don't have to do it one by one:
distances = pdist2(xy, xy) * 64 % ALL spacings will be in microns now.
3 comentarios
Más respuestas (1)
darova
el 15 de Jun. de 2019
pdist2 finds distances between every point (every possible combinations. Zeros in matrix means distance to points themselves)
→ → →
Also you use pdist2 in a wrong way. Has to be:
CentroidDistances=pdist2(CentroidS,CentroidS,'euclidean');
% something like D=pdist2(xy,xy)
Can you just pick two point, calculate distance and count the number of squares between?
5 comentarios
darova
el 17 de Jun. de 2019
Try this
User picks two points, find correspoding points in existing data, calculate distance between them
Ver también
Categorías
Más información sobre Dimensionality Reduction and Feature Extraction en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!