www.gusucode.com > 关于海航matlab和lingo的训练题 > 失败的人眼检测.m

    %-------------------------------------------------------------------------
clear all
x=imread('z1.jpg');  %读取原始图像
figure(1);subplot(1,4,1);imshow(x);title('原图像1');
y=rgb2gray(x);
subplot(1,4,2);imshow(y);title('图像1的灰度图');           % 图1灰度图
u1=imnoise(y,'salt & pepper',0.07);
subplot(1,4,3);imshow(u1);title('图像1加噪声图');     %给图1加椒盐噪声
zz=medfilt2(u1,[3 3]);z=medfilt2(zz,[5 5]);%(2次中值滤波)
subplot(1,4,4);imshow(z);title('图像1中值滤波');  %图1中值滤波(3*3窗口)
% figure(6);subplot(1,2,1);imshow(zz);title('一次滤波');
% subplot(1,2,2);imshow(z);title('二次滤波');
x1=imread('z1.jpg');
figure(2);subplot(1,4,1);imshow(x1);title('原图像2');
y1=rgb2gray(x1);
subplot(1,4,2);imshow(y1);title('图像2灰度图');            %图2灰度图
u2=imnoise(y1,'salt & pepper',0.13);
subplot(1,4,3);imshow(u2);title('图像2叫噪声图');    %图2加椒盐噪声
zz1=medfilt2(u2,[3 3]);z1=medfilt2(zz1,[5 5]);%(2次中值滤波)
subplot(1,4,4);imshow(z1);title('图像2滤波图');  %图2中值滤波
% figure(5);subplot(1,2,1);imshow(zz1),title('一次滤波');
% subplot(1,2,2);imshow(z1);title('二次滤波');
% figure(3);subplot(1,2,1);imshow(z);title('处理后图1');
% figure(3);subplot(1,2,2);imshow(z1);title('处理后图2');
f=imsubtract(z1,z);                                               %图1图2差分
figure(4);subplot(1,1,1);imshow(f);title('差分后图像');
% agin=medfilt2(f,[3 3]);figure(10);imshow(agin);f=agin;   %差分图中值滤波
%-------------------------------------------------------------------------




%-------------------------------------------------------------------------
%眼睛的粗定位
%标注一只眼睛
[h w]=size(f);
Amax=0;m=0;n=0;
for i=10:h
      for j=10:w
            if Amax<=f(i,j)
               Amax=f(i,j);m=i;n=j;
            end
      end
end
%标另外一只眼睛
Bmax=0;m1=0;n1=0;
for i1=10:m-10
    for j1=10:w-10
        if Bmax<=f(i1,j1)
           Bmax=f(i1,j1);m1=i1;n1=j1;
           end
    end
end
for i2=m+10:h-10
    for j2=10:w-10
        if Bmax<=f(i2,j2)
           Bmax=f(i2,j2);m1=i2;n1=j2;
           end
    end
end
%判断两眼的参数是否符合要求
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++






%----------------------------------------------------------------------

figure(7);imshow(z);hold on;plot(n,m,'+',n1,m1,'+');title('标定眼睛图');
%给眼睛画上矩形框
figure(8);imshow(z),title('眼睛粗定位');hold on;
Bvertex=[n-25 m-15;n+25 m+15];    %矩形的左上顶点坐标和右下顶点坐标
    plot([Bvertex(1,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(1,2)],'r')
    plot([Bvertex(2,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(2,2)],'r')
    plot([Bvertex(2,1),Bvertex(1,1)],[Bvertex(2,2),Bvertex(2,2)],'r')
    plot([Bvertex(1,1),Bvertex(1,1)],[Bvertex(1,2),Bvertex(2,2)],'r');
hold on;
Bvertex=[n1-25 m1-15;n1+25 m1+15];    %矩形的左上顶点坐标和右下顶点坐标
    plot([Bvertex(1,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(1,2)],'r')
    plot([Bvertex(2,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(2,2)],'r')
    plot([Bvertex(2,1),Bvertex(1,1)],[Bvertex(2,2),Bvertex(2,2)],'r')
    plot([Bvertex(1,1),Bvertex(1,1)],[Bvertex(1,2),Bvertex(2,2)],'r');
%----------------------------------------------------------------------





%------------------------------------------------------------------------
%最大类间方差定二值化阈值
[height,width]=size(z);
hist=zeros(256,1);%直方图
%threshold=128; %初始阈值
%计算直方图
for i=1:height
    for j=1:width
        m=z(i,j)+1;   %zz(i,j)灰度值从0-255
        hist(m)=hist(m)+1;%某级灰度的像素数
    end
end
hist=hist/(height*width);%落在每一灰度级上的概率
avg=0;
for m=1:256
    avg=avg+(m-1)*hist(m);
end
temp=0;
for i=1:256
    p1=0;
    avg1=0;
    avg2=0;
    T_current=i-1;%当前分割阈值
    for m=1:T_current-1
        p1=hist(m)+ p1;%低灰度级概率总和
    end
    p2=1-p1;%高灰度级概率总和
    for m=1:256
        if m<T_current
           avg1=avg1+(m-1)*hist(m);
        else
           avg2=avg2+(m-1)*hist(m);
        end
    end
    avg1=avg1/p1;
    avg2=avg2/p2;
    
    D=p1*(avg1-avg)^2+p2*(avg2-avg)^2;
    if D>=temp
        finalT=T_current;
        temp=D;
    end
end


% 滤波后差分图二值化
f1=z;
for i=1:h
for j=1:w
    if f1(i,j)<=finalT
       f1(i,j)=0;
    else
       f1(i,j)=255;
    end
  end
end
figure(13);imshow(f1);title('差分后图二值化');
%------------------------------------------------------------------------






%------------------------------------------------------------------------
%提取眼睛轮廓
%精确定位眼睛矩形,最高点、最低点、最左边、左右边四点确定的矩形。
%一只眼轮廓
[h1,w1]=size(f1);
zg=0;zd=0;zzb=0;zyb=0;
%i3=0;j3=0;
xj=50;yj=30;%垂直和水平方向中心点矩形大小一半
x3=zeros(1,100);y3=zeros(1,60);
x4=zeros(1,100);y4=zeros(1,60);
x5=zeros(1,100);y5=zeros(1,60);
x6=zeros(1,100);y6=zeros(1,60);
zgx=0;zdx=0;zzbx=0;zybx=0;
zgy=0;zdy=0;zzby=0;zyby=0;

%最高的点y
for i3=n-50:n+50
    for j3=m-30:m+30
        if f1(i3,j3)==255&f1(i3,j3+1)==0 
           x3(i3-n+51)=i3;y3(j3-m+31)=j3;
        end
    end
end

for k=1:1:100
    if zgy<y3
       zgy=y3;
    end
end

%最低点y
for j3=m-30:m+30
    for i3=n-50:n+50
        if f1(i3,j3)==255&f1(i3,j3-1)==0 
           x4(i3-n+51)=i3;y4(j3-m+31)=j3;
        end
    end
end

for k=1:1:100
    if zdy<y4
       zdy=y4-1;
    end
end

%最左点x
for j3=m-30:m+30
    for i3=n+50:1:n-50
        if f1(i3,j3)==255&f1(i3+1,j3)==0 
           x5(i3-n+51)=i3;y5(j3-m+31)=j3;
        end
    end
end

for k=1:1:100
    if zzbx<x5
       zzbx=x5+1;
    end
end

%最右点x
for j3=m-30:m+30
    for i3=n+50:1:n-50
        if f1(i3,j3)==255&f1(i3-1,j3)==0 
           x6(i3-n+51)=i3;y6(j3-m+31)=j3;
        end
    end
end

for k=1:1:100
    if zybx<x6
       zybx=x6-1;
    end
end

%精确画出眼睛矩形区域
figure(9);imshow(f1),title('眼睛轮廓');hold on;
Bvertex=[215 163;241 175];    %矩形的左上顶点坐标和右下顶点坐标
    plot([Bvertex(1,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(1,2)],'r')
    plot([Bvertex(2,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(2,2)],'r')
    plot([Bvertex(2,1),Bvertex(1,1)],[Bvertex(2,2),Bvertex(2,2)],'r')
    plot([Bvertex(1,1),Bvertex(1,1)],[Bvertex(1,2),Bvertex(2,2)],'r');
%---------------------------------------------------------------------------

%另一只眼轮廓
hold on;
Bvertex=[139 154;170 167];    %矩形的左上顶点坐标和右下顶点坐标
    plot([Bvertex(1,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(1,2)],'r')
    plot([Bvertex(2,1),Bvertex(2,1)],[Bvertex(1,2),Bvertex(2,2)],'r')
    plot([Bvertex(2,1),Bvertex(1,1)],[Bvertex(2,2),Bvertex(2,2)],'r')
    plot([Bvertex(1,1),Bvertex(1,1)],[Bvertex(1,2),Bvertex(2,2)],'r');
%---------------------------------------------------------------------------