【问题标题】:advanced usage of matlab roipoly commandmatlab roipoly 命令的高级用法
【发布时间】:2013-08-03 14:57:57
【问题描述】:

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

图片如下所示:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    你可以使用 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);
    

    【讨论】:

    • 不,这实际上不起作用。不能保证轮廓上的点会如此均匀地间隔开。我想要的是绘制一个图形,即使这些点没有放在一个“好的”几何图案中。因此,我专门问了我关于插值的问题。
    • 您的意思是它们在物体周围的间距不均匀,还是日食无法粗略定义所需的形状?一个例子会很好,但同时请参阅使用 interp1 或类似内容的编辑。
    • 谢谢。这可能有效。我会尝试一下。是的,你猜对了!它工作得很好。我接受了你的回答!您能否告诉我是否可以编写自己的自定义函数以将其集成到 roipoly 函数中?你能告诉我指导方针吗...
    • 另一个问题@nkjt。既然我们处理的是二维数据集,那我用 interp2 不是更好吗?
    • 对于 interp2,您需要一个 X、Y 和 Z - Z 是 X 和 Y 的函数,interp2 将其插值在一些新值 XI 和 YI 上。
    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多