1.色彩空间转换

function [r,g]=rgb_RGB(Ori_Face)

R=Ori_Face(:,:,1);

G=Ori_Face(:,:,2);

B=Ori_Face(:,:,3);

R1=im2double(R); % 将uint8型转换成double型

G1=im2double(G);

B1=im2double(B);

row=size(Ori_Face,1); % 行像素

column=size(Ori_Face,2); % 列像素

for i=1:row

for j=1:column

rr(i,j)=R1(i,j)/RGB(i,j);

gg(i,j)=G1(i,j)/RGB(i,j);

end

end

rrr=mean(rr);

r=mean(rrr);

ggg=mean(gg);

g=mean(ggg);

2.均值和协方差

t1=imread('D:\matlab\皮肤库\1.jpg');[r1,g1]=rgb_RGB(t1);

t2=imread('D:\matlab\皮肤库\2.jpg');[r2,g2]=rgb_RGB(t2);

t3=imread('D:\matlab\皮肤库\3.jpg');[r3,g3]=rgb_RGB(t3);

t4=imread('D:\matlab\皮肤库\4.jpg');[r4,g4]=rgb_RGB(t4);

t5=imread('D:\matlab\皮肤库\5.jpg');[r5,g5]=rgb_RGB(t5);

t6=imread('D:\matlab\皮肤库\6.jpg');[r6,g6]=rgb_RGB(t6);

t7=imread('D:\matlab\皮肤库\7.jpg');[r7,g7]=rgb_RGB(t7);

t8=imread('D:\matlab\皮肤库\8.jpg');[r8,g8]=rgb_RGB(t8);

t9=imread('D:\matlab\皮肤库\9.jpg');[r9,g9]=rgb_RGB(t9);

t10=imread('D:\matlab\皮肤库\10.jpg');[r10,g10]=rgb_RGB(t10);

t11=imread('D:\matlab\皮肤库\11.jpg');[r11,g11]=rgb_RGB(t11);

t12=imread('D:\matlab\皮肤库\12.jpg');[r12,g12]=rgb_RGB(t12);

t13=imread('D:\matlab\皮肤库\13.jpg');[r13,g13]=rgb_RGB(t13);

t14=imread('D:\matlab\皮肤库\14.jpg');[r14,g14]=rgb_RGB(t14);

t15=imread('D:\matlab\皮肤库\15.jpg');[r15,g15]=rgb_RGB(t15);

t16=imread('D:\matlab\皮肤库\16.jpg');[r16,g16]=rgb_RGB(t16);

t17=imread('D:\matlab\皮肤库\17.jpg');[r17,g17]=rgb_RGB(t17);

t18=imread('D:\matlab\皮肤库\18.jpg');[r18,g18]=rgb_RGB(t18);

t19=imread('D:\matlab\皮肤库\19.jpg');[r19,g19]=rgb_RGB(t19);

t20=imread('D:\matlab\皮肤库\20.jpg');[r20,g20]=rgb_RGB(t20);

t21=imread('D:\matlab\皮肤库\21.jpg');[r21,g21]=rgb_RGB(t21);

t22=imread('D:\matlab\皮肤库\22.jpg');[r22,g22]=rgb_RGB(t22);

t23=imread('D:\matlab\皮肤库\23.jpg');[r23,g23]=rgb_RGB(t23);

t24=imread('D:\matlab\皮肤库\24.jpg');[r24,g24]=rgb_RGB(t24);

t25=imread('D:\matlab\皮肤库\25.jpg');[r25,g25]=rgb_RGB(t25);

t26=imread('D:\matlab\皮肤库\26.jpg');[r26,g26]=rgb_RGB(t26);

t27=imread('D:\matlab\皮肤库\27.jpg');[r27,g27]=rgb_RGB(t27);

r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27);

g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20,g21,g22,g23,g24,g25,g26,g27);

m=mean([r,g])

n=cov([r,g])

3.求质心

function [xmean, ymean] = center(bw)

bw=bwfill(bw,'holes');

area = bwarea(bw);

[m n] =size(bw);

bw=double(bw);

xmean =0; ymean = 0;

for i=1:m,

for j=1:n,

xmean = xmean + j*bw(i,j);

ymean = ymean + i*bw(i,j);

end;

end;

if(area==0)

xmean=0;

ymean=0;

else

xmean = xmean/area;

ymean = ymean/area;

xmean = round(xmean);

ymean =

round(ymean);

end

4. 求偏转角度

function [theta] =

orient(bw,xmean,ymean)

[m n] =size(bw);

bw=double(bw);

a = 0;

b = 0;

c = 0;

for i=1:m,

for j=1:n,

a = a + (j - xmean)^2 * bw(i,j);

b = b + (j - xmean) * (i - ymean) *

bw(i,j);

c = c + (i - ymean)^2 * bw(i,j);

end;

end;

b = 2 * b;

theta = atan(b/(a-c))/2;

theta =

theta*(180/pi); %

从幅度转换到角度

5. 找区域边界

function [left, right, up, down] =

bianjie(A)

[m n] = size(A);

left = -1;

right = -1;

up = -1;

down = -1;

for j=1:n,

for

i=1:m,

if (A(i,j) ~= 0)

left = j;

break;

end;

end;

if (left ~=

-1) break;

end;

end;

for j=n:-1:1,

for i=1:m,

if (A(i,j) ~= 0)

right =

j;

break;

end;

end;

if (right ~= -1) break;

end;

end;

for i=1:m,

for j=1:n,

if

(A(i,j) ~= 0)

up =

i;

break;

end;

end;

if

(up ~= -1)

break;

end;

end;

for i=m:-1:1,

for

j=1:n,

if (A(i,j) ~= 0)

down = i;

break;

end;

end;

if

(down ~= -1)

break;

end;

end;

6. 求起始坐标

function newcoord =

checklimit(coord,maxval)

newcoord = coord;

if (newcoord<1)

newcoord=1;

end;

if (newcoord>maxval)

newcoord=maxval;

end;

7.模板匹配

function [ccorr, mfit, RectCoord] =

mobanpipei(mult, frontalmodel,ly,wx,cx, cy, angle)

frontalmodel=rgb2gray(frontalmodel);

model_rot = imresize(frontalmodel,[ly

wx],'bilinear'); % 调整模板大小

model_rot =

imrotate(model_rot,angle,'bilinear'); % 旋转模板

[l,r,u,d] =

bianjie(model_rot); % 求边界坐标

bwmodel_rot=imcrop(model_rot,[l u (r-l)

(d-u)]); % 选择模板人脸区域

[modx,mody]

=center(bwmodel_rot); % 求质心

[morig, norig] =

size(bwmodel_rot);

% 产生一个覆盖了人脸模板的灰度图像

mfit = zeros(size(mult));

mfitbw = zeros(size(mult));

[limy, limx] = size(mfit);

% 计算原图像中人脸模板的坐标

startx = cx-modx;

starty = cy-mody;

endx = startx + norig-1;

endy = starty + morig-1;

startx = checklimit(startx,limx);

starty = checklimit(starty,limy);

endx = checklimit(endx,limx);

endy = checklimit(endy,limy);

for i=starty:endy,

for j=startx:endx,

mfit(i,j) =

model_rot(i-starty+1,j-startx+1);

end;

end;

ccorr =

corr2(mfit,mult) % 计算相关度

[l,r,u,d] = bianjie(bwmodel_rot);

sx = startx+l;

sy = starty+u;

RectCoord = [sx sy (r-1) (d-u)]; %

产生矩形坐标

8.主程序

clear;

[fname,pname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.gif'},'Please

choose a color

picture...'); % 返回打开的图片名与图片路径名

[u,v]=size(fname);

y=fname(v); % 图片格式代表值

switch y

case

0

errordlg('You Should Load Image File

First...','Warning...');

case{'g';'G';'p';'P';'f';'F'}; % 图片格式若是JPG/jpg、BMP/bmp、TIF/tif或者GIF/gif,才打开

I=cat(2,pname,fname);

Ori_Face=imread(I);

subplot(2,3,1),imshow(Ori_Face);

otherwise

errordlg('You Should Load Image File

First...','Warning...');

end

R=Ori_Face(:,:,1);

G=Ori_Face(:,:,2);

B=Ori_Face(:,:,3);

R1=im2double(R); % 将uint8型转换成double型处理

G1=im2double(G);

B1=im2double(B);

m=[

0.4144,0.3174]; % 均值

n=[0.0031,-0.0004;-0.0004,0.0003]; % 方差

row=size(Ori_Face,1); % 行像素数

column=size(Ori_Face,2); % 列像素数

for i=1:row

for

j=1:column

if RGB(i,j)==0

rr(i,j)=0;gg(i,j)=0;

else

rr(i,j)=R1(i,j)/RGB(i,j); % rgb归一化

gg(i,j)=G1(i,j)/RGB(i,j);

x=[rr(i,j),gg(i,j)];

p(i,j)=exp((-0.5)*(x-m)*inv(n)*(x-m)'); % 皮肤概率服从高斯分布

end

end

end

subplot(2,3,2);imshow(p); % 显示皮肤灰度图像

low_pass=1/9*ones(3);

image_low=filter2(low_pass,

p); % 低通滤波去噪声

subplot(2,3,3);imshow(image_low);

% 自适应阀值程序

previousSkin2 = zeros(i,j);

changelist = [];

for threshold = 0.55:-0.1:0.05

two_value = zeros(i,j);

two_value(find(image_low>threshold)) =

1;

change = sum(sum(two_value -

previousSkin2));

changelist = [changelist change];

previousSkin2 = two_value;

end

[C, I] = min(changelist);

optimalThreshold = (7-I)*0.1

two_value = zeros(i,j);

two_value(find(image_low>optimalThreshold))

= 1; % 二值化

subplot(2,3,4);imshow(two_value); % 显示二值图像

frontalmodel=imread('E:\我的照片\人脸模板.jpg'); % 读入人脸模板照片

FaceCoord=[];

imsourcegray=rgb2gray(Ori_Face); % 将原照片转换为灰度图像

[L,N]=bwlabel(two_value,8); % 标注二值图像中连接的部分,L为数据矩阵,N为颗粒的个数

for i=1:N,

[x,y]=find(bwlabel(two_value)==i); % 寻找矩阵中标号为i的行和列的下标

bwsegment =

bwselect(two_value,y,x,8); % 选择出第i个颗粒

numholes =

1-bweuler(bwsegment,4); % 计算此区域的空洞数

if (numholes >=

1) % 若此区域至少包含一个洞,则将其选出进行下一步运算

RectCoord = -1;

[m n] = size(bwsegment);

[cx,cy]=center(bwsegment); % 求此区域的质心

bwnohole=bwfill(bwsegment,'holes'); %

将洞封住(将灰度值赋为1)

justface = uint8(double(bwnohole) .*

double(imsourcegray));

% 只在原照片的灰度图像中保留该候选区域

angle =

orient(bwsegment,cx,cy); % 求此区域的偏转角度

bw = imrotate(bwsegment, angle,

'bilinear');

bw = bwfill(bw,'holes');

[l,r,u,d] =bianjie(bw);

wx = (r - l

+1); % 宽度

ly = (d - u +

1); % 高度

wratio =

ly/wx % 高宽比

if

((0.8<=wratio)&(wratio<=2))

% 如果目标区域的高度/宽度比例大于0.8且小于2.0,则将其选出进行下一步运算

S=ly*wx; % 计算包含此区域矩形的面积

A=bwarea(bwsegment); % 计算此区域面积

if (A/S>0.35)

[ccorr,mfit, RectCoord] = mobanpipei(justface,frontalmodel,ly,wx,

cx,cy, angle);

end

if (ccorr>=0.6)

mfitbw=(mfit>=1);

invbw = xor(mfitbw,ones(size(mfitbw)));

source_with_hole = uint8(double(invbw) .*

double(imsourcegray));

final_image = uint8(double(source_with_hole) +

double(mfit));

subplot(2,3,5);imshow(final_image); % 显示覆盖了模板脸的灰度图像

imsourcegray = final_image;

subplot(2,3,6);imshow(Ori_Face); % 显示检测效果图

end;

if (RectCoord ~= -1)

FaceCoord = [FaceCoord; RectCoord];

end

end

end

end

% 在认为是人脸的区域画矩形

[numfaces x] = size(FaceCoord);

for

i=1:numfaces,

hd = rectangle('Position',FaceCoord(i,:));

set(hd, 'edgecolor', 'y');

end

人脸检测是人脸识别、人机交互、智能视觉监控等工作的前提。近年来,在模式识别与计算机视觉领域,人脸检测己经成为一个受到普遍重视、研究十分活跃的方向。

本文针对复杂背景下的彩色正面人脸图像,将肤色分割、模板匹配与候选人脸图像块筛选结合起来,构建了人脸检测实验系统,并用自制的人脸图像数据库在该系统下进行了一系列的实验统计。

本文首先介绍了人脸检测技术研究的背景和现状,阐明人脸检测技术发展的重要意义,对目前常用的一些检测算法进行了总结,然后着重阐述了基于肤色分割和模板匹配验证的人脸检测算法。

肤色是人脸重要特征,在通过肤色采样统计和聚类分析后,确立一种在YCbCr空间下的基于高斯模型的肤色分割方法。在YCbCr色彩空间中建立肤色分布的高斯模型,得到肤色概率似然图像,在最佳动态阈值选取算法下完成肤色区域的分割。

采用数学形态学和一些先验知识对所得到的肤色区域进行人脸特征筛选,进一步剔除非人脸肤色区域,减少候选人脸数量,简化后续检测过程的处理。

本文使用平均模板匹配方法对候选人脸进行确认,并针对图像中的人脸通常有一定角度旋转和尺寸大小不确定的问题,通过计算候选人脸图像块的偏转角度和面积,并以此调整模板,优化模板配准,提高模板匹配的准确性,同时避免使用多尺度模板进行多次匹配运算,提高算法效率。提出利用候选人脸图像区域和模板质心作为配准的原点,抑制人脸图像噪声的干扰。

最后构建了基于肤色分割和模板验证的人脸检测试验系统,并对该系统采用自制人脸图像数据库进行测试。实验结果表明,系统算法是有效的,具有较高的检测性能和低的误判率。

江苏大学数字图像处理MATLAB人脸识别,MATLAB人脸识别代码相关推荐

  1. 《数字图像处理》冈萨雷斯,Matlab函数汇总 .

    <数字图像处理>冈萨雷斯,Matlab函数汇总 . 图像显示 colorbar 显示彩条 getimage 由坐标轴得到图像数据 ice(DIPUM) 交互彩色编辑 image 创建和显示 ...

  2. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作 实验要求 知识点 实验内容 1.读入一幅RGB图像,变换为灰度图像和二值图像,并在同 ...

  3. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化 实验要求 知识点 实验内容 1.采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波,窗口分别采用3 ...

  4. 数字图像处理(3) — 基于白平衡的人脸美白算法

    前言 上篇文章介绍了基于VC++的人脸美颜软件的具体原理和编程细节,其中提到了美白效果由于难度和时间关系,借用了另一套图像增强-非锐化掩蔽算法.本篇将着重介绍白平衡人脸美白算法,并给出基于MATLAB ...

  5. java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...

    基于MATLAB的数字图像处理算法研究与仿真开题报告 毕 业 设 计 (2013 届) 题 目基于 MATLAB 的数字图像 处理算法研究与仿真 学 院 物理电气信息学院 专 业 通信工程 年 级 0 ...

  6. 用matlab编写逢七必过游戏规则,数字图像处理及应用(MATLAB)第4章

    <数字图像处理及应用(MATLAB)第4章>由会员分享,可在线阅读,更多相关<数字图像处理及应用(MATLAB)第4章(149页珍藏版)>请在人人文库网上搜索. 1.第四章 图 ...

  7. 图像找茬 matlab,数字图像处理、数学形态学、MATLAB GUI实现简单找茬软件

    0.简介 这个小作品是我的数字图像处理课程设计,应用基本的图像处理知识与MATLAB的基本脚本编程,实现一个简单的找茬软件.软件实现过程中使用到的找茬游戏图片来源有"梦幻找茬".& ...

  8. 数字图像处理技术及实用 MATLAB实验报告及PS作业

    实验二 图像类型 一.实验目的 1.读取任一图像,将其转换成二值图像,设置二值化图像的阈值,分别为level=0.4,level=0.7 .对结果进行分析. 2.选择不同的阈值,观察阈值对图像二值化的 ...

  9. 算法实战应用案例精讲-【图像处理】数字图像处理从原理到应用(python代码实战)

    目录 前言 数字图像处理的基本概念 图像的类型 灰度图像 二值图像 索引图像

  10. 数字图像处理:实验一 MATLAB 图像处理基础

    实验一 MATLAB 图像处理基础 MATLAB 具有强大的图像处理工具箱,有助于人们更好的理解各种图像处理算法,通 过调用工具箱中的函数,可以减少编程的复杂性,简化编程.本次实验主要掌握 MATLA ...

最新文章

  1. 双代号网络图节点编号原则_一表多图(表格/横道图/网络图)让计划编制效率提高10倍...
  2. 云痕大数据考试中途可以退出吗_2020CPA考试出考率,创新低?
  3. 多设备同步表数据_利用Excel数据透视表解决两份报表数据不同步问题
  4. jenkins与SonarQube集成
  5. 五大常用算法之回溯法
  6. xshell链接相当的慢,怎么解决
  7. 判断拐点的条件_拐点的定义
  8. 日志易产品使用系列二:使用日志易 SaaS 版本完成一次 JSON 日志分析
  9. Radius认证协议(六)报文属性
  10. Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
  11. 2020年9月程序员工资最新统计,结果万万没想到
  12. Blender 粒子系统 调整粒子物理大小
  13. SaaS模式和传统软件模式有什么区别?
  14. keil5中输入中文并且美化字体
  15. 洛谷 P1007 独木桥 题解 C语言,C++
  16. learning python in the hard way习题1~5的附加题练习
  17. 5G无线技术基础自学系列 | 双工技术
  18. origin做双Y轴折线图的具体步骤
  19. 计算机收藏夹位于哪个磁盘,电脑浏览器收藏夹保存在哪里
  20. 愤世嫉俗的程序员,总在网上发表言论,当起了“键盘侠”

热门文章

  1. 花了三天三夜才收集整理出来的经典 SQL 数据库笔试题及答案
  2. python 自动控制鼠标移动脚本
  3. PAgP协议与LACP协议
  4. javaweb框架 一些底层实现
  5. 神州数码DCN交换机SNMP配置命令
  6. android x5 浏览器教程,064-腾讯的X5WebView内嵌浏览器引擎的使用
  7. linux 系统调试工具,Linux 系统调试...
  8. FLTK--轻量级C++跨平台GUI库
  9. ce标志cad_欧盟CE认证标志大全(完全版)
  10. 基于微信小程序的课堂考勤系统的设计与实现