2010-04-18 82 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