该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
clear all;
close all;
clc;
I=imread('img_368.jpg');
I=rgb2gray(I); %灰度变换
figure(1); imshow(I);
J=I;
[m,n]=size(J);
if isa(J,'double')~=1
J=double(J);
end
M=5; %gabor滤波器有5个尺度
X=16; %gabor滤波器窗口大小
Y=16;
gb=getGaborKernels(M,X,Y);
gabor_real=conv2(J,real(gb(:,:,1)),'same'); %返回和J大小相同的卷积
gabor_imag=conv2(J,imag(gb(:,:,1)),'same');
f=sqrt(gabor_real.*gabor_real+gabor_imag.*gabor_imag); %平方根 .*矩阵乘法
f=(f-min(f(:))) / (max(f(:))-min(f(:)));
figure(2); imshow(f);
% 边沿亮点涂黑
f(1:10,:)=0;
f(m-10:end,:)=0;
f(m/2+1:2*m/3,:)=0;
figure(3);
imshow(f);
k=f;
t=k(1:m/2,1:n/2);
max_t=max(t(:)); %返回最大值
k(1:m/2,1:n/2)=k(1:m/2,1:n/2)>0.45*max_t;
t=k(1:m/2,n/2+1:end);
max_t=max(t(:));
k(1:m/2,n/2+1:end)=k(1:m/2,n/2+1:end)>0.45*max_t;
t=k(2*m/3+1:end,:);
max_t=max(t(:));
k(2*m/3+1:end,:)=k(2*m/3+1:end,:)>0.45*max_t;
k(m/2+1:end,:)=0;
figure(4);imshow(k);
se = strel('square',5); %宽度为5的窗口
k = imdilate(k,se); %膨胀
figure(5);
imshow(k);
k(1:15,:)=0;
%% left eye
BW=k(1:m/2,1:n/2); %认为给的图片就是正面人脸
[L,num]=bwlabel(BW); %num中存放联通域的个数
max_area=0;min_r=0;max_r=0;min_c=0;max_c=0;
for p=1:num
[r,c]=find(L==p);
mn_r=min(r);
mx_r=max(r);
mn_c=min(c);
mx_c=max(c);
temp=L(mn_r:mx_r,mn_c:mx_c);
curr_area=sum(temp(:)) / p;
if (curr_area>max_area)
max_area=curr_area;
min_r=mn_r;max_r=mx_r;
min_c=mn_c;max_c=mx_c;
end
end
center_r=round((min_r+max_r)/2);
center_c=round((min_c+max_c)/2);
% add %
fprintf('左眼:[%d,%d]\n',center_r,center_c); %中心点坐标
I(center_r-17:center_r-15,center_c-17:center_c+17)=255; %画框框
I(center_r+15:center_r+17,center_c-17:center_c+17)=255;
I(center_r-17:center_r+17,center_c-17:center_c-15)=255;
I(center_r-17:center_r+17,center_c+15:center_c+17)=255;
%% right eye %%%%
BW=k(1:m/2,n/2+1:n);
[L,num]=bwlabel(BW);
max_area=0;min_r=0;max_r=0;min_c=0;max_c=0;
for p=1:num
[r,c]=find(L==p);
mn_r=min(r);
mx_r=max(r);
mn_c=min(c);
mx_c=max(c);
temp=L(mn_r:mx_r,mn_c:mx_c);
curr_area=sum(temp(:)) / p;
if (curr_area>max_area)
max_area=curr_area;
min_r=mn_r;max_r=mx_r;
min_c=mn_c;max_c=mx_c;
end
end
center_r=round((min_r+max_r)/2);
center_c=round((min_c+max_c)/2);
fprintf('右眼:[%d,%d]\n',center_r,n/2+center_c);
I(center_r-17:center_r-15,n/2+center_c-17:n/2+center_c+17)=255;
I(center_r+15:center_r+17,n/2+center_c-17:n/2+center_c+17)=255;
I(center_r-17:center_r+17,n/2+center_c-17:n/2+center_c-15)=255;
I(center_r-17:center_r+17,n/2+center_c+15:n/2+center_c+17)=255;
figure(6); imshow(I);