彩色人脸图像识别MATLAB编程

彩色人脸图像识别MATLAB编程,第1张

1.识别静态的整个人体较难;即使识别出来结果也不可靠,所以现在主要以手势/人脸识别为主;这是因为此握搜纯手和脸上面有比较独特的特征点。你说的滤波归根结底还是要找出具有灰度跳变的高频部分作为人体;这除非背景中除了人以外没有其他突出的物体;否则光凭滤波二值法检测人体是不太现实。

2 两张图片中人要是产生相对运动,检测起来就容易多了;利用帧间差分找到图像中灰度相差大的部分(森漏庆你用的滤波也是一种手段);然后二值化区域连通;要是图像中没有其他移动物体计算连通区域的变动方向就是人的运动方向。

你可以去PUDN上搜搜相关的目标检测的代码完全和你这个对应是不可能的。照你说的情况可以先建立起静态背景的模型(或者直接在没人的时候拍张);然后不断的与这个背景做差,原理和帧间差分一样。建议你先从典型的帧间差分例程开始下手(比如移动车辆的检测,这个比较多)。

你在二值化之后加上一个区域连通的步骤;即使用膨胀或者闭运算;这样你的轮廓就是连续的了;用matlab的话bwlabel可以统计连通区域里面像素的个数也就是人体面积大小。质心就是横竖坐标的平均值;取所有人体点的横竖坐标分别累加;除以坐标总数得到的x和y平均值;这个就是质心了

这是我写的程序,参照《模式识别》张学工第9章。

a1=imread('a1.jpg')

a2=imread('a2.jpg')

b1=imread('b1.jpg')

b2=imread('b2.jpg')

a1=rgb2gray(a1)

a2=rgb2gray(a2)

b1=rgb2gray(b1)

b2=rgb2gray(b2)

figure,imshow(a1)

figure,imshow(a2)

figure,imshow(b1)

figure,imshow(b2)

a1=double(a1)

a2=double(a2)

b1=double(b1)

b2=double(b2)

a1_lie=a1(:)

a2_lie=a2(:)

b1_lie=b1(:)

b2_lie=b2(:)

c=cat(1,a1_lie',a2_lie',b1_lie',b2_lie')

c_mean=mean(c)

X=[a1_lie-c_mean',a2_lie-c_mean',b1_lie-c_mean',b2_lie-c_mean'巧档竖]

R=X'*X % R是4×4的矩阵

[p,q]=eig(R)

u=diag(q) % u是4×1的列向量

u=flipud(u) % flipud(u)实现矩阵的上下翻转, u是4×1的列向量

v=fliplr(p) % fliplr(p)实现矩阵的左右翻转,v是4×4的矩阵

e=zeros(36000,4)

for m=1:3

e(:,m)=X*v(:,m)./(u(m)^(-0.5)) % 参见《模式识别》P226公式9-18

end

p1=zeros(200,180)

p2=zeros(200,180)

p3=zeros(200,180)

for m=1:36000

p1(m)=e(m)

p2(m)=e(m+36000)

p3(m)=e(m+72000)

end

p1=mat2gray(p1)

p2=mat2gray(p2)

p3=mat2gray(p3)

figure,imshow(p1) % 显示第1特征脸

figure,imshow(p2) % 显示第2特征脸

figure,imshow(p3) % 显示第3特征脸

new=c*e(:,1:3) %分孝大别计算4个训练样本分别在第1、第蠢游2、第3、特征脸上的投影

p1=imread('p_test1.jpg')%读入一个测试样本

p1=rgb2gray(p1)

figure,imshow(p1)

p2=double(p1(:))

test=p2'*e(:,1:3)%计算测试样本在3个特征脸上的投影

error=zeros(4,1)

for m=1:4

error(m)=norm((new(m,:)-test))

end

[distence,index]=sort(error) %将列向量error中的数据按从小到大排列

if index(1)==1

result=1

elseif index(1)==2

result=1

elseif index(1)==3

result=2

elseif index(1)==4

result=2

end

result %result为1时表示测试样本属于第1个人,为2时表示测试样本属于第2个人

哎,看在100分的面子上。。。。

images=[]%([]是什么意思?)

这个只不过是将images初始化为一个空矩阵而已。每度一幅图像,它都将这幅图像reshape成一个列向量,然后存入images中,最终,读了N幅图像,images就有N列,每一列都是一幅图像。

(原算法是有两种方法求特征向量,一种奇异值分解,另一种不用奇异值分解,我这里选用没有用奇异值分解方法,但为什么还是按照奇异值分解了,而且莫名出现一个S的变量,而且这段的公式我不理解)

这个问题是你人脸识别的算法问题,我不想研究。。。。

c=ceil(M/r)%正无穷大方向取整(M/r是什么意思?为什么要这么做)

这个为什么要这么做,是为了后拍配郑面subplot画图来计算到底需要几行几列的。这个对你的程序没有任何本质的影响。这段程序就是为了把所有的人脸图在一幅图上分块显示出来。从subplot(r,c,ii)

这句可以看出,r子图像的是行数,c是列数。那么M就是图像数了。。。

colormap('gray')axis equal tight off%返回线性灰度色图(这段不理解)

这段是一系列画图参数的 *** 袭颂作: colormap('gray')是让你的图是灰度图。axis equal是让横纵坐标单位一致。tight是限制画图的取值范围。off是去掉坐标显示。这些都是控制显示效果的。完全无关紧要。至于具体效果,你可以把这句去掉看看显示效果,然后在加上这句再看看效果有什么变化就知道了。

%对于其他人脸图按前面计卖冲算出的特征向量重构人脸图像(这段是说什么?)

很明显的,这个是用你这次这20个训练样本的结果来重构以前的人脸数据。

基本就是这么回事了。但是人脸特征识别我没研究过,你这个程序的算法非常的简单,至于为什么通过几个特征值分析就好用那我就不知道了,因为我没研究过这个。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12305571.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存