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

简介:

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

 

第一种: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



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

相关文章
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
10天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
22天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
25 3
|
21天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
1月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
263 65
|
19天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA-PSO-SVM算法的混沌背景下微弱信号检测matlab仿真
本项目基于MATLAB 2022a,展示了SVM、PSO、GA-PSO-SVM在混沌背景下微弱信号检测中的性能对比。核心程序包含详细中文注释和操作步骤视频。GA-PSO-SVM算法通过遗传算法和粒子群优化算法优化SVM参数,提高信号检测的准确性和鲁棒性,尤其适用于低信噪比环境。
|
1月前
|
算法 安全
分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真
本课题通过Simulink建模与仿真,实现OVP-UVP、OFP-UFP算法及AFD检测算法的反孤岛检测。OVP-UVP基于电压幅值变化,OFP-UFP基于频率变化,而AFD则通过注入频率偏移信号来检测孤岛效应,确保电力系统安全稳定运行。系统使用MATLAB 2013b进行建模与仿真验证。
|
25天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
31 0
下一篇
无影云桌面