皮肤检测算法三种,示例与代码

简介:

今天是地球日,就选了张相关主题的图像做测试

 

第一种:RGB color space

第二种:RG color space

第三种:Ycrcb之cr分量+otsu阈值化

 

还有别的一些模型,效果不太好就不贴了

 

1.rgb model

[cpp]  view plain copy
  1. // skin region location using rgb limitation  
  2. void SkinRGB(IplImage* rgb,IplImage* _dst)  
  3. {  
  4.     assert(rgb->nChannels==3&& _dst->nChannels==3);  
  5.   
  6.     static const int R=2;  
  7.     static const int G=1;  
  8.     static const int B=0;  
  9.   
  10.     IplImage* dst=cvCreateImage(cvGetSize(_dst),8,3);  
  11.     cvZero(dst);  
  12.   
  13.     for (int h=0;h<rgb->height;h++) {  
  14.         unsigned char* prgb=(unsigned char*)rgb->imageData+h*rgb->widthStep;  
  15.         unsigned char* pdst=(unsigned char*)dst->imageData+h*dst->widthStep;  
  16.         for (int w=0;w<rgb->width;w++) {  
  17.             if ((prgb[R]>95 && prgb[G]>40 && prgb[B]>20 &&  
  18.                 prgb[R]-prgb[B]>15 && prgb[R]-prgb[G]>15/*&& 
  19.                 !(prgb[R]>170&&prgb[G]>170&&prgb[B]>170)*/)||//uniform illumination   
  20.                 (prgb[R]>200 && prgb[G]>210 && prgb[B]>170 &&  
  21.                 abs(prgb[R]-prgb[B])<=15 && prgb[R]>prgb[B]&& prgb[G]>prgb[B])//lateral illumination  
  22.                 ) {  
  23.                     memcpy(pdst,prgb,3);  
  24.             }             
  25.             prgb+=3;  
  26.             pdst+=3;  
  27.         }  
  28.     }  
  29.     cvCopyImage(dst,_dst);  
  30.     cvReleaseImage(&dst);  
  31. }  

 

2.rg model

[cpp]  view plain copy
  1. // skin detection in rg space  
  2. void cvSkinRG(IplImage* rgb,IplImage* gray)  
  3. {  
  4.     assert(rgb->nChannels==3&&gray->nChannels==1);  
  5.       
  6.     const int R=2;  
  7.     const int G=1;  
  8.     const int B=0;  
  9.   
  10.     double Aup=-1.8423;  
  11.     double Bup=1.5294;  
  12.     double Cup=0.0422;  
  13.     double Adown=-0.7279;  
  14.     double Bdown=0.6066;  
  15.     double Cdown=0.1766;  
  16.     for (int h=0;h<rgb->height;h++) {  
  17.         unsigned char* pGray=(unsigned char*)gray->imageData+h*gray->widthStep;  
  18.         unsigned char* pRGB=(unsigned char* )rgb->imageData+h*rgb->widthStep;  
  19.         for (int w=0;w<rgb->width;w++) {  
  20.             int s=pRGB[R]+pRGB[G]+pRGB[B];  
  21.             double r=(double)pRGB[R]/s;  
  22.             double g=(double)pRGB[G]/s;  
  23.             double Gup=Aup*r*r+Bup*r+Cup;  
  24.             double Gdown=Adown*r*r+Bdown*r+Cdown;  
  25.             double Wr=(r-0.33)*(r-0.33)+(g-0.33)*(g-0.33);  
  26.             if (g<Gup && g>Gdown && Wr>0.004){  
  27.                 *pGray=255;  
  28.             }else{   
  29.                 *pGray=0;  
  30.             }  
  31.             pGray++;  
  32.             pRGB+=3;  
  33.         }  
  34.     }  
  35.   
  36. }  

 

3.cr+otsu

[c-sharp]  view plain copy
  1. // implementation of otsu algorithm  
  2. // author: onezeros#yahoo.cn  
  3. // reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB  
  4. void cvThresholdOtsu(IplImage* src, IplImage* dst)  
  5. {  
  6.     int height=src->height;  
  7.     int width=src->width;  
  8.   
  9.     //histogram  
  10.     float histogram[256]={0};  
  11.     for(int i=0;i<height;i++) {  
  12.         unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;  
  13.         for(int j=0;j<width;j++) {  
  14.             histogram[*p++]++;  
  15.         }  
  16.     }  
  17.     //normalize histogram  
  18.     int size=height*width;  
  19.     for(int i=0;i<256;i++) {  
  20.         histogram[i]=histogram[i]/size;  
  21.     }  
  22.   
  23.     //average pixel value  
  24.     float avgValue=0;  
  25.     for(int i=0;i<256;i++) {  
  26.         avgValue+=i*histogram[i];  
  27.     }  
  28.   
  29.     int threshold;    
  30.     float maxVariance=0;  
  31.     float w=0,u=0;  
  32.     for(int i=0;i<256;i++) {  
  33.         w+=histogram[i];  
  34.         u+=i*histogram[i];  
  35.   
  36.         float t=avgValue*w-u;  
  37.         float variance=t*t/(w*(1-w));  
  38.         if(variance>maxVariance) {  
  39.             maxVariance=variance;  
  40.             threshold=i;  
  41.         }  
  42.     }  
  43.   
  44.     cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);  
  45. }  
  46.   
  47. void cvSkinOtsu(IplImage* src, IplImage* dst)  
  48. {  
  49.     assert(dst->nChannels==1&& src->nChannels==3);  
  50.   
  51.     IplImage* ycrcb=cvCreateImage(cvGetSize(src),8,3);  
  52.     IplImage* cr=cvCreateImage(cvGetSize(src),8,1);  
  53.     cvCvtColor(src,ycrcb,CV_BGR2YCrCb);  
  54.     cvSplit(ycrcb,0,cr,0,0);  
  55.   
  56.     cvThresholdOtsu(cr,cr);  
  57.     cvCopyImage(cr,dst);  
  58.     cvReleaseImage(&cr);  
  59.     cvReleaseImage(&ycrcb);  
  60. }  

 

原图像

 

rgb model

 

rg model

 

otsu+cr



皮肤检测算法三种,示例与代码

相关文章
|
30天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
187 65
|
9天前
|
机器学习/深度学习 存储 算法
经典算法代码
这段代码展示了多个经典算法,包括:穷举法解决“百钱买百鸡”问题;递推法计算“猴子吃桃”问题;迭代法求解斐波那契数列及折纸高度超越珠峰的问题。同时,还提供了希尔排序算法实现及披萨票务订购系统和汉诺塔问题的链表存储解决方案。每部分通过具体案例解释了算法的应用场景与实现方法。
17 3
|
1月前
|
机器学习/深度学习 监控 算法
目标检测算法技术
8月更文挑战第11天
|
1月前
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
43 2
|
1月前
|
搜索推荐 算法 Java
|
1月前
|
机器学习/深度学习 监控 算法
目标检测算法
8月更文挑战第5天
|
1月前
|
机器学习/深度学习 监控 算法
目标检测算法
8月更文挑战第8天
|
1月前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
87 2
|
20天前
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)
|
27天前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
17 0