思想:
1,利用肤色识别,首先转换为YCbCr类型。
YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。
ycbcr(:,:,3);这个就是代表取出肤色的意思。
cr(cr>146&cr<160)=255:在区间:144-160里面的就使其变成255,白色,其余的就变成黑色:
cr(cr~=255)=0:等同于,cr不等于255的就让其变成0,黑色。
得到:
然后就容易研究啦,变成二值图。
再根据需要找到的人脸与干扰项(长腿)的特征区别进行排查就OK啦。
查看有坑洞的图片,以及填充过后的图片:
代码:
bwao=bwareaopen(bwfill,1600);
figure,imshow(bwao);
利用数学进行筛选:
bs=bwboundaries(bwao);
bwboundaries是一个函数,可以用来获取二值图中对象的轮廓,包括外部轮廓与内部边缘。
rectangle(),程序语言,功能是画一个矩形。
rectangle('position',[min(x),min(y),w,h'], 'edgecolor','r'):
position:位置的意思
后面四个,一次是。最小X坐标,最小Y坐标,w:向右方向扩展长度。h:向上方向扩展长度
edgecolor:边缘颜色
r:代表红色
代码:
clear,clc,close all;
f=imread('girls.jpg');
imshow(f);
ycbcr=rgb2ycbcr(f);
cr=ycbcr(:,:,3);
cr(cr>146&cr<160)=255;
cr(cr~=255)=0;
figure,imshow(cr);
bw=im2bw(cr);
figure,imshow(bw);
bwfill=imfill(bw,'holes');
figure,imshow(bwfill);
bwao=bwareaopen(bwfill,1600);
figure,imshow(bwao);
bs=bwboundaries(bwao);
figure,imshow(f);
for i=1:size(bs,1)
boders=bs{i};
x=boders(:,2);
y=boders(:,1);
w=max(x)-min(x);
h=max(y)-min(y);
hold on;
if(h/w>1&&h/w<2)
rectangle('position',[min(x),min(y),w,h'], 'edgecolor','r');
end
end
结果: