📄 rljc.m
字号:
function rljc
x=imread('001.jpg'); % 读入图片
imshow(x) % 显示该图片
r=x(:,:,1); % 色彩补偿开始
g=x(:,:,2);
b=x(:,:,3);
rhe=sum(sum(r));
ghe=sum(sum(g));
bhe=sum(sum(b));
k=r(:);
h=size(k);
z=h(1,1); % 提取照片像素个数
rping=rhe/z;
gping=ghe/z;
bping=bhe/z;
over=(rping+gping+bping)/3;
r1=(over/rping)*r;
g1=(over/gping)*g;
b1=(over/bping)*b;
rgb1(:,:,1)=r1;
rgb1(:,:,2)=g1;
rgb1(:,:,3)=b1;
%figure:imshow(rgb1); % 色彩补偿结束,显示补偿后照片
b=rgb1;
bb=rgb2ycbcr(b); % 将RGB转换成Ycbcr
y=bb(:,:,1);
cb=bb(:,:,2);
cr=bb(:,:,3); % 分别提取Y,cb,cr
cb=double(cb); % 将cb转成双精度
cr=double(cr); % 将cr转成双精度
yp=sum(sum(y))/numel(y); % 计算整个图片的Y的平均值
if((yp>=0)&(yp<110)) % 根据亮度,取适当的平均值和协方差
cbp=116.6864;
crp=141.2746;
xfc=[76.0604,36.2955;36.2955,149.8167];
elseif((yp>=110)&(yp<200))
cbp=109.4173;
crp=149.2660;
xfc=[120.3091,49.0511;49.0511,146.9649];
elseif((yp>=200)&(yp<255))
cbp=122.6045;
crp=132.7378;
xfc=[104.6496,68.8855;69.8856,126.7650];
end
mu1=[cbp,crp]; % 输入均值
sigma2=xfc; % 输入协方差矩阵
xy=[cb(:),cr(:)]; % 产生网格数据
p=mvnpdf(xy,mu1,sigma2); % 做高斯变换
P=reshape(p,size(cb)); % 求取联合概率密度
i=max(max(P)); % 取肤色概率矩阵中的最大值
j=255/i;
P=j*P; % 将最大值设定为255,其他依次分配
d=mat2gray(P); % 将双精度矩阵转换成灰度图
%figure:imshow(d); % 显示灰度图像
level=graythresh(d); % 用大津法设定二值图像的阈值
bw=im2bw(d,level); % 将灰度图转换成二值图
%figure:imshow(bw); % 显示二值图
se=strel('disk',2);
bw1=imopen(bw,se); % 开运算滤波
bw2=imclose(bw1,se); % 闭运算滤波
bw3=bwfill(bw2,'holes'); % 种子区域填充
%figure:imshow(bw); % 显示肤色分割后的图像
bw4=bwperim(bw3); % 轮廓提取
%figure:imshow(bw4);
label=bwlabel(bw3); % 标注图像
area_num=regionprops(label,'Area');
len_area=length(area_num); % 计算出连通域的个数
max_ind=0;
max_num=0;
area_bounding=regionprops(label,'BoundingBox');
t=[];
j=0;
for i=1:len_area
ration=area_num(i).Area;
if(ration>500) % 第一步排除,如果面积小于500,则视为非人脸区域
j=j+1;
t(j)=i;
end
end
len_j=length(t);
max_ind=t(1);
max_num=area_num(t(1)).Area;
for i=1:len_j
if max_num<area_num(t(i)).Area % 取出最大的人脸候选区域
max_num=area_num(t(i)).Area;
max_ind=t(i);
end
end
location=[area_bounding(max_ind).BoundingBox]; %开始画图
rectangle('Position',[location(1),location(2),location(3),location(4)],'Curvature',[0,0],'LineWidth',2,'LineStyle','-')
% 人眼检测部分
x2=imcrop(x,[location(1),location(2),location(3),location(4)]);
figure:imshow(x2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -