如何在MATLAB中从地标中裁剪脸部?

时间:2015-11-20 00:26:29

标签: matlab image-processing crop

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

enter image description here

现在我想"关闭"这个轮廓来自外面的下巴和眉毛,并将一切都掩盖为零,所以我想获得这样的东西:

enter image description here

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

  1. 计算"外部"多边形,并从中创建一个面具
  2. 确定内部区域,乘以二进制掩码,并从边界框中裁剪
  3. 我不确定如何做其中任何一个。是否有简单的,特定于MATLAB的方法?还是一个例子?

    感谢您的帮助!

    修改

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

    编辑2

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

    所以我猜现在这个问题转变为:

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

1 个答案:

答案 0 :(得分:2)

您可以按如下方式使用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);

输出图片:

enter image description here enter image description here