How to measure and show the center to center distance between lines at intersecting points
10 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Abdul Hannan Qureshi
le 13 Mai 2022
Commenté : Abdul Hannan Qureshi
le 14 Mai 2022
I am thankful to this platform, and due to courtesy of experts here I have been provided with assistance to attain following code:
IIraster;
[rows, columns, numberOfColorChannels] = size(IIraster)
barsH = medfilt2(IIraster, [1, 115]);
props = regionprops(barsH, 'Area', 'PixelList');
numLinesH = length(props);
hold on;
for k = 1 : numLinesH
x = props(k).PixelList(:, 1);
y = props(k).PixelList(:, 2);
coefficientsH{k} = polyfit(x, y, 2);
xFitH{k} = 1 : columns;
yFitH{k} = polyval(coefficientsH{k}, xFitH{k});
plot(xFitH{k}, yFitH{k}, 'r-', 'LineWidth', 2);
end
barsV = medfilt2(IIraster, [115, 1]);
props = regionprops(barsV, 'Area', 'PixelList');
numLinesV = length(props);
hold on;
for k = 1 : numLinesV
x = props(k).PixelList(:, 2);
y = props(k).PixelList(:, 1);
coefficientsV{k} = polyfit(x, y, 2);
xFitV{k} = 1 : rows;
yFitV{k} = polyval(coefficientsV{k}, xFitV{k});
[xFitV{k}, yFitV{k}] = deal(yFitV{k}, xFitV{k});
plot(xFitV{k}, yFitV{k}, 'r-', 'LineWidth', 2);
end
figure;
imshow(zeros(rows, columns, 'uint8'));
impixelinfo;
hold on;
axis('on', 'image')
XCrossings = zeros(numLinesH, numLinesV);
YCrossings = zeros(numLinesH, numLinesV);
for k1 = 1 : numLinesH
fprintf('Finding where vertical lines cross horizontal line #%d.\n', k1);
xyH = [xFitH{k1}', yFitH{k1}'];
plot(xyH(:, 1), xyH(:, 2), 'g-', 'LineWidth', 2);
for k2 = 1 : numLinesV
xyV = [xFitV{k2}', yFitV{k2}'];
plot(xyV(:, 1), xyV(:, 2), 'r-', 'LineWidth', 2);
distances = pdist2(xyH, xyV);
minDistance = min(distances(distances > 0));
[minRowH, minRowV] = find(distances == minDistance);
xCrossing = mean([xyH(minRowH, 1), xyV(minRowV, 1)]);
yCrossing = mean([xyH(minRowH, 2), xyV(minRowV, 2)]);
XCrossings(k1, k2) = xCrossing;
YCrossings(k1, k2) = yCrossing;
plot(XCrossings(k1, k2), YCrossings(k1, k2), 'c.', 'MarkerSize', 20);
drawnow;
end
end
plot(XCrossings(:), YCrossings(:), 'c.', 'MarkerSize', 20);
title('Crossings Found', 'FontSize', 12);
and getting following outcome

Kindly advise how can I measure and show distances between bars as an outcome, i.e., center to center distance of horizantal and vertical intersection points, as shown below:

I am using a raster image file so number of pixels = units mm. Need assistance for this query.
IIraster.mat file is enclosed for reference.
2 commentaires
Matt J
le 13 Mai 2022
Your code fails to run with the message
Finding where vertical lines cross horizontal line #1.
Undefined variable xFitH.
Error in test (line 18)
xyH = [xFitH{k1}', yFitH{k1}'];
Réponse acceptée
Matt J
le 14 Mai 2022
Modifié(e) : Matt J
le 14 Mai 2022
VDists=hypot( diff(XCrossings,1,1), diff(YCrossings,1,1));
HDists=hypot( diff(XCrossings,1,2), diff(YCrossings,1,2));
xlocs=conv2(XCrossings,[1,1]/2,'same');
ylocs=conv2(YCrossings,[1,1]'/2,'same');
figure(gcf);
[m,n]=size(HDists);
for i=1:m
for j=1:n
k=sub2ind([8,8],i,j);
text(xlocs(k),YCrossings(k), round(HDists(i,j))+" mm",'Color','g','FontSize',12)
end
end
[m,n]=size(VDists);
for i=1:m
for j=1:n
k=sub2ind([8,8],i,j);
text(XCrossings(k),ylocs(k), round(VDists(i,j))+" mm",'Color','r','FontSize',12)
end
end
Plus de réponses (0)
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!