0

我有一组点,我想将它们传播到由二进制图像定义的形状边界的边缘。形状边界由 1px 宽的白色边缘定义。

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

我想从一组点中的每个点在正交方向上投射一条射线,并检测它在哪个点与形状边界相交。正交方向已经确定。出于所需的目的,它是使用为点计算的轮廓的法线计算的,使用点-1 和点+1。

最好的方法是什么?是否有某种可以使用的光线追踪算法?

非常感谢您的帮助!

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

替代文字 http://img504.imageshack.us/img504/3107/orth.png

另一个编辑:为澄清起见,我发布了用于计算每个点的法线的代码。其中 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];
4

2 回答 2

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

这可能会以更好的方式完成,但你明白了......

于 2010-04-19T00:08:39.593 回答
0

如果我正确理解您的问题(将每个点投影到形状边界的最近点上),您可以

  1. 用于sub2ind将“2 行 x n 列矩阵”描述转换为具有白色像素的 BW 图像,例如

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

  2. 用于imfill填充边界的外部

  3. 在生成的图像上运行[D,L] = bwdist(BW),然后从L.

应该是相当简单的。

于 2010-04-19T17:57:43.740 回答