皮肤检测算法三种,示例与代码
来源:互联网 发布:linux日常维护脚本 编辑:程序博客网 时间:2024/05/17 22:37
http://blog.csdn.net/onezeros/article/details/6342567点击打开链接
第一种:RGB color space
第二种:RG color space
第三种:Ycrcb之cr分量+otsu阈值化
还有别的一些模型,效果不太好就不贴了
1.rgb model
- // skin region location using rgb limitation
- void SkinRGB(IplImage* rgb,IplImage* _dst)
- {
- assert(rgb->nChannels==3&& _dst->nChannels==3);
- static const int R=2;
- static const int G=1;
- static const int B=0;
- IplImage* dst=cvCreateImage(cvGetSize(_dst),8,3);
- cvZero(dst);
- for (int h=0;h<rgb->height;h++) {
- unsigned char* prgb=(unsigned char*)rgb->imageData+h*rgb->widthStep;
- unsigned char* pdst=(unsigned char*)dst->imageData+h*dst->widthStep;
- for (int w=0;w<rgb->width;w++) {
- if ((prgb[R]>95 && prgb[G]>40 && prgb[B]>20 &&
- prgb[R]-prgb[B]>15 && prgb[R]-prgb[G]>15/*&&
- !(prgb[R]>170&&prgb[G]>170&&prgb[B]>170)*/)||//uniform illumination
- (prgb[R]>200 && prgb[G]>210 && prgb[B]>170 &&
- abs(prgb[R]-prgb[B])<=15 && prgb[R]>prgb[B]&& prgb[G]>prgb[B])//lateral illumination
- ) {
- memcpy(pdst,prgb,3);
- }
- prgb+=3;
- pdst+=3;
- }
- }
- cvCopyImage(dst,_dst);
- cvReleaseImage(&dst);
- }
2.rg model
- // skin detection in rg space
- void cvSkinRG(IplImage* rgb,IplImage* gray)
- {
- assert(rgb->nChannels==3&&gray->nChannels==1);
- const int R=2;
- const int G=1;
- const int B=0;
- double Aup=-1.8423;
- double Bup=1.5294;
- double Cup=0.0422;
- double Adown=-0.7279;
- double Bdown=0.6066;
- double Cdown=0.1766;
- for (int h=0;h<rgb->height;h++) {
- unsigned char* pGray=(unsigned char*)gray->imageData+h*gray->widthStep;
- unsigned char* pRGB=(unsigned char* )rgb->imageData+h*rgb->widthStep;
- for (int w=0;w<rgb->width;w++) {
- int s=pRGB[R]+pRGB[G]+pRGB[B];
- double r=(double)pRGB[R]/s;
- double g=(double)pRGB[G]/s;
- double Gup=Aup*r*r+Bup*r+Cup;
- double Gdown=Adown*r*r+Bdown*r+Cdown;
- double Wr=(r-0.33)*(r-0.33)+(g-0.33)*(g-0.33);
- if (g<Gup && g>Gdown && Wr>0.004){
- *pGray=255;
- }else{
- *pGray=0;
- }
- pGray++;
- pRGB+=3;
- }
- }
- }
3.cr+otsu
- // implementation of otsu algorithm
- // author: onezeros#yahoo.cn
- // reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB
- void cvThresholdOtsu(IplImage* src, IplImage* dst)
- {
- int height=src->height;
- int width=src->width;
- //histogram
- float histogram[256]={0};
- for(int i=0;i<height;i++) {
- unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;
- for(int j=0;j<width;j++) {
- histogram[*p++]++;
- }
- }
- //normalize histogram
- int size=height*width;
- for(int i=0;i<256;i++) {
- histogram[i]=histogram[i]/size;
- }
- //average pixel value
- float avgValue=0;
- for(int i=0;i<256;i++) {
- avgValue+=i*histogram[i];
- }
- int threshold;
- float maxVariance=0;
- float w=0,u=0;
- for(int i=0;i<256;i++) {
- w+=histogram[i];
- u+=i*histogram[i];
- float t=avgValue*w-u;
- float variance=t*t/(w*(1-w));
- if(variance>maxVariance) {
- maxVariance=variance;
- threshold=i;
- }
- }
- cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);
- }
- void cvSkinOtsu(IplImage* src, IplImage* dst)
- {
- assert(dst->nChannels==1&& src->nChannels==3);
- IplImage* ycrcb=cvCreateImage(cvGetSize(src),8,3);
- IplImage* cr=cvCreateImage(cvGetSize(src),8,1);
- cvCvtColor(src,ycrcb,CV_BGR2YCrCb);
- cvSplit(ycrcb,0,cr,0,0);
- cvThresholdOtsu(cr,cr);
- cvCopyImage(cr,dst);
- cvReleaseImage(&cr);
- cvReleaseImage(&ycrcb);
- }
原图像
rgb model
rg model
otsu+cr
- 皮肤检测算法三种,示例与代码
- 皮肤检测算法三种,示例与代码
- 皮肤检测算法三种,示例与代码
- 皮肤检测算法三种
- 图像皮肤检测算法
- 一个简单有趣的皮肤检测代码
- Opencv之简单皮肤检测代码
- 肤色检测代码示例
- 皮肤检测
- 【数据结构与算法】字典代码示例
- 常用加密与解密算法示例代码
- 五种基于RGB色彩空间统计的皮肤检测算法
- 五种基于RGB色彩空间统计的皮肤检测算法
- 五种基于RGB色彩空间统计的皮肤检测算法
- 冒泡排序算法分析与三种代码实现
- 肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法
- 肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法
- 皮肤检测与克服光线影响的连通域寻找
- 赋值运算符
- C指针原理(11)
- 进程UID : 父进程(UID/setUID) / 加载文件的SUID
- libxml2主要函数说明
- Windows下使用标准Shell接口遍历文件和文件夹(1)
- 皮肤检测算法三种,示例与代码
- C指针原理(12)
- Android TextView分享
- Duplicate entry导致mysql主从复制中断的事故
- C语言程序设计教程(第三版)课后习题11.8 链表合并及操作
- java多线程,将oracle中数据导入到sql到文件(包括大字段转换成字符串)
- PROTO 之函数的使用
- Cmd模式下的入侵技术大全
- error