1

设想

我正在编写一个程序来检测皮肤上的头发。到目前为止,我已经做到了这一点......

  1. 加载源图像并应用抓取以删除背景

在此处输入图像描述

  1. 应用皮肤检测获取皮肤

在此处输入图像描述

  1. 与其他区域一起执行 ANDing 以获得头发

在此处输入图像描述

  1. Ran 轮廓检测以获得最大尺寸的轮廓

在此处输入图像描述

Imgproc.drawContours(mask, contours, maxAreaIndex, new Scalar(255,255,255),1);

问题

当我尝试使用代码填充通过运行 findContour 获得的掩码时

Imgproc.drawContours(mask, contours, maxAreaIndex, new Scalar(255,255,255),Core.FILLED);

它像一样填充轮廓

在此处输入图像描述

现在,我不能将其用作掩码,因为它会产生我的结果

在此处输入图像描述

这不是我想要的。

谁能建议我如何为这个问题实现填充轮廓?

4

1 回答 1

0

您可以在提取轮廓之前应用一些膨胀侵蚀(关闭)过滤,以确保获得完整的轮廓。本质上,膨胀侵蚀所做的是通过扩展它们以使它们相交来关闭通常彼此分离的轮廓区域,然后将现在相交的轮廓缩小以使其保持正确缩放。在这里查看有关此主题的更多信息。

但是,此方法假定您已检测到图像中的大部分头发。你所做的不一样;您已在图片中检测到 NOT SKIN,并假设头发是最大的轮廓。通过这样做,当您关闭轮廓时,尤其是在人物衬衫剪裁较高的图像上,您可能会遇到一些问题,即您正在检测衬衫和头发。我将在您的管道中添加一个额外的步骤,在该步骤中,您尝试在应用此过滤之前分割出该人的衬衫。

祝你好运!

于 2016-05-07T18:52:49.820 回答