一千萬個為什麽

搜索

Matlab - 在形狀邊界的邊緣正交傳播點

我有一組點,我想傳播到由二進制圖像定義的形狀邊界的邊緣。形狀邊界由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];

最佳答案

如果我正確理解您的問題(將每個點投影到形狀邊界的最近點),您可以

  1. use sub2ind to convert the "2 row by n column matrix" description to a BW image with white pixels, something like

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

  2. use imfill to fill the outside of the boundary

  3. run [D,L] = bwdist(BW) on the resulting image, and just read the answers from L.

應該相當簡單。

轉載註明原文: Matlab - 在形狀邊界的邊緣正交傳播點