2010-04-18 81 views
0

我有一组点,我想传播到由二值图像定义的形状边界边缘。形状边界由1px宽的白色边缘定义。Matlab - 将点正交传播到形状边界的边缘

我有这些点的坐标存储在一个2行n列矩阵。该形状形成一个凹面边界,其内部没有任何孔,由大约2500点组成。我有大约80到150点,我希望在形状边界上传播。

我想从正交方向上的点集合中的每个点投射射线,并检测它在哪个点与形状边界相交。正交方向已经确定。对于所需目的,使用点1和点1计算点的等高线的法线。

什么是最好的方法来做到这一点? 是否有某种可以使用的光线追踪算法?

非常感谢您的帮助!

编辑:我试图让问题更清晰,并添加了描述问题的图像。在图像中,灰线代表形状轮廓,红点代表我要传播的点,绿线代表假想的正投射线。

alt text http://img504.imageshack.us/img504/3107/orth.png

ANOTHER编辑:为了澄清我已经发布了用于计算每个点的法线的代码。 xt和yt是存储每个点坐标的向量。计算出正常值后,可以使用linspace函数和正交线的请求长度来传播它。

%#derivaties of contour 
dx=[xt(2)-xt(1) (xt(3:end)-xt(1:end-2))/2 xt(end)-xt(end-1)]; 
dy=[yt(2)-yt(1) (yt(3:end)-yt(1:end-2))/2 yt(end)-yt(end-1)]; 

%#normals of contourpoints 
l=sqrt(dx.^2+dy.^2); 
nx = -dy./l; 
ny = dx./l; 

normals = [nx,ny]; 
+0

什么是绿线正交?通过“正交方向已经确定”,你的意思是我们可以把它看作一个给定的部分数据吗? – AVB 2010-04-20 14:05:27

回答

0

这取决于您想要针对一个形状测试多少单位矢量。如果你有一个形状和许多测试,最简单的做法可能是将你的形状坐标转换成极坐标,这些坐标已经隐含地表示你的解决方案。但是,如果您对每种形状都有不同的形状和只有少数测试,这可能不是一个非常有效的解决方案。

更新基于编辑的问题:

如果光线可以从任意点开始,不仅从本源,你必须测试对所有的点。这可以很容易地改变你的形状边界,使得您的射线测试开始的原点是(在我的示例代码正x)坐标方向

% vector of shape boundary points (assumed to be image coordinates, i.e. integers) 
shapeBoundary = [xs, ys]; 

% define the start point and direction you want to test 
startPoint = [xsp, ysp]; 
testVector = unit([xv, yv]); 

% now transform the shape boundary 
shapeBoundaryTrans(:,1) = shapeBoundary(:,1)-startPoint(1); 
shapeBoundaryTrans(:,2) = shapeBoundary(:,2)-startPoint(2); 
rotMatrix = [testVector(2), testVector(1); ... 
      testVector(-1), testVector(2)]; 
% somewhat strange transformation to keep it vectorized 
shapeBoundaryTrans = shapeBoundaryTrans * rotMatrix'; 

% now the test is easy: find the points close to the positive x-axis 
selector = (abs(shapeBoundaryTrans(:,2)) < 0.5) & (shapeBoundaryTrans(:,1) > 0); 
shapeBoundaryTrans(:,2) = 1:size(shapeBoundaryTrans, 1)'; 
shapeBoundaryReduced = shapeBoundaryTrans(selector, :); 
if (isempty(shapeBoundaryReduced)) 
    [dummy, idx] = min(shapeBoundaryReduced(:, 1)); 
    collIdx = shapeBoundaryReduced(idx, 2); 
    % you have a collision with point collIdx of your shapeBoundary 
else 
    % no collision 
end 

这将是一个更好的方式来完成可能进行,但你明白了...

+0

啊!我非常抱歉,我错误地说明了我的问题。我创建了一个新的编辑版本。我有80至200点我希望正交投射和约。 2500点测试。对不起,我会对你对这个问题的看法很感兴趣。 – binarycreations 2010-04-19 00:31:53

+0

在对这个问题进行编辑之后,我仍然认为我的更新答案应该近乎做你想做的事(然而,自己并没有尝试过它......)当你再次编辑你的问题时,我的答案中一定有一些东西丢失。你能否澄清一下哪些行不通? – groovingandi 2010-04-20 14:09:19

+0

对不起,编辑量很大。我觉得很难说出一个我不熟悉的问题。我添加了如何计算法线和图表。我不认为你的解决方案是有效的,因为它只根据选定的一个轴进行搜索。我希望这有助于,感谢你的毅力! – binarycreations 2010-04-21 21:20:12

0

如果我正确理解你的问题(项目中的每个点到形状边界的最近点),你可以

  1. 使用sub2ind到“2行乘n列矩阵”转换描述为BW白色像素的图像,像

    myimage=zeros(imagesize); myimage(imagesize, x_coords, y_coords) = 1

  2. 使用imfill填补吨的他边界

  3. 运行[D,L] = bwdist(BW)对生成的图像,并刚刚阅读从L答案。

应该相当简单。

+0

它在技术上可能并不打赌形状边界的关闭点。我已经添加了一个图表,以便更好地理解问题...... – binarycreations 2010-04-20 11:53:13

+0

@Graham:和绿线正交于什么? – AVB 2010-04-20 14:03:29