java 肤色检测

来源:互联网 发布:mac终端隐藏显示命令 编辑:程序博客网 时间:2024/04/28 20:44
肤色模型在人脸识别中已被广泛使用.常见的肤色检测是通过把R,G,B各分量转换成对数值,并进一步得到肤色的色度和饱和度以进行肤色分割.常见的肤色检测在RGB空间里的算法如下:
R>95 G>40 B>20R>GR>B Max(R,G,B)-Min(R,G,B)>15 Abs(R-G)>15

满足上述公式即可认为,是肤色。这是经验得到的~

我们还可有转换颜色空间,通过把R,G,B各分量转换成对数值,并进一步得到肤色的色度和饱和度以进行肤色分割.本文则对肤色色调在YHV和YIO颜色空间中的分布作线性化处理.RGB空间到YUV空间的转换用矩阵表示如下

其中,U和V是平面上两个相互正交的矢量,色度信号(即U与V之和)是一个二维矢量,称之为色度信号矢量.每一种颜色对应一个色度信号矢量,它的饱和度由模值Ch表示,色调
由相位角θ表示

图2是YUV色彩空间中的色度信号矢量图.白色和黑色都由原点(0,0)表示,模值为0,相位角任意.在YUV空间的UV平面上,肤色的色调介于红与黄之间.根据对大量图像的彩色分析,可以确定人的肤色色调6的变化范围,如图3所示.把彩色图像的象素p由RGB空间变换到YUV空间,如果满足条件,θp在[100,150]内,则p是肤色点.

YIQ表示法的定义是基于这样一个原则:对颜色编码所得信号的冗余信息最少或者说人眼看不见的就无需传送和重现.其中1色度分量选在相位角为173的红色和303的青蓝色色调位置Q色度,分量选在色分解力弱的紫红色和绿黄色色调位置上充分利用了人眼的色分辨力.将YUV色空间的UV平面逆时针方向旋转33就得到了YIQ空间的10平面.从RGB空间到YIQ空间的矩阵转换如下:

在YIQ空间中1分量代表从桔黄到蓝绿的色调I值越小包含的黄色越多蓝绿色越小.所以肤色在YIQ空间内的I值在一个范围里变化通过试验和统计分析可确定其范
围为[20,90]。

此外,在YCbCr颜色空间的简单阈值肤色识别算法则更为简单,将图像转换到YCbCr颜色空间,然后按下述计算式判断是否属于皮肤区域:

    

Cb > 77 And Cb < 127Cr > 133 And Cr < 173
YCbCr颜色空间与RGB的转换如下:

Y   = 0.257*R+0.564*G+0.098*B+16Cb = -0.148*R-0.291*G+0.439*B+128Cr  = 0.439*R-0.368*G-0.071*B+128

好了,原理说完了,先给出RGB空间的肤色检测算法:

public Image RGBskinDetection(){if(gray)return this;Image copy = this.clone();int[] d = new int[h*w];for(int i =0;i<this.h;i++){for(int j=0;j<this.w;j++){if(red[j+i*w] >95)if(green[j+i*w]>40)if(blue[j+i*w]>20)if(red[j+i*w] >green[j+i*w])if(red[j+i*w] >blue[j+i*w])if(check(red[j+i*w], green[j+i*w], blue[j+i*w]))if(Math.abs(red[j+i*w]-green[j+i*w])>15)d[j+i*w] = 255;}}copy.data = d;copy.gray = true;return copy;}
原图:


效果如下:



在在YCbCr颜色空间检测如下:

public Image skinDet(){if(gray)return this;Image copy = this.clone();int[] d = new int[h*w];for(int i =0;i<this.h;i++){for(int j=0;j<this.w;j++){int R = red[j+i*w];int G = green[j+i*w];int B =  blue[j+i*w];//double Y  = 0.299*R+0.587*G+0.114*B;double Cb = 128 - 0.168736*R - 0.331264*G + 0.5*B;double Cr = 128 + 0.5*R - 0.418688*G - 0.081312*B;if(Cb > 77 && Cb<127 && Cr>133 && Cr<173)d[j+i*w] = 255;}}copy.data = d;copy.gray = true;return copy;}

效果如下:

其它的两种方法,就交由读者自己实现了,还是一样简单的~

以上

0 0
原创粉丝点击