yuv肤色检测 matlab,图像肤色初步检测实现
肤色检测输出结果中有许多瑕疵,待于进一步处理(如:滤波操作.....)。在此贴出几种图像肤色检测相关代码,供大家参考。
第一种:RGB color space// skin region location using rgb limitation
void ImageSkin::ImageSkinRGB(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;hheight;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;wwidth;w++) {
if ((prgb[R]>95 && prgb[G]>40 && prgb[B]>20 &&
prgb[R]-prgb[B]>15 && prgb[R]-prgb[G]>15)||//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])
) {
memcpy(pdst,prgb,3);
}
prgb+=3;
pdst+=3;
}
}
cvCopyImage(dst,_dst);
cvReleaseImage(&dst);
}
第二种:RG color space// skin detection in rg space
void ImageSkin::ImageSkinRG(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;hheight;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;wwidth;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 (gGdown && Wr>0.004)
{
*pGray=255;
}
else
{
*pGray=0;
}
pGray++;
pRGB+=3;
}
}
}
第三种:otsu阈值化// reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB
void ImageSkin::ImageThresholdOtsu(IplImage* src, IplImage* dst)
{
int height=src->height;
int width=src->width;
//histogram
float histogram[256]={0};
for(int i=0;i
unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;
for(int j=0;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);
}
第四种:Ycrcb之cr分量+otsu阈值化void ImageSkin::ImageSkinOtsu(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);
ImageThresholdOtsu(cr,cr);
cvCopyImage(cr,dst);
cvReleaseImage(&cr);
cvReleaseImage(&ycrcb);
}
第五种:YCrCb中133<=Cr<=173 77<=Cb<=127void ImageSkin::ImageSkinYUV(IplImage* src,IplImage* dst)
{
IplImage* ycrcb=cvCreateImage(cvGetSize(src),8,3);
//IplImage* cr=cvCreateImage(cvGetSize(src),8,1);
//IplImage* cb=cvCreateImage(cvGetSize(src),8,1);
cvCvtColor(src,ycrcb,CV_BGR2YCrCb);
//cvSplit(ycrcb,0,cr,cb,0);
static const int Cb=2;
static const int Cr=1;
static const int Y=0;
//IplImage* dst=cvCreateImage(cvGetSize(_dst),8,3);
cvZero(dst);
for (int h=0;hheight;h++) {
unsigned char* pycrcb=(unsigned char*)ycrcb->imageData+h*ycrcb->widthStep;
unsigned char* psrc=(unsigned char*)src->imageData+h*src->widthStep;
unsigned char* pdst=(unsigned char*)dst->imageData+h*dst->widthStep;
for (int w=0;wwidth;w++) {
if (pycrcb[Cr]>=133&&pycrcb[Cr]<=173&&pycrcb[Cb]>=77&&pycrcb[Cb]<=127)
{
memcpy(pdst,psrc,3);
}
pycrcb+=3;
psrc+=3;
pdst+=3;
}
}
//cvCopyImage(dst,_dst);
//cvReleaseImage(&dst);
}
主程序测试IplImage* img= cvLoadImage("test.jpg");
IplImage* dstRGB=cvCreateImage(cvGetSize(img),8,3);
IplImage* dstRG=cvCreateImage(cvGetSize(img),8,1);
IplImage* dst_crotsu=cvCreateImage(cvGetSize(img),8,1);
IplImage* dst_YUV=cvCreateImage(cvGetSize(img),8,3);
cvNamedWindow("Original WIN", CV_WINDOW_AUTOSIZE);
cvShowImage("Original WIN", img);
cvWaitKey(0);
ImageSkin ImgS;
ImgS.ImageSkinRGB(img,dstRGB);
cvNamedWindow("ImageSkin WIN", CV_WINDOW_AUTOSIZE);
cvShowImage("ImageSkin WIN", dstRGB);
cvWaitKey(0);
ImgS.ImageSkinRG(img,dstRG);
cvNamedWindow("ImageSkinRG WIN", CV_WINDOW_AUTOSIZE);
cvShowImage("ImageSkinRG WIN", dstRG);
cvWaitKey(0);
ImgS.ImageSkinOtsu(img,dst_crotsu);
cvNamedWindow("ImageSkinOtsu WIN", CV_WINDOW_AUTOSIZE);
cvShowImage("ImageSkinOtsu WIN", dst_crotsu);
cvWaitKey(0);
ImgS.ImageSkinYUV(img,dst_YUV);
cvNamedWindow("ImageSkinYUV WIN", CV_WINDOW_AUTOSIZE);
cvShowImage("ImageSkinYUV WIN", dst_YUV);
《探讨OpenCV》专栏QQ群:195358461
关于Image Engineering & Computer Vision更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.
原文:http://blog.csdn.net/songzitea/article/details/24836341
yuv肤色检测 matlab,图像肤色初步检测实现相关推荐
- 噪点检测matlab,基于噪点检测的中值滤波图像去噪方法
摘 要: 图像去噪是图像处理中一个非常重要的环节.针对传统中值滤波方法存在的不足,提出一种新的基于噪点检测的自适应中值滤波图像去噪方法.该方法通过自适应地改变滤波窗口的大小,局部检测并判断极值点是否 ...
- hog 行人检测 matlab,hog+svm_行人检测matlab程序
转自: hog+svm_行人检测matlab程序[仅供大家理解用] 关于这个matlab程序,需要说明的是: 1.检测时的运行速度超级慢,以16个像素作为扫描时的步长,从1000*1000的大图里检测 ...
- 高斯肤色概率模型matlab,基于肤色模型与模板匹配的人脸检测研究
摘要:本文提出了一种基于肤色模型与模板匹配的人脸检测方法.基于YCbCr色彩空间的高斯概率模型,对肤色进行相似度计算和二值化分割,采用形态学对二值化后的图像去噪处理,随后又利用人脸先验知识进一步排除非 ...
- MATLAB 图像特征点检测(6个方法)
clc,clear; I = imread('cameraman.tif');%% (1) detect BRISK points = detectBRISKFeatures(I);%输入参数:%'M ...
- matlab皮肤色号检测,彩色图像中的人脸(肤色)检测
彩色图像中的人脸(肤色)检测 选了图像工程的课,老师布置了一个小Project,要求用OpenCV或者Matlab实现人脸肤色检测,具体算法参考文献"Face Detection In Co ...
- Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法
原文:Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法 [函数名称] 肤色检测函数SkinDetectProcess(WriteableBitmap src) [算法说明] ...
- 多人脸检测matlab程序,基于肤色的人脸检测matlab代码
main close all clear all clc % 输入图像名字 img_name = input('请输入图像名字(图像必须为RGB图像,输入0结束):','s'); % 当输入0时结束 ...
- python 人体检测_Python人体肤色检测
Python人体肤色检测 概述 本文中的人体肤色检测功能采用 OpenCV 库实现, OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Andro ...
- matlab实现大气湍流退化模型算法,大气湍流下退化序列图像的目标检测方法
引言 目标检测是计算机视觉的重要应用之一, 是后续目标识别.跟踪.目标分类以及行为分析的前提.远距离成像时通常会受到复杂变化的大气湍流影响, 使得成像结果中存在不规则抖动.偏移和模糊等退化现象[.因此 ...
最新文章
- 我非要捅穿这 Neutron(三)架构分析与代码实现篇(基于 OpenStack Rocky)
- linux共享内存通信方式,linux下进程通信方式--共享内存
- Python程序设计题解【蓝桥杯官网题库】 DAY3-基础练习
- legend2---开发常用语句
- Swift - static和class的使用
- 深入 Adobe Reader 保护模式 —— 第一部分 —— 设计
- mac下antlr4命令使用
- 【Qt串口调试助手】1.4 - 16进制接收/发送
- 程序员平均年薪 70 万、40 岁后收入下滑?尽在 2019 程序员薪资报告
- 小规模纳税人和一般纳税人的区别
- (12) 基于深度时空残差网络ResNet的城市交通流预测
- Unity打开外部文件夹并选择文件
- np.mat()和np.transpose
- 一夜没睡,仍然精力充沛——工作规划-2013.07.23
- 正睿OIday1总结
- Hive distribute 问题
- cloud华为云服务登录(华为云服务平台登录入口)
- linux下C++编程学习
- 微信聊天,对方回复“哦”怎么办?学会这3个技巧,永不尬聊
- DNS服务器轮询的验证
热门文章
- 全国二级计算机c语言试题及答案,全国计算机二级《C语言》预测试题及答案2016...
- iStoreOS 使用 阿里云 ddns + https
- 胶囊网络的理解:动态路由与聚类
- linux 查看公网ip
- java 导出mdb文件_Java生成mdb文件[MS Access文件](转载)
- ios越狱设备在线安装ipa方法
- 快速微课制作方法和技巧
- [新书即将上市] 不懂模板,还敢称PPT高手
- 赶集网如何引流?同城本地引流方法和技巧
- 示波器怎么利用光标测量幅度