matlab roipoly命令的高级用法

时间:2013-08-02 10:56:29

标签: image matlab image-processing mask image-masking

我是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& C指定的相邻点之间的插值。 r矩阵由“线性插值”完成,在其他意义上,总是在点之间绘制直线。是否有可能以某种方式包含其他类型的插值,如二次或三次样条插值?

假设我真正想要的是这样做,如下图所示。 [原谅我的绘画,它不是很好]。

image2

这里圆圈显示轮廓上的点。我想要提取或创建的图形为线条所示的形状。正如你所看到的那样,只有通过使用样条或二次方程进行插值而不是通过roipoly进行线性插值才有可能。

我该怎么做?你们能帮助我吗?

1 个答案:

答案 0 :(得分: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)

如果您不想使用日食,可以在c和r上使用interp1或其他插值函数:

% 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