【问题标题】:How to crop face from landmarks in MATLAB?如何从 MATLAB 中的地标中裁剪人脸?
【发布时间】:2016-02-22 08:45:05
【问题描述】:

我有外部地标点的位置,如下所示:

现在我想从外下巴和眉毛“关闭”这个轮廓,并将所有东西都掩盖到零,所以我想获得这样的东西:

所以我想我有两件事要做:

  1. 计算“外部”多边形,并用它创建一个遮罩
  2. 确定内部区域,与二进制掩码相乘,然后从边界框裁剪

我不知道该怎么做。有没有简单的、特定于 MATLAB 的方法?还是举例?

感谢您的帮助!

编辑

我从这个page 中找到了roipoly,但它要求用户给出我猜的多边形。可以自动计算吗?

编辑 2

是的,我可以,只需 BW = roipoly(img, c,r); img2 = img.*uint8(BW); 然而,问题仍然存在,哪些地标用于轮廓。我可以根据规则分配它们,但是如果我想自动选择“外部”地标怎么办?

所以我猜现在问题变成了:

给定 2D 平面上的 N 个点,我如何选择创建覆盖所有其他多边形的多边形的子集(即外表面)?

【问题讨论】:

    标签: matlab image-processing crop


    【解决方案1】:

    您可以使用boundarypoly2mask,如下所示。由于您没有提供面部坐标,因此我手动标记了几个点。

    clc; clear all;
    
    img = imread('FAm1z.jpg');
    figure; imshow(img);
    
    [x,y] = ginput(50);
    
    k = boundary(x,y,0);
    hold on;
    plot(x,y,'ro');
    plot(x(k),y(k));
    
    mask = poly2mask(x(k), y(k), size(img,1), size(img,2));
    mask(:,:,2) = mask;
    mask(:,:,3) = mask(:,:,1);
    
    roi = img;
    roi(mask == 0) = 0;
    
    figure; imshow(roi);
    

    输出图像:

    【讨论】:

    • 非常感谢! IIUC,您的代码还选择了外部地标,因此您放置了鼻子和嘴巴,但它成功地忽略了它们,对吗?如果是这样,这正是我想要的。再次感谢:)
    • 是的,这就是 Matlab 边界的美妙之处。您实际上可以在 [0, 1] 之间更改最后一个参数以指定收缩因子。 0 为您提供凸包。
    猜你喜欢
    • 2018-05-08
    • 2019-08-27
    • 2018-03-07
    • 1970-01-01
    • 2014-04-15
    • 2016-09-22
    • 2016-01-01
    • 2011-04-27
    • 2014-05-30
    相关资源
    最近更新 更多