Center to center distances between lines: Error in vertical distances
    4 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Abdul Hannan Qureshi
 el 5 de Jun. de 2022
  
    
    
    
    
    Comentada: Abdul Hannan Qureshi
 el 6 de Jun. de 2022
            I am working on center-to-center distance between lines using following script:
IIraster = imclearborder(Irasterl);
props = regionprops(IIraster, 'Area');
allAreas = sort([props.Area])
IIraster = ~bwareaopen(~IIraster, 500); 
IIraster = bwareafilt(IIraster, 1);
[rows, columns, numberOfColorChannels] = size(IIraster)
% Get horizantal bars
barsH = medfilt2(IIraster, [1, 11]); 
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
% Get vertical bars
barsV = medfilt2(IIraster, [11, 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
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);
morespace=-5;
HDists=hypot( diff(XCrossings,1,2), diff(YCrossings,1,2));
xlocs=conv2(XCrossings,[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)+morespace,YCrossings(k)+morespace, round(HDists(i,j))+" cm",'Color','g','FontSize',12)
    end
end
VDists=hypot( diff(XCrossings,1,1), diff(YCrossings,1,1));
ylocs=conv2(YCrossings,[1,1]'/2,'same');
morespace=2;
[m,n]=size(VDists);
for i=1:m
    for j=1:n   
        k=sub2ind([8,8],i,j);
        text(XCrossings(k)+morespace,ylocs(k)+morespace, round(VDists(i,j))+" cm",'Color','r','FontSize',12)
    end
end
horizantal center-to-center distances are coming okay.

However, I am unable to adjust middle vertical center-to-center distances (highlighted in blue). these two rows are adding upper and lower lines and showing collective distances.

Irasterl.mat file is enclosed. Kindly advise.
0 comentarios
Respuestas (1)
Ver también
Categorías
				Más información sobre Image Segmentation and Analysis 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!

