图像处理——椭圆肤色模型

来源:互联网 发布:国家电网刷题软件 编辑:程序博客网 时间:2024/04/26 17:18

以前整理的文档,现在贴出来吧,方便后期需要时查看参考。

图像处理——椭圆肤色模型
这里参数的说明参考《基于分裂式K均值聚类的肤色检测方法 》 http://download.csdn.net/detail/wobuaishangdiao/4378026
《皮肤检测技术的研究及改进》

皮肤检测—-肤色椭圆模型
肤色区域的颜色与亮度成非线性函数关系,在低亮度条件下,YCbCr 空间中色度的聚类性会随Y 呈非线性变换降低。为了使肤色聚类不受亮度Y 的影响并将YCbCr 颜色空间中的色度Cb、Cr进行非线性变换,在研究YCbCr 颜色空间的肤色聚类情况的基础上,去掉高光阴影部分(即 Y 的最大最小值),YCbCr 空间色度非线性变换过程中,用 Cb·· Y 、 Cr·· Y 表示肤色区域的中轴线,肤色区域的宽度分别用 Vcb、Vcr 表示。
即将图像转化到YCbCr 空间并且在CbCr平面进行投影,因此我们采集了肤色的样本点,将其投影到此平面,并且投影后,我们进行了相应的非线性变换K-L变换进而形成的的统计椭圆模型

这里写图片描述

这里写图片描述

    void cvSkinSegment(IplImage* img, IplImage* mask)   //原始图像及目标图像       {          CvSize imageSize = cvSize(img->width, img->height);            IplImage *imgY = cvCreateImage(imageSize, IPL_DEPTH_8U, 1);          IplImage *imgCr = cvCreateImage(imageSize, IPL_DEPTH_8U, 1);          IplImage *imgCb = cvCreateImage(imageSize, IPL_DEPTH_8U, 1);          IplImage *imgYCrCb = cvCreateImage(imageSize, img->depth, img->nChannels);          cvCvtColor(img,imgYCrCb,CV_BGR2YCrCb);          cvSplit(imgYCrCb, imgY, imgCr, imgCb, 0);   //得到每一通道的数据           int y, cr, cb, l, x1, y1, value;          unsigned char *pY, *pCr, *pCb, *pMask;          pY = (unsigned char *)imgY->imageData;  //Y通道的第一行数据的指针           pCr = (unsigned char *)imgCr->imageData;          pCb = (unsigned char *)imgCb->imageData;          pMask = (unsigned char *)mask->imageData;   //目标图像的第一行数据的指针           cvSetZero(mask);   //目标图像全部为零           l = img->height * img->width;   //图像的元素个数           for (int i = 0; i < l; i++)          {              y  = *pY;              cr = *pCr;              cb = *pCb;              cb -= 109;              cr -= 152;              x1 = (819*cr-614*cb)/32 + 51;              y1 = (819*cr+614*cb)/32 + 77;              x1 = x1*41/1024;              y1 = y1*73/1024;              value = x1*x1+y1*y1;    //构造椭圆的模型               if(y<100)    (*pMask)=(value<700) ? 255:0;    //对齐进行值得选择,要不255,要不0  //在不同的亮度下呈现出不同的亮度               else        (*pMask)=(value<850)? 255:0;    //255 is the skin, 0 is the background   //255 纯白色 0 纯黑色               pY++;              pCr++;              pCb++;              pMask++;          }      //cvSaveImage("example.jpg",mask);           //cvErode(mask, mask, NULL, 1);            //cvDilate(mask, mask, NULL, 1);            //cvSmooth(mask, mask, CV_GAUSSIAN, 21, 0, 0);            //cvThreshold(mask, mask,130, 255, CV_THRESH_BINARY);            cvReleaseImage(&imgY);          cvReleaseImage(&imgCr);          cvReleaseImage(&imgCb);          cvReleaseImage(&imgYCrCb);      }  
阅读全文
0 0
原创粉丝点击