行人检查中突然感觉可以尝试下Eigenface的方法。
意识参考了:
http://www.pages.drexel.edu/~sis26/Eigenface%20Tutorial.htm
研究了下Eigen的方法。
其实Eigen就是把一组相同的图片加起来求平均,作为一个模板
然后保留起来。之后对输入的图片与这个模板求差值
然后看这个产值也可说是距离的远近来判断输入的face是不是
训练数据的的某个face
担任具体的算法中不会这么简单,具体中需要对图像进行锐化,之后用训练中的图片与mean相减
然后依据一定规则计算出一个权重,然后用这个权重去表示一个模板。
具体代码如下:
clc;
clear;
close all;
load('Tlist1.mat');
N = 10;
S = [];
um = 100;
ustd = 80;
[c d] = size(Tlist(10).image);
count = 1;
for j = 1:1:d
image = Tlist(10).image{j};
if isempty(image)==0
temp = image(:,:,1);
temp = imresize(temp,[380,150]);
img{count} = temp;
count = count + 1;
end
end
count = 1;
figure(1);
for i = 1:1:50
image = img{i};
subplot(ceil(sqrt(50)),ceil(sqrt(50)),i);
imshow(image);
drawnow;
[irow icol] = size(image);
temp = reshape(image', irow*icol, 1);
S = [S temp];
end
for i = 1:size(S,2)
temp = double(S(:,i));
m = mean(temp);
st = std(temp);
S(:,i) = (temp-m)*ustd/st+um;
end
figure(2)
for i = 1:50
img = reshape(S(:,i), icol, irow);
img = img';
subplot(ceil(sqrt(50)),ceil(sqrt(50)),i);
imshow(img);
drawnow;
end
m = mean(S,2);
tmimg = uint8(m);
img = reshape(tmimg, icol, irow);
img = img';
figure(3);
imshow(img);
dbx = [];
for i = 1:1:50
temp = double(S(:,i));
dbx = [dbx temp];
end
A = dbx';
L = A*A';
[vv dd] = eig(L);
v = [];
d = [];
for i = 1:size(vv,2);
if dd(i,i)>1e-4
v=[v,vv(:,i)];
d = [d,dd(i,i)];
end
end
[B index] = sort(d);
ind = zeros(size(index));
dtemp = zeros(size(index));
vtemp = zeros(size(v));
len = length(index);
for i = 1:len
dtemp(i) = B(len+1-i);
ind(i) = len+1-index(i);
vtemp(:,ind(i)) = v(:,i);
end
d = dtemp;
v = vtemp;
for i = 1:size(v,2)
kk = v(:,i);
temp = sqrt(sum(kk.^2));
v(:,i) = v(:,i)./temp;
end
u = [];
for i =1:size(v,2)
temp = sqrt(d(i));
u = [u (dbx*v(:,i))./temp];
end
for i = 1:size(u,2)
kk=u(:,i);
temp = sqrt(sum(kk.^2));
u(:,i) = u(:,i)./temp;
end
figure(4);
for i = 1:size(u,2)
img = reshape(u(:,i),icol,irow);
img = img';
img = histeq(img,255);
subplot(ceil(sqrt(50)),ceil(sqrt(50)),i);
imshow(img);
drawnow;
end
omega = [];
for h = 1:size(dbx,2)
WW=[];
for i = 1:size(u,2)
t = u(:,i)';
WeightOfImage = dot(t,dbx(:,h)');
WW=[WW; WeightOfImage];
end
omega=[omega WW];
end
%for i = 1:22
inputimage = Tlist(i).image{300};
%if isempty(inputimage)==0
% continue;
%end
inputimage = imresize(inputimage,[380,150]);
inputimage = inputimage(:,:,1);
figure(5)
subplot(1,2,1);
imshow(inputimage);
colormap('gray');
title('inputimage','fontsize',18);
inimage = reshape(double(inputimage)', irow*icol,1);
temp = inimage;
me = mean(temp);
st = std(temp);
temp = (temp-me)*ustd/st+um;
normimage = temp;
difference = temp-m;
p = [];
aa=size(u,2);
for i = 1:aa
pare = dot(normimage, u(:,i));
p = [p; pare];
end
reshapedimage = m+u(:,1:aa)*p;
reshapedimage = reshape(reshapedimage, icol, irow);
reshapedimage = reshapedimage';
subplot(1,2,2);
imagesc(reshapedimage);
colormap('gray');
title('reconstructed image','fontsize',18);
inimweight = [];
for i = 1:size(u,2)
t = u(:,i)';
weightofinputimage = dot(t,difference');
inimweight = [inimweight; weightofinputimage];
end
ll=1:50;
figure(6);
subplot(1,2,1);
stem(ll,inimweight);
title('weight fo input face','fontsize',14);
e = [];
for i = 1:size(omega,2);
q = omega(:,i);
diffweight = inimweight-q;
mag = norm(diffweight);
e = [e mag];
end
kk=1:size(e,2);
subplot(1,2,2);
stem(kk,e);
title('eucledian distance of input image','fontsize',14);
maximumvalue = max(e);
minimumvalue = min(e)
end