【问题标题】:How to detect skin color using ciexyz/cielab?如何使用 ciexyz/cielab 检测肤色?
【发布时间】:2017-04-27 09:20:51
【问题描述】:

我是opencv的新手,我一直在使用CIEXYZ进行皮肤检测。但是我得到了将RGB转换为CIE Lab以获得肤色区域的问题,我根据this从RGB进行了一些计算。

原图

结果是没有什么坚果黑框。从RGB到CIEXYZ

这是二值图像

但我想这样显示

这是我的源代码:

Mat img_color_space = new Mat();
Mat mask = new Mat();

Imgproc.cvtColor(src, img_color_space, colorBgr2hsv);
Imgcodecs.imwrite(path+"CIELAB/hsv.jpg",img_color_space);
Imgproc.blur(img_color_space, img_color_space, new Size(3,3));
Mat canny_output = new Mat();

Scalar minValues = new Scalar(0,10,60);
Scalar maxValues = new Scalar(20,150,255);
// show the current selected HSV range
String valuesToPrint = "Hue range: " + minValues.val[0] + "-" + maxValues.val[0]
        + "\tSaturation range: " + minValues.val[1] + "-" + maxValues.val[1] + "\tValue range: "
        + minValues.val[2] + "-" + maxValues.val[2];
//System.out.println("tresholding:"+valuesToPrint);

Core.inRange(img_color_space, minValues, maxValues, mask);
Imgcodecs.imwrite(path+"CIELAB/mask.jpg",mask);
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();

Imgproc.findContours(mask, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE,new Point(0,0));
int s = findBiggestContour(contours);

Mat drawing = Mat.zeros(mask.size(), CvType.CV_8UC3);
Imgproc.drawContours(drawing, contours, s, new Scalar(255, 255, 255), -1,8,hierarchy,0,new Point(0,0));
Imgproc.blur(drawing, drawing, new Size(3,3));
Imgcodecs.imwrite(path+"CIELAB/biggest.jpg",drawing);

我的代码有问题吗?提前致谢!

【问题讨论】:

    标签: java opencv image-processing


    【解决方案1】:

    您可以用更简单的方式分割手。

    按原样读取您的 CIELAB 图像并将其分成三个不同的通道。分别分析每个通道,看看哪一个最能分割手。之后应用阈值。

    以下代码是python中的,可以转换成java:

    import cv2
    
    filename = 'hand.jpg'
    img = cv2.imread(filename)
    blue_channel, green_channel, red_channel = cv2.split(img)
    cv2.imshow('green_channel', green_channel)
    

    这是图片的绿色通道:

    #---I split the image in blue, green and red channels because the image I saved is in BGR format  ---#
    
    #---I applied binary threshold to the green channel---#
    ret, thresh = cv2.threshold(g, 152, 255, 1)
    cv2.imshow('thresh', thresh)
    #--- I got the following----#
    

    现在你可以找到最大的轮廓并单独分割手部

    【讨论】:

    • @FebryFairuz 很高兴我能帮上忙
    猜你喜欢
    • 2023-03-19
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2019-12-26
    • 2019-05-05
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多