无法检测皮肤

Trouble detecting skin

我正在尝试使用 opencv(新功能)检测图像上的皮肤,但我已经设法检测到一些皮肤,但其余部分似乎会在图像上造成一些噪音。这是原始图片:

我的代码的结果是:

产生这个的代码:

Mat image = Imgcodecs.imread(name);

Imgproc.pyrMeanShiftFiltering(image, image, 10, 20);
Imgproc.blur(image, image, new Size(3, 3));

Mat hsv = new Mat();
Imgproc.cvtColor(image, hsv, Imgproc.COLOR_BGR2HSV);

Mat bw = new Mat();
Core.inRange(hsv, new Scalar(0, 10, 60), new Scalar(20, 150, 255), bw);

List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(bw, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_NONE, new Point(0, 0));
int s = findBiggestContour(contours);

Mat drawing = new Mat(image.size(), CvType.CV_8UC1);
Imgproc.drawContours(drawing, contours, s, new Scalar(255), -1, 8, hierarchy, 0, new Point(0, 0));

Imgcodecs.imwrite(rename(name), drawing);

如何修复代码以检测图像上的剩余皮肤并去除噪点?

我正在使用 Java 和 OpenCV 3.0.0。

由于您使用的是 findBiggestConour(),我认为您只绘制了最大的匹配,而不是全部。由于最大的轮廓恰好是第二张图片上显示的轮廓。

为了补充 JanSLO 上面所说的内容,我尝试了您的代码,而不是只绘制最大的轮廓,而是绘制了所有轮廓并得到了以下结果。

//c++ code, not java
Mat drawing = Mat::zeros(img.size(), CV_8UC1 );
for(int i=0; i < contours.size(); ++i) {
    drawContours(drawing, contours, i, Scalar(255), 3, 8, hierarchy, 0, Point(0, 0));
}
imwrite("data/skin_detect_out.jpg", drawing);

我对结果感到惊喜,因为这是一段非常简单的代码。更高级的基于像素的皮肤检测方法涉及使用训练数据制作皮肤像素的概率模型,并使用该模型对给定像素是否为皮肤进行分类。