【问题标题】:How to extend a set of points in MATLAB如何在 MATLAB 中扩展一组点
【发布时间】:2016-02-28 22:35:27
【问题描述】:

假设我的脸上有地标点,如下:

我想通过选择外下巴地标并扩展它们来计算(估计)它们的上边界,所以我想实现这样的新点:

所以我想“跟随”由点 1,2 和 3 生成的曲线,并将等距点放在顶部,这样我就可以使用 MATLAB 的boundary 函数裁剪图像。

我想我需要为数据点拟合一个二阶多项式,但我不确定如何。那么如何生成这些点呢?

感谢您的帮助,

编辑

这是一个示例地标集的坐标:

图片:

地标(1:3,即左侧):

   x         y  
431.1901  547.9975
438.7422  611.0103
451.4842  668.0488

地标(17:-1:15,即右)

   x         y  
876.6581  509.5234
878.1327  568.9854
880.7731  619.5879

编辑 2

这是17个下巴标志的完整坐标:

   1.0e+03 *

    1.1974    1.3956
    1.2266    1.5488
    1.2554    1.6876
    1.2766    1.8245
    1.3266    1.9530
    1.4098    2.0648
    1.5420    2.1567
    1.6719    2.2222
    1.8180    2.2444
    1.9585    2.1991
    2.0642    2.1208
    2.1761    2.0351
    2.2575    1.9243
    2.3038    1.7937
    2.3191    1.6580
    2.3376    1.5264
    2.3537    1.3825

【问题讨论】:

  • 你可以在外边界拟合一个椭圆吗?
  • @lhcgeneva 谢谢,但我该怎么做呢?
  • 你能提供下巴标志的绿点集吗?
  • @lhcgeneva 完成。但我真的很感激一个代码示例,最好是在 MATLAB 中。
  • 也许地标不是正确的要求,我的意思是你得到的 17 分。

标签: matlab image-processing data-fitting


【解决方案1】:

您可以在Ohad Gal创建的File Exchange 987654324 @

您需要略微修改它,因此它还返回您要用于提取数据的绘图句柄。为此,将标题更改为

function [ellipse_t, h] = fit_ellipse( x,y,axis_handle )

并添加

     h = gca;

to the bottom of the file.

然后做

close all;
clear all;
landmarks = [1.1974    1.3956; 1.2266    1.5488; 1.2554    1.6876;
             1.2766    1.8245; 1.3266    1.9530; 1.4098    2.0648
             1.5420    2.1567; 1.6719    2.2222; 1.8180    2.2444
             1.9585    2.1991; 2.0642    2.1208; 2.1761    2.0351
             2.2575    1.9243; 2.3038    1.7937; 2.3191    1.6580
             2.3376    1.5264; 2.3537    1.3825];

[e, h] = fit_ellipse(landmarks(:, 1), landmarks(:, 2), gcf);
ch=get(h,'Children');
x=get(ch,'Xdata');
y=get(ch,'Ydata');
plot(x,y);
hold on;
x_l = landmarks(:, 1);
y_l = landmarks(:, 2);
plot(x_l, y_l);
m = min(landmarks(:, 2)); %Get the smallest y value from your landmarks
y_subset = y(y<m);
x_subset = x(y<m);
plot(x_subset, y_subset, 'r.', 'MarkerSize', 10)
axis equal;

产生

这里,红点是您的新样本点。另请注意,在您的情况下显然,Y轴反转,因为您正在显示图像。这不会在代码中更改任何内容。

或者,如果速度很重要:注释出在fit_ellipse()的底部的绘图部分。将函数头更改为

function [ellipse_t, rotated_ellipse] = fit_ellipse( x,y )

并使用以下代码:

[e, r] = fit_ellipse(landmarks(:, 1), landmarks(:, 2));
x = r(1, :);
y = r(2, :);
x_l = landmarks(:, 1);
y_l = landmarks(:, 2);
m = min(landmarks(:, 2)); %Get the smallest y value from your landmarks
y_subset = y(y<m);
x_subset = x(y<m);

【讨论】:

  • 非常感谢!以及如何生成新的点(第二个图像中的红色)? span>
  • 只拍摄x和y的子集? span>
  • 我已经知道x和y?如何拍摄他们的子集帮助?我真的不明白我们如何完成这个椭圆,并在其中的“顶部”部分上的点来进行样本? span>
  • ah,您正在使用绘图点的点。这是出色的简单,谢谢:)抱歉不太了解。但是我想分析点计算点,并且只有在我想要的时候绘制它们,因为默认情况下绘制较慢,右图,右,右图,右图
猜你喜欢
  • 2013-10-15
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 2013-02-24
  • 2014-07-14
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多