那么有几种方法可以解决这个问题。边缘检测只会为您提供边缘的二进制图像,您将必须执行一些线跟踪或霍夫变换来检测这些位置的位置。那里的准确性会有所不同。
我假设你可以检测到眼睛和面部的相对位置。我希望统计过滤器会提供比神经网络更好的性能的有利结果,这是最好的选择。如果使用彩色图像,一个很好的选择自然是颜色分割(这更容易实现)。我还将假设头部位置可能会随着颈部在图像中或多或少可见而略有变化。
所以对于统计过滤器:
(请注意,在处理灰度图像时,个人的背景与面部数据相似,因此使用彩色图像会更好)。
获取我们原始图像的空白副本。我们将在此基础上形成一张我们脸部的二进制地图,虽然没有必要,但它可以让我们更轻松地检查我们的成功
在原始图像中找到脸部、眼睛和嘴巴。
我们可以假设来自眼睛和嘴巴的任何数据都构成了面部的一部分,并在空白副本上用“1”标记这些数据。
现在我们需要一些数学知识,因为我们知道人脸检测算法只能检测到与相机成一定角度的人脸。我们使用它并从图像中某些部分的图像中选择一个统计蒙版,比如脸颊区域的 10x10 像素 2 或 3。这将是图像中最可能出现的面部区域。我们使用这些数据并从图像中获取值,例如平均值和标准偏差。
我们现在扫描图像中检测到人脸的分割部分。我们不会做整个图像,因为这需要很长时间。(注意:有一个不会被查看的蒙版一半大小的边框)。我们检查每个像素及其周围的相邻像素,大小为 10x10 掩码。如果平均或标准偏差(无论我们正在检查什么)与我们的过滤器相似,比如在 10% 以内,那么我们在空白副本中将此像素标记为“1”,并认为该像素属于皮肤。
至于颜色分割:
(注意:您也可以尝试此过程用于灰度,但由于砖砌,它会不太成功)
重复步骤 1 到 2。
同样,我们将选择我们可以预期包含面部数据的图像的某些区域(即眼睛下方 10 个像素)。然而,在这种情况下,我们检查形成该像素颜色的数据。不要忘记 HSV 图像可以从这个过程中获得更好的结果,一个组合更是如此。我们可以扫描图像,检查每个像素是否有相似的颜色。如果匹配,请在您的二进制地图上标记它。
另一种方法是从图像的 RG 和 B 光谱中减去或添加计算出的 a,只有数据面才能存活。您可以通过使任何值> 1 == 1 来直接将其转换为二进制图像;
这仅适用于皮肤,因为头发我们需要其他过滤器。几点注意事项:
处理彩色图像的统计过滤器具有更大的能力,但需要更长的时间。
使用图像中的数据来形成统计过滤器,因为这将允许对其他肤色进行分类。数学设计的过滤器或颜色分割将需要大量工作才能实现相同的可变性。
掩模尺寸很重要,掩模尺寸越大,错误发生的可能性越小,但处理时间再次增加。
如果您检查的像素已经是 1(按眼睛/鼻子/嘴巴检测分类),那么您可以通过引用二进制地图副本中的相同区域来加快该过程,那么为什么要再次检查它只是跳过它。
多个皮肤过滤器将提供更好的结果,但也可能会引入更多噪声,并且记住每个过滤器必须与像素增加处理时间相比。
要使算法准确运行,需要进行一些试验和错误,但使用这些方法您会很快看到可比较的结果。
我希望这对您有所帮助。很抱歉没有包含任何代码,但希望其他人可以帮助您,如果您遇到困难并且自己编写代码将帮助您了解正在发生的事情并让您减少处理时间。如果您需要任何其他建议,请告诉我,我正在攻读图像分析博士学位,这样您就知道这些建议是合理的。
小心
克里斯
[编辑] 一些快速的结果:
这是用于检测头发的 20x20 过滤器。我编写的程序目前仅适用于灰度图像,因此皮肤检测会受到石头的干扰(见下文)
人脸区域的彩色图像
平均头发过滤器 20x20 面具的二进制图 40% 允许错误
可以看出,在这种情况下,衬衫会产生干扰,因为它与头发的颜色相匹配。这可以通过仅检查检测到的面部区域的前三分之一或一半来消除。
平均皮肤过滤器 20x20 蒙版的二进制图 40% 允许错误
在这张图片中,我只使用了从下巴区域形成的 1 个过滤器,因为留茬明显改变了过滤器的行为。个人身后的石头仍然存在噪音,但使用彩色图像可以消除这种噪音。案例中的空白可以通过算法或其他过滤器来填补。衬衫边缘再次出现噪音,但我们可以通过检测衬衫并删除形成它的任何数据或仅在某些区域查看凹痕来最小化这种噪音。
检查区域示例
为了消除错误分类,您可以获取分割图像的前三分之二,并寻找面部和检测到的眼睛的宽度到面部区域底部的颈部数据。
再次欢呼
克里斯