2010-03-01 43 views
3

例如,如果我已經得到描述圖像上的一個矩形如何使用MATLAB內插圖像上的矢量座標?

xy=[165 88; 
    401 88; 
    401 278; 
    165 278]; 

的載體。

我如何獲得使用MATLAB內置函數以下矢量

[165 88; % increase X -  hold y 
166 88; 
167 88; 
    ... ; 
399 88; 
400 88; 
401 88; % hold  x - increase y 
401 89; 
401 90; 
401 91; 
    ... ; 
401 276; 
401 277; 
401 278; % decrease X -  hold y 
400 278; 
399 278; 
398 278; 
    ... ; 
167 278; 
166 278; 
165 278; % hold  x - decrease y 
165 277; 
165 276; 
    ... ; 
165 87]; 

還是需要使用for循環寫呢?

該算法必須適用於具有n點和xy座標的通用向量。使用IND2SUB

+0

正確地說,xy不是矢量,而是2列矩陣。 – yuk 2010-03-01 19:19:04

回答

4

如果您有圖像處理工具箱,你可以通過創建多邊形,然後找到輪廓的圖像做到這一點:

xy=[165 88; 401 88; 401 278; 165 278]; 
%# create the image - check the help for impolygon for how to make sure that 
%# your line is inside the pixel 
img = poly2mask(xy(:,1),xy(:,2),max(xy(:,1))+3,max(xy(:,2))+3); 
figure,imshow(img) %# show the image 

%# extract the perimeter. Note that you have to inverse x and y, and that I had to 
%# add 1 to hit the rectangle - this shows one has to be careful with rectangular 
%# polygons 
boundary = bwtraceboundary(logical(img),xy(1,[2,1])+1,'n',8,inf,'clockwise'); 

%# overlay extracted boundary 
hold on, plot(boundary(:,2),boundary(:,1),'.r') 

編輯來展示如何使用bwtraceboundary和警告像素相抵消矩形。

+0

非常好!唯一的問題是「out」的排序。 「out」的相鄰元素必須是2d曲線的相鄰點:'( – EnneKappa 2010-03-01 20:39:27

+0

然後您應該使用bwtraceboundary而不是bwperim – Jonas 2010-03-01 21:19:39

+0

謝謝!!! boundary = bwtraceboundary(img,[xy(1,2)+1 xy 1,1)+1],'N'); – EnneKappa 2010-03-01 22:31:30

0

一種解決方案:

xy=[165 88; 401 88; 401 278; 165 278]; 
xmin = min(xy(:,1))-1; 
xmax = max(xy(:,1)); 
ymin = min(xy(:,2))-1; 
ymax = max(xy(:,2)); 

ncol=xmax-xmin; 
nrow=ymax-ymin; 

[xn yn]=ind2sub([nrow ncol],1:nrow*ncol); 
xypairs = [xn'+xmin yn'+ymin]; 
+0

但我只想要周長和通用向量xy可以描述一個多邊形,而不僅僅是一個矩形。 – EnneKappa 2010-03-01 19:26:13

+0

對不起,沒有得到最後一句話。您需要循環遍歷多邊形的每條邊(只有n個循環),並通過線性迴歸計算座標。 – yuk 2010-03-01 19:48:29

0

的快速和骯髒的方式來繪製直道到一個離屏矩陣是通過評估式a*X+b*Y=c

令h和w是寬度和高度的緩衝液:

X = repmat([0:w-1], h, 1) 
Y = repmat([0:h-1]', 1, w) 

對於每對點(X1,Y1) - >(X2,Y2)的a,b和c是:

a = y2-y1 
b = x1-x2 
c = x1*y2-x2*y1 

現在計算straigt:

st = a*X+b*Y-c 
st(abs(st)>1) = 1 
st = 1 - abs(st) 

矩陣st由含有反走樣直線的交接AW * H矩陣通過點(x1,y1)和(x2,y2)。現在讓我們從直行到一行屏蔽掉不需要的部分:

[xs] = sort([x1 x2]) 
st = st .* [zeros(h, xs(1)) ones(h, xs(2)-xs(1)) zeros(h, w-xs(2))] 
[ys] = sort([y1 y2]) 
st = st .* [zeros(ys(1), w) ; ones(ys(2)-ys(1), w) ; zeros(h-ys(2), w)] 

我們剛纔手動繪製,沒有任何明確的循環單行。對代碼的效率沒有任何保證:-)

最後:爲上面的每個公式添加另一個維度(作爲讀者的練習留下)。