如何从 MATLAB 中的地标裁剪面部?

How to crop face from landmarks in MATLAB?

我有外地标点的位置,像这样:

现在我想 "close" 外下巴和眉毛的这个轮廓并将所有内容屏蔽为零,所以我想获得这样的东西:

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

  1. 计算 "outer" 多边形,并从中创建一个遮罩
  2. 确定内部区域,与二进制掩码相乘,并从边界框裁剪

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

感谢您的帮助!

编辑

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

编辑 2

是的,我可以,只需 BW = roipoly(img, c,r); img2 = img.*uint8(BW); 然而,问题仍然是轮廓要使用哪些地标。我可以根据规则分配它们,但是如果我想自动 select "outer" 地标怎么办?

所以我猜现在问题转化为:

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

您可以按如下方式使用boundary and poly2mask。由于你没有提供面部坐标,我手动标记了几个点

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);

输出图像: