1

我是 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)

图像如下所示: 图像1

我观察到的一个观察结果是,c & r 矩阵指定的相邻点之间的插值是通过“线性插值”完成的,换句话说,点之间总是画一条直线。是否有可能以某种方式合并其他类型的插值,例如二次或三次样条插值?

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

图2

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

我怎样才能做到这一点 ?你们能帮帮我吗?

4

1 回答 1

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,可以在 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);

示例插值 roipoly

于 2013-08-02T11:30:55.260 回答