📄 facialoutline-detect.m
字号:
clear; %清空工作区变量
Image=imread('zjt.JPG'); %读取图像文件
imshow(Image);
Iycbcr=rgb2ycbcr(Image); %颜色空间转换
[m,n,k]=size(Image);
for i=1:1:m %根据CbCr的阈值生成二值图像
for j=1:1:n
if(Iycbcr(i,j,2)<125&&Iycbcr(i,j,2)>90&&Iycbcr(i,j,3)<170&&Iycbcr(i,j,3)>133)
Ibw(i,j)=255;
else
Ibw(i,j)=0;
end
end
end
figure,imshow(Ibw);
SE = strel('square',3);
Ibwopen=imopen(Ibw,SE); %开运算(即先腐蚀再膨胀),消除杂散点
%figure,imshow(Ibwopen);
Ibwoc=imclose(Ibwopen,SE); %闭运算,去掉由于开运算引入的许多缺口
%figure,imshow(Ibwoc);
imf=imfill(Ibwoc,'holes'); %填充孔洞
%figure,imshow(imf);
Iedged=edge(imf,'Roberts'); %边缘检测
%figure,imshow(Iedged);
[Ilabeled regionnum]=bwlabel(Iedged,8); %连通区域标记
%regloc是一个二维数组,第1维:region编号,第2维:1234分别代表top、left、right、bottom值
for i=1:1:regionnum
regloc(i,1)=n;
regloc(i,2)=m;
regloc(i,3)=0;
regloc(i,4)=0;
end
%通过对图像的象素级搜索得出各个连通区域的regloc值,为画框作准备
for i=1:1:m
for j=1:1:n
if(Ilabeled(i,j)~=0)
num=Ilabeled(i,j);
if(i<regloc(num,1))
regloc(num,1)=i;
end
if(j<regloc(num,2))
regloc(num,2)=j;
end
if(j>regloc(num,3))
regloc(num,3)=j;
end
if(i>regloc(num,4))
regloc(num,4)=i;
end
end
end
end
hold on;
for num=1:1:regionnum
if(regloc(num,4)>(regloc(num,1)+(regloc(num,3)-regloc(num,2))*1.2)) %人脸长宽比限制
regloc(num,4)=regloc(num,1)+(regloc(num,3)-regloc(num,2))*1.2;
end
x=[regloc(num,2);regloc(num,2);regloc(num,3);regloc(num,3);regloc(num,2)];
y=[regloc(num,1);regloc(num,4);regloc(num,4);regloc(num,1);regloc(num,1)];
plot(x,y); %画框
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -