2013-08-02 65 views
1

我是matlab新手,正在進行圖像處理。我正在使用roipoly功能來創建一個面具。據我所知,我可以使用這樣的:matlab roipoly命令的高級用法

I = imread('eight.tif'); 
c = [222 272 300 270 221 194]; 
r = [21 21 75 121 121 75]; 
BW = roipoly(I,c,r); 
figure, imshow(I) 
figure, imshow(BW) 

下面的圖像示出: image1

一個觀察我是,當由c & R矩陣中指定的相鄰點之間的內插是通過「線性插值」完成,換句話說,在點之間總是繪製一條直線。是否有可能包含其他類型的插值,如二次或三次樣條插值?

假設我真正想要的是要做到這一點如下圖所示的畫面。 [請原諒我的繪畫,它不太好]。

image2

這裏的圓圈表示輪廓上的點。我希望提取或創建的圖形處於如線條所示的形狀。正如你所看到的,只有當我們使用樣條或二次方程進行插值而不是通過roipoly完成的線性插值時纔有可能。

我該怎麼做?你們能幫我嗎?

回答

2

您可以使用imellipse:

I = imread('eight.tif'); 
% roughly estimating ellipse values from your given c/r 
c = [222 272 300 270 221 194]; 
r = [21 21 75 121 121 75]; 
xmin = min(c); 
ymin = min(r); 
width = range(c); 
height = range(r); 

h_im = imshow(I); 
e = imellipse(gca,[xmin ymin width height]); 
BW = createMask(e,h_im); 

figure, imshow(I) 
figure, imshow(BW) 

如果你不想使用Eclipse,您可以使用interp1或其他插值功能上c和r:

% editing r and c so the shape closes - just take first value, append to end: 
c = [222 272 300 270 221 194 222]; 
r = [21 21 75 121 121 75 21]; 
% adjust interpolation to suit 
c2 = interp1(1:7,c,1:0.2:7,'pchip'); 
r2 = interp1(1:7,r,1:0.2:7,'pchip'); 
BW2 = roipoly(I,c2,r2); 

example interpolated roipoly

+0

不,這實際上不起作用。不能保證輪廓上的點將被均勻分佈。我想要的是繪製一個數字,即使這些點沒有被放置在一個「好」的幾何圖案中。 因此我特意問了關於插值的問題。 – roni

+1

你的意思是說它們在物體周圍的位置不均勻,或者所期望的形狀不能用日食來粗略定義?一個例子會很好,但同時看到使用interp1或類似的編輯。 – nkjt

+0

謝謝。這可能工作。我會試一試。是的,你知道它是正確的!它工作出色。我接受了你的答案!你能否告訴我,如果我可以編寫自己的自定義函數來將它集成到roipoly函數中?你可以告訴我關於指導方針... – roni