我有一个问题,我认为很简单,但我被卡住了。帮助将不胜感激。
我有一个结构的两个轮廓,它们是封闭的但不是圆形的x / y坐标。其中一个完全在另一个区域内,因此它们不相交并且具有不同的长度(想想两个变形的同心旋风)。我的目标是找到跟踪两条线中间的线,就像它们之间的“脊”一样。我尝试了不同的方法(例如,使用旋转线,确定交叉点并取两个坐标的平均值)。我觉得这并不复杂,甚至可能有一些内置的方法,但我根本找不到解决方案......
感谢您的帮助!
编辑:类似于附加图像 - 蓝色和红色是两个轮廓,绿色是我(手动;))插入的中心线。
答案 0 :(得分:2)
无论您是否在常规网格位置(如示例中)都有轮廓点,一般应用的方法如下所示。我将从内部多边形(yInner
和xOuter
,18个点)和外部多边形(yOuter
和plot(xOuter([1:end 1]), yOuter([1:end 1]), 'b*-');
hold on;
plot(xInner([1:end 1]), yInner([1:end 1]), 'r*-');
,22开始,使用一组坐标点。从单位广场中选出的点数:
1
然后我们使用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]);
这为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 ......没有实际需要用于角度估计...以下是一个例子:
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.');