【问题标题】:EmguCV Cut Face+Neck Skin Only And Save New ImageEmguCV 仅切割面部+颈部皮肤并保存新图像
【发布时间】:2011-09-20 21:53:54
【问题描述】:


在我的应用程序中,我将输入一个人物图像,并且我想将该人的仅面部和颈部作为单独图像的输出。
示例:下图作为输入:(来源:http://www.fremantlepress.com.au) 我想获得向上的图像作为输出:
我要执行以下算法:

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

在浏览 EmguCV wiki 和其他在线资源时,我有信心执行第 1 步和第 2 步。但我不确定如何完成第 3 步和第 4 步。
我正在研究一些功能/方法(Cunny Edge Detection、Contour 等),但我不确定应该如何以及在何处应用这些方法。 我正在使用 EmguCV (C#) 和 Windows 窗体应用程序。

请帮助我如何执行第 3 步和第 4 步。如果有人详细说明这两个步骤以及一些代码,我会很高兴。

【问题讨论】:

    标签: opencv skin emgucv face-detection edge-detection


    【解决方案1】:

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

    我假设您可以检测眼睛和面部的相对位置。我希望统计过滤器能提供比神经网络更好的性能更好的结果,这是最好的选择。如果使用彩色图像,一个很好的选择自然是颜色分割(这更容易实现)。我还将假设头部位置会随着颈部在图像中或多或少可见而略有变化。

    所以对于统计过滤器:

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

    1. 获取原始图像的空白副本。我们将在此基础上形成我们脸部的二进制图,而不是 必要时,它可以让我们更轻松地检查我们的成功

    2. 在原始图像中找到人脸、眼睛和嘴巴。

      我们可以假设来自眼睛和嘴巴的任何数据都构成了脸部的一部分,并将它们标记在 带有“1”的空白副本。

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

    4. 我们现在扫描图像中检测到人脸的分割部分。我们不会做 整个图像,因为这将需要很长时间。 (注:有一半大小的边框 不会被看的面具)。我们检查每个像素及其周围的邻居 10x10 蒙版的大小。如果平均值或标准偏差(无论我们正在检查)是 类似于我们的过滤器,比如在 10% 以内,然后我们在空白副本中将此像素标记为“1” 并认为该像素属于皮肤。

    关于颜色分割:

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

    1. 重复步骤 1 到 2。

    2. 我们将再次选择图像中可以包含人脸数据的某些区域(即 10 眼睛下方的像素)。然而,在这种情况下,我们检查形成颜色的数据 像素。不要忘记 HSV 图像可以从这个过程中获得更好的结果 所以。我们可以扫描图像,检查每个像素是否有相似的颜色。如果匹配 在你的二进制地图上标记它。

      另一种方法是从图像的 R G 和 B 光谱中减去或添加 a 只有数据面才能生存。您可以通过以下方式将其直接转换为二进制图像 使任何值> 1 == 1;

    这仅适用于皮肤,因为头发我们需要其他过滤器。几点说明:

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

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

    掩码的大小很重要,掩码大小越大,错误发生的可能性就越小,但处理时间也会增加。

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

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

    要使算法准确运行,需要进行一些试验和错误,但使用这些方法您会很快看到可比较的结果。

    我希望这对您有所帮助。很抱歉没有包含任何代码,但希望其他人可以帮助您,如果您遇到困难并且自己编写代码将帮助您了解正在发生的事情并让您减少处理时间。如果您需要任何其他建议,请告诉我,我正在攻读图像分析博士学位,以便您知道这些建议是合理的。

    保重

    克里斯

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

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

    人脸区域的彩色图像

    平均头发过滤器 20x20 面具的二进制图 40% 允许错误

    可以看出,在这种情况下,衬衫会产生干扰,因为它与头发的颜色相匹配。只需检查检测到的面部区域的前三分之一或一半即可消除这种情况。

    平均皮肤过滤器 20x20 蒙版的二进制图允许 40% 错误

    在这张图片中,我只使用了从下巴区域形成的 1 个过滤器,因为胡茬明显改变了过滤器的行为。个人身后的石头仍然存在噪音,但使用彩色图像可以消除这种噪音。案例中的空白可以通过算法或其他过滤器来填补。衬衫边缘再次发出噪音,但我们可以通过检测衬衫并删除形成它的任何数据或仅在某些区域查看凹痕来最小化这种噪音。

    要检查的区域示例

    为了消除错误分类,您可以取分割图像的前三分之二,并寻找面部和检测到的眼睛的宽度到面部区域底部的颈部数据。

    再次欢呼

    克里斯

    【讨论】:

    • @Chris:谢谢兄弟..很棒的文章..:)
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多