2016-04-24 459 views
1

我已经看到了几个关于皮肤颜色的问题,但没有在rgba中找到确切的皮肤颜色范围。有人可以告诉一个中年欧洲男人什么是min-max rgba颜色吗?什么是rgb中的肤色范围?

我的代码是这样的:

//Here should be scin min max rgba range 
static CvScalar min = cvScalar(0, 0, 130, 0);//BGR-A 
static CvScalar max= cvScalar(140, 110, 255, 0);//BGR-A 

public static void main(String[] args) { 
    //read image 
    IplImage orgImg = cvLoadImage("colordetectimage.jpg"); 
    //create binary image of original size 
    IplImage imgThreshold = cvCreateImage(cvGetSize(orgImg), 8, 1); 
    //apply thresholding 
    cvInRangeS(orgImg, min, max, imgThreshold); 
    //smooth filter- median 
    cvSmooth(imgThreshold, imgThreshold, CV_MEDIAN, 13); 
    //save 
    cvSaveImage("threshold.jpg", imgThreshold); } 

所以我只是需要在这里指定RGBA值。

+0

你为什么不测量它?拍一张照片并绘制不同肤色的直方图 – Maljam

+0

@Maljam我在哪里可以阅读如何做到这一点?以及如何制作只有我需要的颜色的直方图? –

+0

您需要选择一堆数字图片,在图片上手动指定“蒙皮”区域,提取RGB值,创建直方图。它只是编程......加上大量的手动工作。 –

回答

3

这没有真正的答案。肤色变化很大(即使是中年高加索男性),然后当您投射光线效果(过度曝光,曝光过度,低光,彩色入射光)时,您无法区分皮肤和非皮肤单独关于像素的RGB值。

我的建议是选择合理的第一个近似值,然后调整参数。不要期望能够准确地检测皮肤,而不考虑上下文......不知何故。

您可以通过查看您从谷歌搜索的“肤色色图rgb”中获得的颜色图表来获得您的第一个近似值。随你挑......


@StephenÇ什么ü通过“挑明智的一次近似,然后调整参数”是什么意思?只需从调色板中选择一种颜色,然后呢?

(忽略照明效果的问题。)由于RGB中的颜色定义了3-D空间,因此我建议在该空间中有颜色为“肤色”色调的区域。问题是要得到该区域的合理近似值,您可以从“皮肤”色调的颜色图表开始,以3-D绘制它们并找出一个简单的3D包围它们的外壳......并且不会附上看起来不正确的颜色。然后尝试基于船体的“皮肤检测”并进行相应调整。