How to calculate the distance, in pixels, between each centroid in a binary image.
29 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
David Mabwa
am 14 Jun. 2019
Kommentiert: David Mabwa
am 18 Jun. 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 Kommentare
Akzeptierte Antwort
Image Analyst
am 15 Jun. 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 Kommentare
Weitere Antworten (1)
darova
am 15 Jun. 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 Kommentare
darova
am 17 Jun. 2019
Try this
User picks two points, find correspoding points in existing data, calculate distance between them
Siehe auch
Kategorien
Mehr zu Dimensionality Reduction and Feature Extraction finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!