EmguCV仅削减面部+颈部皮肤并保存新图像

Foy*_*rim 4 opencv skin face-detection edge-detection emgucv


在我的应用程序中,我将输入一个人类图像,我想将该人的脸部和颈部作为单独图像中的输出.
示例:下图作为输入:(来源:http://www.fremantlepress.com.au) http://www.fremantlepress.com.au 我想把输出的图像作为输出: 输出图像
我想执行以下算法:

1.检测面部
2.选择(面部区域*2)区域
3.检测皮肤和颈部
4.剪切所选图像的皮肤区域
5.将剪切区域保存为新图像

通过EmguCV wiki和其他在线资源,我有信心执行第1步和第2步.但我不知道如何完成第3步和第4步.
我正在寻找一些功能/方法(Cunny边缘检测) ,轮廓等)但我不知道应该如何以及在哪里应用这些方法.我正在使用EmguCV(C#)和Windows Form Application.

请帮助我如何做第3步和第4步.如果有人详细说明这两个步骤和一些代码,我将很高兴.

Chr*_*ris 9

那么有几种方法可以解决这个问题.边缘检测只会为您提供边缘的二进制图像,您必须执行一些线性跟踪或Hough变换来检测这些的位置.准确性会有所不同.

我会假设您可以检测到眼睛和脸部的相对位置.我希望统计滤波器能提供比有神经网络更好的性能的有利结果,而神经网络是最好的选择.如果使用彩色图像,一个好的替代方案是自然的颜色分割(这更容易实现).我还假设头部位置可以稍微改变,颈部在图像中或多或少可见.

所以对于统计过滤器:

(请注意,在处理灰度图像时,个体的背景类似于面部数据,因此使用彩色图像会更好).

  1. 拍一张原始图像的空白副本.我们将在此形成一张我们脸上的二进制图,而没有必要让我们更容易地检查我们的成功

  2. 在原始图像中找到面部,眼睛和嘴巴.

    我们可以假设来自眼睛和嘴巴的任何数据构成了脸部的一部分,并在空白副本上标记为"1".

  3. 现在我们需要一些数学,因为我们知道人脸检测算法只能检测到与摄像机成一定角度的人脸.我们使用它并从图像中的某些部分的图像中选择一个统计掩模,例如从脸颊区域开始10x10像素2或3.这将是图像中最可能的脸部区域.我们使用这些数据并从图像中获取值,例如均值和标准差.

  4. 我们现在扫描我们检测到面部的图像的分段部分.我们不会做整个图像,因为这需要很长一段时间.(注意:边框的大小只有掩模的一半,不会被看到).我们检查每个像素及其周围的邻居到10x10掩模的大小.如果平均值或标准偏差(无论我们检查的是什么)与我们的滤波器相似,在10%以内,那么我们将空白副本中的这个像素标记为"1",并将该像素视为属于皮肤.

至于颜色分割:

(注意:你也可以尝试这个过程用于灰度,但由于砖砌,它会不太成功)

  1. 重复步骤1到2.

  2. 我们将再次选择我们可以预期包含面部数据的图像的某些区域(即眼睛下方10个像素).然而,在这种情况下,我们检查形成该像素颜色的数据.不要忘记HSV图像可以从这个过程获得更好的结果更多的组合.我们可以扫描图像,检查每个像素是否有类似的颜色.如果匹配则在二进制映射上标记它.

    另一种方法是从图像的RG和B光谱中减去或加上计算,其中只有数据面将存活.您可以通过使任何值> 1 == 1将其直接转换为二进制图像;

这只适用于皮肤和头发,我们需要其他过滤器.几点说明:

处理彩色图像的统计过滤器具有更大的能力,但需要更长的时间.

使用图像中的数据形成统计过滤器,因为这样可以对其他肤色进行分类.数学设计的滤波器或颜色分割将需要大量工作来实现相同的可变性.

掩模的大小很重要,掩模尺寸越大,错误发生的可能性越小,但处理时间再次增加.

如果您检查的像素已经是1(通过眼睛/鼻子/嘴巴检测分类),那么您可以通过参考二进制地图副本中的相同区域来加快该过程,然后为什么再次检查它只是跳过它.

多个皮肤过滤器将提供更好的结果,但是也可能引入更多噪声并且记住每个过滤器必须与增加处理时间的像素进行比较.

要获得一个工作准确的算法需要一些试验和错误,但你可以使用这些方法相当快速地看到可比较的结果.

我希望这能帮到你.很抱歉不包含任何代码,但希望其他人可以帮助您,如果您遇到困难并自己编写它将帮助您了解正在发生的事情并允许您减少处理时间.如果您需要任何其他建议,请告诉我,我正在进行图像分析博士学位,这样您才能知道建议是合理的.

照顾自己

克里斯

[编辑]一些快速的结果:

这是用于检测头发的20x20过滤器.我写的程序目前仅适用于灰度图像,因此皮肤检测受到石头的干扰(见后文)

面部区域的彩色图像

分段图像

平均头发过滤器的二进制映射20x20掩码允许40%错误 二进制结果图

可以看出,在这种情况下衬衫会受到干扰,因为它与头发的颜色相匹配.这可以通过简单地仅检查检测到的面部区域的前三分之一或一半来消除.

平均皮肤过滤器的二进制映射20x20掩码允许40%错误 在此输入图像描述

在该图像中,我仅使用由下巴区域形成的1个滤波器,因为残茬明显改变了滤波器行为.从个人背后的石头仍然有噪音,但使用彩色图像可以消除这一点.案例中的间隙可以由算法或其他过滤器填充.同样,衬衫的边缘也会产生噪音,但我们可以通过检测衬衫并删除形成衬衫的任何数据或仅仅在某些区域看一下来最小化这一点.

要检查的区域的示例

在此输入图像描述

为了消除假的分类,你可以采取分段图像的顶部三分之二,寻找面部和眼睛检测的宽度为面部区域的底部颈部的数据.

再次欢呼

克里斯