如何在图像中获取线条的直径?

5

正如您所知,我正在处理图片,目前我遇到了以下问题:我不知道如何测量我附加的图像中观察到的线的直径。我可以应用一下勾股定理,但我不知道是否可以在图像中这样做。例如,在这种情况下,图像有一条粗线,但如果线比较细呢?

Example image

当线条独立时,我想知道其直径,因为很明显当有十字交叉时,直径会改变,我在下一张图片中展示了这一点。

diameter


1
你是真的想要找到交叉点吗?也许考虑骨架化并寻找交叉点而不是线条粗细上的跳跃。 - Mark Setchell
2个回答

1
以下是关于分辨率和厚度足够大时的简单技巧:
在您想要估计厚度的线上的特定点,可以采用以下两种方法之一:
1)从该点向每个角度0到180延伸一条线,并找到与原始线重叠最短的线,它将是厚度。
2)从该点开始绘制一个圆圈,每当圆圈不再与线重叠时,重新居中以实现完全重叠。当无法再次居中以实现完全重叠时,直径仍然具有重叠部分的位置是您对线的最佳估计厚度。

1
一种显示线条粗细估计的方法是使用bwdist计算每个点到最近边缘的距离,然后使用imdilate将最大值(沿着线的中心)在线宽方向上平滑。然后可以选择线上的一个点来查看其近似直径(在直径转换处,例如连接处,会有些偏差)。以下是一个示例:
img = imread('qGs5t.png');            % Load RGB image
bw = ~im2bw(img);                     % Convert to black and white and invert
bw = imclose(bw, strel('disk', 3));   % Morphological close to remove noise
distImage = bwdist(~bw);              % Distance transform
maxDist = double(max(distImage(:)));  % Find maximum distance measure
diamImage = 2.*bw.*imdilate(distImage, strel('disk', floor(maxDist)));  % Dilate and mask

imagesc(diamImage);            % Display image
colorbar;                      % Display color bar
dcmObj = datacursormode(gcf);  % Create data cursor object...
set(dcmObj, 'Enable', 'on');   % ... and enable to select points

这是具有已选择点的图像(“索引”值是近似直径):

enter image description here


但如果我想让它自动化,它会自动提取线条的直径,然后将其保存在列表或哈希映射中(其中它知道哪个线条标识符以及它的厚度)。 - AlexZ
@AlexZ:如果你想自动化它,你需要更具体地说明你想要如何完成。你会提供沿直径测量的线路吗?你希望在连接点处断开线路,并对每个段进行单独的直径测量吗?线路的直径应该报告为其长度上的最大直径还是平均直径? - gnovice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接