`
piperzero
  • 浏览: 3465877 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

基于像素的皮肤检测技术

 
阅读更多

基于像素的皮肤检测技术

介绍一种基于颜色空间的皮肤检测技术,可以检测亚洲人种与白人的皮肤,皮肤检测

人脸识别的基础,也是很多人像识别技术的基础操作,在实际应用中还是非常有用的。

基于像素的皮肤检测主要是寻找正确的颜色空间几何,图像处理中,常见的颜色空间

有如下几种

1.RGB色彩空间 – R代表单色红,G代表单色绿,B代表单色蓝

2.HSV色彩空间 – H 代表色彩, S代表饱和度,V代表强度值

3.YCbCr色彩空间 – 是数字电视的色彩空间

RGB转换为HSV的Java代码如下:

	public static float[] rgbToHSV(int tr, int tg, int tb) {
		float min, max, delta;
		float hue, satur, value;
		min = Math.min(tr, Math.min(tg, tb));
		max = Math.max(tr, Math.max(tg, tb));
		value = max;
		delta = max - min;
		if(max != 0) {
			satur = delta/max;
		} else {
			satur = 0;
			hue = -1;
		}
		
		if(tr == max) {
			hue = (tg - tb)/delta;
		}
		else if(tg == max) {
			hue = 2 + (tb-tr)/delta;
		} else {
			hue = 4 + (tr-tg)/delta;
		}
		hue = hue * 60.0f;
		if(hue < 0) {
			hue = hue + 360;
		}
		return new float[]{hue, satur, value};
	}

RGB转换为YCbCr的Java代码如下:

	public static int[] rgbToYcrCb(int tr, int tg, int tb) {
		double sum = tr + tg + tb;
		double r = ((double)tr)/sum;
		double g = ((double)tg)/sum;
		double b = ((double)tb)/sum;
		double y = 65.481 * r + 128.553 * g + 24.966 * b + 16.0d;
		double Cr = -37.7745 * r - 74.1592 * g + 111.9337 * b + 128.0d;
		double Cb = 111.9581 * r -93.7509 * g -18.2072 * b + 128.0d;
		return new int[]{(int)y, (int)Cr, (int)Cb};
	}
一个简单的基于RGB颜色空间的皮肤算法如下:

(R, G, B) is classified as skin if

R > 95 and G > 40 and B > 20and max{R, G, B} – min{R, G, B} > 15 and |R-G| > 15

and R > G and R > B

实现代码如下:

	public boolean isSkin(int tr, int tg, int tb) {
		int max = Math.max(tr, Math.max(tg, tb));
		int min = Math.min(tr, Math.min(tg, tb));
		int rg = Math.abs(tr - tg);
		if(tr > 95 && tg > 40 && tb > 20 && rg > 15 && 
				(max - min) > 15 && tr > tg && tr > tb) {
			return true;
		} else {
			return false;
		}
	}

一个简单的基于HSV颜色空间的皮肤算法如下:

(H, S, V) will be classified as skin if

H > 0 and H < 50 and S > 0.23 andS < 0.68

实现代码如下:

	public boolean isSkin(int tr, int tg, int tb) {
		float[] HSV = ColorUtil.rgbToHSV(tr, tg, tb);
		if((HSV[0] > 0.0f && HSV[0] < 50.0f ) && (HSV[1] > 0.23f && HSV[1] < 0.68f)){
			return true;
		} else {
			return false;
		}
	}

一个简单的基于YCbCr颜色空间的皮肤算法如下:

(Y, Cb, Cr) will be classified as skin if:

Y > 80 and 85<Cb < 135 and 135 <Cr < 180, and (Y,Cb,Cr)= [0,255]

对于的Java代码如下:

	public boolean isSkin(int tr, int tg, int tb) {
		int y = (int)(tr * 0.299 + tg * 0.587 + tb * 0.114);
		int Cr = tr - y;
		int Cb = tb - y;
		if(y> 80 && y < 255 && Cr > 133 && Cr < 173 && 77 < Cb && Cb < 127) {
			return true;
		}
		return false;
	}
基于上述三个算法实现的皮肤检测的效果如下:


皮肤检测滤镜的源代码如下:

package com.process.blur.study;

import java.awt.Color;
import java.awt.image.BufferedImage;

import com.gloomyfish.skin.dection.DefaultSkinDetection;
import com.gloomyfish.skin.dection.FastSkinDetection;
import com.gloomyfish.skin.dection.GaussianSkinDetection;
import com.gloomyfish.skin.dection.HSVSkinDetection;
import com.gloomyfish.skin.dection.ISkinDetection;

public class SkinFilter extends AbstractBufferedImageOp {
	private ISkinDetection skinDetector;
	
	public SkinFilter(int type) {
		if(type == 2) {
			skinDetector = new FastSkinDetection();
		} else if(type == 4) {
			skinDetector = new HSVSkinDetection();
		} else if(type == 8) {
			skinDetector = new GaussianSkinDetection();
		} else {
			skinDetector = new DefaultSkinDetection();
		}
	}

	@Override
	public BufferedImage filter(BufferedImage src, BufferedImage dst) {
		int width = src.getWidth();
        int height = src.getHeight();

        if ( dst == null )
            dst = createCompatibleDestImage( src, null );

        int[] inPixels = new int[width*height];
        int[] outPixels = new int[width*height];
        getRGB( src, 0, 0, width, height, inPixels );
        if(skinDetector instanceof GaussianSkinDetection) {
        	((GaussianSkinDetection)skinDetector).setDispSample(getDispersion(src));
        }
        int index = 0;
        for(int row=0; row<height; row++) {
        	int ta = 0, tr = 0, tg = 0, tb = 0;
        	for(int col=0; col<width; col++) {
        		index = row * width + col;
        		ta = (inPixels[index] >> 24) & 0xff;
                tr = (inPixels[index] >> 16) & 0xff;
                tg = (inPixels[index] >> 8) & 0xff;
                tb = inPixels[index] & 0xff;
                if(skinDetector.isSkin(tr, tg, tb)) {
                	outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
                } else {
                	tr = tg = tb = 0;
                	outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
                }               
        	}
        }
        setRGB( dst, 0, 0, width, height, outPixels );
        return dst;
	}
	
	public Color getDispersion(BufferedImage image) {
        // calculate means of pixel  
        int index = 0;
        int height = image.getHeight();
        int width = image.getWidth();
        int[] inPixels = new int[width*height];
        getRGB(image, 0, 0, width, height, inPixels );
        double redSum = 0, greenSum = 0, blueSum = 0;
        Color meanColor = getMean(image);
        double redmeans = meanColor.getRed();
        double greenmeans = meanColor.getGreen();
        double bluemeans = meanColor.getBlue();
        double total = height * width;  
        for(int row=0; row<height; row++) {  
            int ta = 0, tr = 0, tg = 0, tb = 0;  
            for(int col=0; col<width; col++) {  
                index = row * width + col;  
                ta = (inPixels[index] >> 24) & 0xff;  
                tr = (inPixels[index] >> 16) & 0xff;  
                tg = (inPixels[index] >> 8) & 0xff;  
                tb = inPixels[index] & 0xff; 
                double rd = (tr - redmeans);
                double gd = (tg - greenmeans);
                double bd = (tb - bluemeans);
                redSum += rd * rd;  
                greenSum += gd * gd;  
                blueSum += bd * bd;  
            }  
        }
        int reddiff = (int)Math.sqrt((redSum / total));
        int greendiff = (int)Math.sqrt((greenSum / total));
        int bluediff = (int)Math.sqrt(blueSum / total);
        System.out.println(" red dispersion value = " + reddiff);
        System.out.println(" green dispersion value = " + greendiff);
        System.out.println(" blue dispersion value = " + bluediff);
		return new Color(reddiff, greendiff, bluediff);
	}
	
	public Color getMean(BufferedImage image) {
        // calculate means of pixel  
        int index = 0;
        int height = image.getHeight();
        int width = image.getWidth();
        int[] inPixels = new int[width*height];
        getRGB(image, 0, 0, width, height, inPixels );
        double redSum = 0, greenSum = 0, blueSum = 0;  
        double total = height * width;  
        for(int row=0; row<height; row++) {  
            int ta = 0, tr = 0, tg = 0, tb = 0;  
            for(int col=0; col<width; col++) {  
                index = row * width + col;  
                ta = (inPixels[index] >> 24) & 0xff;  
                tr = (inPixels[index] >> 16) & 0xff;  
                tg = (inPixels[index] >> 8) & 0xff;  
                tb = inPixels[index] & 0xff;  
                redSum += tr;  
                greenSum += tg;  
                blueSum +=tb;  
            }  
        }
        int redmeans = (int)(redSum / total);
        int greenmeans = (int)(greenSum / total);
        int bluemeans = (int)(blueSum / total);
        System.out.println(" red average value = " + redmeans);
        System.out.println(" green average value = " + greenmeans);
        System.out.println(" blue average value = " + bluemeans);
		return new Color(redmeans, greenmeans, bluemeans);
	}
}

讨论:

皮肤检测中的后续处理非常重要,可以除去噪声,平滑图像,是皮肤检测的结果

更加的准确,输出的更容易接受。


参考引用:

《A New Fast Skin Color Detection Technique》 -Tarek M. Mahmoud

《Improved Automatic Skin Detection in ColorImages》 -Filipe Tomaz

and Tiago Candeias and Hamid Shahbazkia

《Skin Detection using HSV color space》- unknown author

分享到:
评论

相关推荐

    皮肤检测数据集-Face_Dataset

    已标注的基于像素的皮肤检测数据集,图片收集自网络名人图,包括32张单人原图和46张多人原图,以及各自对应的皮肤标注掩膜黑白图,即掩膜标签图中白色(255或1)为皮肤、黑色(0)为非皮肤,原图包括不同肤色、不同...

    基于机器学习的简单皮肤检测算法

    简单皮肤检测 简单的机器学习皮肤检测算法。 简介 skin-detect.py中的skin_detect函数将图片中的肤色像素保留,其余像素涂黑。 input_path,output_path 输入图像输出图像的路径。 threshold 越大,则判定的标准越...

    基于超像素分割的IPPG活体皮肤检测

    针对现有活体皮肤检测方法精度不高、实时性较差的问题,提出一种基于超像素分割的成像式光电容积描记(IPPG)活体皮肤检测(SPASD)算法。利用零参数简单线性迭代聚类算法将图像分割为多个超像素子块;然后通过IPPG技术...

    bolton:用于数字图像中人体皮肤检测的Java库

    博尔顿 一个用Java编写的独立皮肤检测和分割程序。 它的预期功能是接受数字图像,识别代表人类皮肤的所有像素,并从图片中删除所有其他内容,以仅显示人类皮肤的方式创建新图像(将来可能会添加相反的选项)。 该...

    检测图片裸照的类文件

    Bakr Alsharif开发的可以帮助开发者基于皮肤像素点来检测图片裸照的类文件

    基于RGB的皮肤分割:基于RGB的皮肤分割-matlab开发

    肤色是最重要的面部特征,因其颜色成分而独一无二。 使用归一化颜色直方图可以轻松检测肤色像素,该直方图将来会针对亮度划分时强度的任何变化进行归一化

    3D游戏卷2:动画与高级实时渲染技术——1

     本书从实践的角度出发,详细介绍3D游戏开发的高级技术,并具体描述了一个游戏引擎的构建过程。全书着重讨论三个主题:游戏开发的一般过程;实时渲染过程;角色动画。所有主题均围绕一个具体的游戏开发系统Fly3D ...

    基于改进的GLHS空间的肤色模型用于面部检测

    人脸检测是计算机视觉中最有用的研究主题之一。 在过去的几十年中,面部检测取得了令人瞩目的成功成就。 但是,获得低计算复杂度和高检测... 实验结果表明,该模型可以在各种光照条件和背景下,以高精度检测皮肤像素。

    基于JAVA的RGB,YCbCr模型的肤色检测和灰度共生矩阵的纹理特征提取

    有助于掌握了解JAVA读、写图像的基本方法。掌握图像数据的读取方法。 掌握简单的肤色检测方法。掌握简单的图像像素统计方法。 了解利用灰度共生矩阵法进行图像纹理分析的基本原理。

    3D游戏卷2:动画与高级实时渲染技术——2

     本书从实践的角度出发,详细介绍3D游戏开发的高级技术,并具体描述了一个游戏引擎的构建过程。全书着重讨论三个主题:游戏开发的一般过程;实时渲染过程;角色动画。所有主题均围绕一个具体的游戏开发系统Fly3D ...

    SkinDetector:基于分类检测图像中的肤色-matlab开发

    - 之后我们插入一个图像,对于图像的每个像素,分类器决定它是皮肤还是非皮肤像素。 - 处理后的图像显示在屏幕上。 - 结果强烈依赖于整个过程占用空间的训练集和颜色模型。 - 用户可以在他的实验中使用不同的色彩...

    E度网络论坛 v7.2++ 无错版

    基于DV7.0SP2美化,装了10款网上流行的皮肤和25个流行插件,大部分插件经过本站修改,美化,解决已知BUG,动网完美插件、美化、提速版皮肤:保留原动网论坛整套皮肤,增加了许多套流行皮肤。美化列表:页面跳转效果...

    中值滤波代码matlab-Simple-Hand-Shape-Recognition:在简单的环境中识别手盖形状

    为了检测皮肤,我假设使用大小为5的中值滤波器将图像中的噪声降低5。为了提取皮肤区域,使用等式(1)和(2)将每个像素的通道映射到新空间。 然后,将等式(3)中所示的阈值用于分离皮肤/手部区域并对图像进行二值...

    家庭安全监控的实时异常检测与分类算法 (2003年)

    同时具有好的实时性和稳健性是基于视频的安全监控系统异常检测算法的难点问题 。在家庭安全监控系统中同时利用像素的亮度分量和色度分量检测变化像素,解决摄像镜头由于大尺寸对象闯入引起的图像背景变化造成运动对象...

    使用PHP实现阻止用户上传成人照片或者裸照

     我在phpclasses.org上面偶然发现一个很有用的,由Bakr Alsharif开发的可以帮助开发者基于皮肤像素点来检测图片裸照的类文件.  它会分析在一张图片的不同部分使用的颜色,并决定其是否匹配人类皮肤颜色的色调.  ...

    E度网络论坛 v7.2 修正版

    基于DV7.0SP2美化,装了10款网上流行的皮肤和25个流行插件,大部分插件经过本站修改,美化,解决已知BUG 皮肤: 保留原动网论坛整套皮肤,增加了许多套流行皮肤。 美化列表: 页面跳转效果显示 ...

Global site tag (gtag.js) - Google Analytics