面部和手势提取

来源:互联网 发布:spark 邮箱 windows 编辑:程序博客网 时间:2024/04/17 00:36
clc,clear,close all;f=imread('hhh.jpg');%rgb转换为yCbCry=rgb2ycbcr(f);%提取CrCr=y(:,:,3);figure,imshow(Cr);%肤色范围140-160 肤色范围赋值为255(白色) 其他赋值为0(黑色)Cr(Cr>140&Cr<160)=255;Cr(Cr~=255)=0;figure,imshow(Cr);Cr=im2bw(Cr);% bwareaopen(BW,P)% 删除二值图像BW中面积小于P的对象并返回修改后的二值图Cr=bwareaopen(Cr,200);%填充二值图中的坑洞并返回修改后的二值图Cr=imfill(Cr,'holes');figure,imshow(Cr);[h,w]=size(Cr);a=1;b=1;hs=sum(Cr);figure,plot(hs);%循环条件 小于图片宽度while(a<w)%寻找临界条件 垂直投影的列的值大于0while(hs(a)==0&&a<w)    a=a+1;end;b=a;while(hs(b)>0)    b=b+1;end;%排除最后一次循环a=b输出的一条线if(a<b)C1=Cr(:,a:b);%[hss,wss]=find(C1)返回矩阵C1中非零元素的行和列的索引值。[hss,wss]=find(C1);c=min(hss);d=max(hss);%f(c:d,a:b,)二维图 从上到下,从左到右C1=C1(c:d,:);figure,imshow(C1);C2=cat(3,C1,C1,C1);%result=f(c:d,a:b,:)三维图 从上到下,从左到右result=f(c:d,a:b,:);%同类型才能执行运算 类型强转C2=uint8(C2).*result;figure,imshow(result);figure,imshow(C2);end;a=b;end;

执行y=rgb2ycbcr(f);Cr=y(:,:,3);显示的结果

这里写图片描述
转换为二值图并把肤色转换为白色 其他变为黑色
这里写图片描述
去除小面积的白圈Cr=bwareaopen(Cr,200);
这里写图片描述
填充脸部的坑洞Cr=imfill(Cr,’holes’);
这里写图片描述
显示垂直投影直方图hs=sum(Cr);figure,plot(hs);
这里写图片描述
经过while循环提取面部和手势
这里写图片描述

原创粉丝点击