五种基于RGB色彩空间统计的皮肤检测算法-阿里云开发者社区

开发者社区> 毛毛虫的爹> 正文

五种基于RGB色彩空间统计的皮肤检测算法

简介: <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">最近一直在研究多脸谱识别以及如何分辨多个皮肤区域是否是人脸的问题<br></p> <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 1
+关注继续查看

最近一直在研究多脸谱识别以及如何分辨多个皮肤区域是否是人脸的问题

网上找了很多资料,看了很多篇文章,将其中基于RGB色彩空间识别皮肤

的统计算法做了一下总结,统计识别方法主要是简单相比与很多其它基于

机器学习的算法,本人总结了五种RGB色彩空间的统计算法源码如下:

Skin Filter1:

[java] view plaincopy
  1. public class SkinFilter1 extends AbstractBufferedImageOp {  
  2.   
  3.     @Override  
  4.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  5.         int width = src.getWidth();  
  6.         int height = src.getHeight();  
  7.   
  8.         if ( dest == null )  
  9.             dest = createCompatibleDestImage( src, null );  
  10.   
  11.         int[] inPixels = new int[width*height];  
  12.         int[] outPixels = new int[width*height];  
  13.         getRGB( src, 00, width, height, inPixels );  
  14.         int index = 0;  
  15.         for(int row=0; row<height; row++) {  
  16.             int ta = 0, tr = 0, tg = 0, tb = 0;  
  17.             for(int col=0; col<width; col++) {  
  18.                 index = row * width + col;  
  19.                 ta = (inPixels[index] >> 24) & 0xff;  
  20.                 tr = (inPixels[index] >> 16) & 0xff;  
  21.                 tg = (inPixels[index] >> 8) & 0xff;  
  22.                 tb = inPixels[index] & 0xff;  
  23.                   
  24.                 // detect skin method...  
  25.                 double sum = tr + tg + tb;  
  26.                 if (((double)tr/(double)tb > 1.185) &&   
  27.                     ((double)(tr*tb)/(double)(sum*sum)>0.107) &&  
  28.                     ((double)(tr*tg)/(double)(sum*sum)>0.112))  
  29.                 {  
  30.                     tr = tg = tb = 0// black - skin detected!!  
  31.                 } else {  
  32.                     tr = tg = tb = 255// white color means non-skin pixel  
  33.                 }  
  34.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
  35.             }  
  36.         }  
  37.         setRGB( dest, 00, width, height, outPixels );  
  38.         return dest;  
  39.     }  
  40. }  
Skin Filter2:

[java] view plaincopy
  1. public class SkinFilter2 extends AbstractBufferedImageOp {  
  2.   
  3.     @Override  
  4.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  5.         int width = src.getWidth();  
  6.         int height = src.getHeight();  
  7.   
  8.         if ( dest == null )  
  9.             dest = createCompatibleDestImage( src, null );  
  10.   
  11.         int[] inPixels = new int[width*height];  
  12.         int[] outPixels = new int[width*height];  
  13.         getRGB( src, 00, width, height, inPixels );  
  14.         int index = 0;  
  15.         for(int row=0; row<height; row++) {  
  16.             int ta = 0, tr = 0, tg = 0, tb = 0;  
  17.             for(int col=0; col<width; col++) {  
  18.                 index = row * width + col;  
  19.                 ta = (inPixels[index] >> 24) & 0xff;  
  20.                 tr = (inPixels[index] >> 16) & 0xff;  
  21.                 tg = (inPixels[index] >> 8) & 0xff;  
  22.                 tb = inPixels[index] & 0xff;  
  23.                 double sum = tr + tg + tb;  
  24.                   
  25.                   
  26.                 if(((double)3*tb*tr*tr/(double)(sum*sum*sum)>0.1276)&&  
  27.                     ((double)(tr*tb+tg*tg)/(double)(tg*tb)>2.14)&&  
  28.                     ((double)(sum)/(double)(3*tr)+(double)(tr-tg)/(double)(sum)<2.7775))  
  29.                 {  
  30.                     tr = tg = tb = 0;  
  31.                 } else {  
  32.                     tr = tg = tb = 255;  
  33.                 }  
  34.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
  35.             }  
  36.         }  
  37.         setRGB( dest, 00, width, height, outPixels );  
  38.         return dest;  
  39.     }  
  40. }  
Skin Filter3:

[java] view plaincopy
  1. public class SkinFilter3 extends AbstractBufferedImageOp {  
  2.   
  3.     @Override  
  4.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  5.         int width = src.getWidth();  
  6.         int height = src.getHeight();  
  7.   
  8.         if ( dest == null )  
  9.             dest = createCompatibleDestImage( src, null );  
  10.   
  11.         int[] inPixels = new int[width*height];  
  12.         int[] outPixels = new int[width*height];  
  13.         getRGB( src, 00, width, height, inPixels );  
  14.         int index = 0;  
  15.         for(int row=0; row<height; row++) {  
  16.             int ta = 0, tr = 0, tg = 0, tb = 0;  
  17.             for(int col=0; col<width; col++) {  
  18.                 index = row * width + col;  
  19.                 ta = (inPixels[index] >> 24) & 0xff;  
  20.                 tr = (inPixels[index] >> 16) & 0xff;  
  21.                 tg = (inPixels[index] >> 8) & 0xff;  
  22.                 tb = inPixels[index] & 0xff;  
  23.                   
  24.                 // detect skin method...  
  25.                 double sum = tr + tg + tb;  
  26.                 if (((double)tg / (double)tg - (double)tr / (double)tb <= -0.0905) &&  
  27.                     ((double)(sum) / (double)(3 * tr) + (double)(tr - tg) / (double)(sum) <= 0.9498))  
  28.                 {  
  29.                     tr = tg = tb = 0;  
  30.                 } else {  
  31.                     tr = tg = tb = 255;  
  32.                 }  
  33.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
  34.             }  
  35.         }  
  36.         setRGB( dest, 00, width, height, outPixels );  
  37.         return dest;  
  38.     }  
  39. }  
Skin Filter4:

[java] view plaincopy
  1. import java.awt.image.BufferedImage;  
  2. /** 
  3.  * this skin detection is absolutely good skin classification, 
  4.  * i love this one very much 
  5.  *  
  6.  * this one should be always primary skin detection  
  7.  * from all five filters 
  8.  *  
  9.  * @author zhigang 
  10.  * 
  11.  */  
  12. public class SkinFilter4 extends AbstractBufferedImageOp {  
  13.   
  14.     @Override  
  15.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  16.         int width = src.getWidth();  
  17.         int height = src.getHeight();  
  18.   
  19.         if ( dest == null )  
  20.             dest = createCompatibleDestImage( src, null );  
  21.   
  22.         int[] inPixels = new int[width*height];  
  23.         int[] outPixels = new int[width*height];  
  24.         getRGB( src, 00, width, height, inPixels );  
  25.         int index = 0;  
  26.         for(int row=0; row<height; row++) {  
  27.             int ta = 0, tr = 0, tg = 0, tb = 0;  
  28.             for(int col=0; col<width; col++) {  
  29.                 index = row * width + col;  
  30.                 ta = (inPixels[index] >> 24) & 0xff;  
  31.                 tr = (inPixels[index] >> 16) & 0xff;  
  32.                 tg = (inPixels[index] >> 8) & 0xff;  
  33.                 tb = inPixels[index] & 0xff;  
  34.                   
  35.                 // detect skin method...  
  36.                 double sum = tr + tg + tb;  
  37.                 if (((double)tb/(double)tg<1.249) &&  
  38.                     ((double)sum/(double)(3*tr)>0.696) &&  
  39.                     (0.3333-(double)tb/(double)sum>0.014) &&  
  40.                     ((double)tg/(double)(3*sum)<0.108))  
  41.                 {  
  42.                     tr = tg = tb = 0;  
  43.                 } else {  
  44.                     tr = tg = tb = 255;  
  45.                 }  
  46.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
  47.             }  
  48.         }  
  49.         setRGB(dest, 00, width, height, outPixels);  
  50.         return dest;  
  51.     }  
  52. }  
Skin Filter5:

[java] view plaincopy
  1. import java.awt.image.BufferedImage;  
  2. /** 
  3.  * this is very good skin detection 
  4.  * get real skin segmentation correctly.... 
  5.  * ohh... cool 
  6.  *  
  7.  * @author zhigang 
  8.  * 
  9.  */  
  10. public class SkinFilter5 extends AbstractBufferedImageOp {  
  11.   
  12.     @Override  
  13.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  14.         int width = src.getWidth();  
  15.         int height = src.getHeight();  
  16.   
  17.         if ( dest == null )  
  18.             dest = createCompatibleDestImage( src, null );  
  19.   
  20.         int[] inPixels = new int[width*height];  
  21.         int[] outPixels = new int[width*height];  
  22.         getRGB( src, 00, width, height, inPixels );  
  23.         int index = 0;  
  24.         for(int row=0; row<height; row++) {  
  25.             int ta = 0, tr = 0, tg = 0, tb = 0;  
  26.             for(int col=0; col<width; col++) {  
  27.                 index = row * width + col;  
  28.                 ta = (inPixels[index] >> 24) & 0xff;  
  29.                 tr = (inPixels[index] >> 16) & 0xff;  
  30.                 tg = (inPixels[index] >> 8) & 0xff;  
  31.                 tb = inPixels[index] & 0xff;  
  32.                   
  33.                 // detect skin method...  
  34.                 double sum = tr + tg + tb;  
  35.                 if (((double)tg/(double)tb - (double)tr/(double)tg<=-0.0905)&&  
  36.                 ((double)(tg*sum)/(double)(tb*(tr-tg))>3.4857)&&  
  37.                 ((double)(sum*sum*sum)/(double)(3*tg*tr*tr)<=7.397)&&  
  38.                 ((double)sum/(double)(9*tr)-0.333 > -0.0976))  
  39.                 {  
  40.                     tr = tg = tb = 0;  
  41.                 } else {  
  42.                     tr = tg = tb = 255;  
  43.                 }  
  44.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
  45.             }  
  46.         }  
  47.         setRGB( dest, 00, width, height, outPixels );  
  48.         return dest;  
  49.     }  
  50. }  
总结一下:

似乎Filter3的效果与Filter1的效果不是很好,Filter5, Filter4的效果感觉

还是很好的,基本上可以符合实际要求。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练&测试过程全记录(二)
DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练&测试过程全记录
29 0
PostgreSQL 谁堵塞了谁(锁等待检测)- pg_blocking_pids, pg_safe_snapshot_blocking_pids
PostgreSQL 谁堵塞了谁(锁等待检测)- pg_blocking_pids, pg_safe_snapshot_blocking_pids
1080 0
CV:基于keras利用cv2自带两步检测法对《跑男第六季第五期》之如花片段(或调用摄像头)进行实时性别&脸部表情检测
CV:基于keras利用cv2自带两步检测法对《跑男第六季第五期》之如花片段(或调用摄像头)进行实时性别&脸部表情检测
49 0
冰与火之歌:「时间」与「空间」复杂度 | 算法必看系列三十六
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间; 反之,求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。
2254 0
《网络空间欺骗:构筑欺骗防御的科学基石》一1.3 恶意策略、技术和常识
本文讲的是网络空间欺骗:构筑欺骗防御的科学基石一1.3 恶意策略、技术和常识,本节书摘来华章计算机《网络空间欺骗:构筑欺骗防御的科学基石》一书中的第1章,第1.3节, Cyber Deception: Building the Scientific Foundation 苏西尔·贾乔迪亚(Sushil Jajodia)V. S.苏夫拉曼尼(V. S. Subrahmanian)[美] 维平·斯沃尔(Vipin Swarup) 著 克利夫·王(Cliff Wang) 马多贺 雷程 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1347 0
你的食物变质没?用AI算法来检测一下吧
本文使用AI算法检测披萨是否变质,为食品检测提供一个新的思路。
1561 0
ML之SSIM:基于输入图片RGB的三维向量利用SSIM(结构相似性度量)算法进行判别
ML之SSIM:基于输入图片RGB的三维向量利用SSIM(结构相似性度量)算法进行判别
23 0
+关注
毛毛虫的爹
好好学习,天天向上
625
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载