如何找到以x / y坐标给出的两个轮廓的中心/“rdige”?

时间:2017-06-27 18:03:52

标签: matlab image-processing

我有一个问题,我认为很简单,但我被卡住了。帮助将不胜感激。

我有一个结构的两个轮廓,它们是封闭的但不是圆形的x / y坐标。其中一个完全在另一个区域内,因此它们不相交并且具有不同的长度(想想两个变形的同心旋风)。我的目标是找到跟踪两条线中间的线,就像它们之间的“脊”一样。我尝试了不同的方法(例如,使用旋转线,确定交叉点并取两个坐标的平均值)。我觉得这并不复杂,甚至可能有一些内置的方法,但我根本找不到解决方案......

感谢您的帮助!

编辑:类似于附加图像 - 蓝色和红色是两个轮廓,绿色是我(手动;))插入的中心线。

Example image

2 个答案:

答案 0 :(得分:2)

无论您是否在常规网格位置(如示例中)都有轮廓点,一般应用的方法如下所示。我将从内部多边形(yInnerxOuter,18个点)和外部多边形(yOuterplot(xOuter([1:end 1]), yOuter([1:end 1]), 'b*-'); hold on; plot(xInner([1:end 1]), yInner([1:end 1]), 'r*-'); ,22开始,使用一组坐标点。从单位广场中选出的点数:

1

enter image description here

然后我们使用meshgrid在整个地区创建一个网格,使用griddata在每个点插值(将2的值分配给外部多边形点和{{1} }到内部多边形点),并绘制对应于值1.5的{​​{3}}行:

[X, Y] = meshgrid(linspace(0, 1, 101));
Z = griddata([xInner; xOuter], ...
             [yInner; yOuter], ...
             [2.*ones(size(xInner)); ones(size(xOuter))], X, Y);
[C, H] = contour(X, Y, Z, [1.5 1.5]);

contour

这为C中的两条曲线提供了更高分辨率的轮廓。

答案 1 :(得分:1)

这是一个缺少最小例子的算法:

找到curve1的所有索引(X1,Y1)

找到curve2的所有索引(X2,Y2)

循环遍历曲线1中的所有点,并且对于曲线1中的每个点,找到到曲线2的最小距离和方向,最小化通过d=min(sqrt((X2-X1)^2+(Y2-Y1)^2))完成。

方向由theta=atan2((Y1-Y2)/(X1-X2))给出。

一旦你有了这个,你寻找的曲线是相同theta的最小距离的一半......

编辑:正如@ m7913d正确指出的那样,一旦找到每个X1,Y1和X2,Y2之间的最小距离,你可以拿平均值得到你想要的曲线的X3,Y3 ......没有实际需要用于角度估计...

以下是一个例子:

enter image description here

c=fspecial('gaussian',51,5);
c1=edge(c>1e-3);
c2=edge(c>1e-4);
[x1 y1]=find(c1);
[x2 y2]=find(c2);

for n=1:numel(x2)
         [val id]=min(sqrt((x2(n)-x1).^2+(y2(n)-y1).^2));
         x3(n)=(x2(n)+x1(id))/2;
         y3(n)=(y2(n)+y1(id))/2;
end

imagesc(c2+c1*2); hold on
plot(y3,x3,'w.');