如何将具有连接像素的形状分成二值图像中的两个部分

How do I split a shape with conected pixels in to two parts in a binary image

我的目标是通过移除与整个面部区域相连的颈部区域,在面部周围绘制一个矩形边框。这里所有的正值都代表肤色像素。到目前为止,我已经使用 OpenCV 和 python 过滤掉了二值图像。到目前为止的代码 skinid.py

下面是测试图

噪声消除也已应用于此二值图像

至此,我关注了这篇论文Face segmentation using skin-color map in videophone applications。对于其中的大部分,我使用自定义函数而不是使用内置的 OpenCV 函数,因为我有点想从头开始。 (虽然使用了一些侵蚀,打开,关闭来调整它)

我想知道一种从整个面部区域分离颈部并像这样去除它的方法,

因为我对整个图像处理领域还很陌生。

执行距离变换(内置于 opencv 中,或者您可以手写 使用侵蚀函数迭代编写它是一个非常有趣且简单的方法,并且每轮将结果添加到另一个矩阵中, 哈哈 慢但概念上容易)。在您上面提供的二值图像上,距离变换中的最高值(我认为在任何面部照片中都非常普遍)将是面部的中心。所以那个像素是你的盒子的中心,而且那个值(距离变换后那个像素的值)会给你一个非常可靠的近似面部大小(因为它将是从面部中心到面的水平边缘)。根据您的需求,您可能只能将该距离乘以 1.5 左右(计算出标准面宽与高度的比例等以选择最佳乘数),将其设置为您的圆半径(或半边宽一个盒子)并收工。如果您需要澄清任何内容,请发表评论,因为我对这个答案非常有信心,并且很乐意编写一些快速代码(在 c++ opencv 中),如果您需要/它会有所帮助。

(替代想法)。您可以稍微调整您的滤色器以拒绝较暗的区域(这将 至少在呈现的图像中 )由于下巴的阴影而在您的脸和脖子之间创建一个很好的分离。 (您可能需要拨回您的扩张/关闭操作)