How to measure and show the center to center distance between lines at intersecting points

1 次查看(过去 30 天)
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 个评论
Matt J
Matt J 2022-5-13
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}'];
Abdul Hannan Qureshi
@Matt J I apoligize, I was trying to keep it simple for understanding but i missed the main variable. I have updated the script. Kindly try again.

请先登录,再进行评论。

采纳的回答

Matt J
Matt J 2022-5-14
编辑:Matt J 2022-5-14
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

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Images 的更多信息

产品


版本

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by