MATLAB图像处理之人脸识别五官定位

MATLAB图像处理之人脸识别五官定位

目录

    • MATLAB图像处理之人脸识别五官定位
  • 最大类间方差法
    • 人脸定位

最大类间方差法

最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标两部分,或者说,是寻找一个阈值为K,将图像的颜色分为1,2…K和K+1…256两部分。
如何确定这个阈值K?算法分类的原理是让背景和目标之间的类间方差最大,因为背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,错分的可能性越小。
OTSU,最大类间方差法 。是一种动态二值化方法。其基本思想是:假设一个阈值,将灰度图像的灰度统图分成两部分(前景部分和背景部分,也成为亮区和暗区),在这两类的类间方差最大的时候,得到的阈值是最优的二值化阈值。

性能:类间方差法对噪音十分敏感,在处理之前应对图片进行去噪处理。
处理步骤:
1.对片进行灰度化处理,并且计算其灰度值统计表N(假设图像大小为P×Q);
2.计算前景像素点数(灰度大于假设阈值T)占整个图像的比例,记做W0
N(i)表示统计图第i列的数值;

计算前景像素点的平均灰度值U0

3.同理求出背景的W1和U1(累加的时候从T加到灰度的最大值)

4.求整个图像的平均灰度值:U=W0×U0 + W1×U1

5.从L个灰度级遍历T,使得T为某个值的时候,前景和背景的方差最大, 则 这个 T 值便是我们要求得的阈值。其中,方差的计算公式如下:

G=W0 × (U0 - U) × (U0 - U) + w1 × (U1 - U) × (U1 - U)

此公式计算量较大,可以采用:

G= W0 ×  W1 ×  (U0 - U1) ×  (Uo - U1)

采用遍历的方法得到使类间方差最大的阈值T,即为所求。
上代码,如下图:

%本程序是利用最大类间方差算法求解自适应阈值,对图像进行分割
%按图像的灰度特性,将图像分成背景和目标两部分,或者说,是寻找一个阈值为K,将图像的颜色分为1,2.....K和K+1.....256两部分。
clc,clear;close all
warning off;

I=imread('lena.png');
%rgb转灰度
% if ISRGB(I)==1
    I_gray=rgb2gray(I);
% else
%     I_gray=I;
% end
figure
imshow(I);title('原图')
[m,n,k]=size(I_gray);
figure,subplot(1,2,1)
imshow(I_gray);title('灰度图')
I_double=double(I_gray);%转化为双精度
[wid,len]=size(I_gray);
colorlevel=256;  %灰度级
hist=zeros(colorlevel,1);%直方图
%threshold=128; %初始阈值
%算法分类的原理是让背景和目标之间的类间方差最大,因为背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,错分的可能性越小
%计算直方图
for i=1:wid
    for j=1:len
        m=I_gray(i,j)+1;
        hist(m)=hist(m)+1;
    end
end
hist=hist/(wid*len);%直方图归一化
miuT=0;
for m=1:colorlevel
    miuT=miuT+(m-1)*hist(m);
end
xigmaB2=0;

for mindex=1:colorlevel
    threshold=mindex-1;
    omega1=0;
    omega2=0;
    for m=1:threshold-1
          omega1=omega1+hist(m);
    end
    omega2=1-omega1;
    miu1=0;
    miu2=0;

    for m=1:colorlevel
        if m<threshold
           miu1=miu1+(m-1)*hist(m);
        else
           miu2=miu2+(m-1)*hist(m);
        end
    end
    miu1=miu1/omega1;
    miu2=miu2/omega2;
    xigmaB21=omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2;
    xigma(mindex)=xigmaB21;
    if xigmaB21>xigmaB2
        finalT=threshold;
        xigmaB2=xigmaB21;
    end
end
fT=finalT/255 %阈值归一化
T=graythresh(I_gray)%matlab函数求阈值
for i=1:wid
    for j=1:len
        if I_double(i,j)>finalT
            bin(i,j)=1;
        else
            bin(i,j)=0;
        end
    end
end
subplot(1,2,2),imshow(bin);title('最佳阈值分割')
figure,plot(1:colorlevel,xigma);
title('最大类间方差算法求解自适应阈值')

%%
bw = bin;
figure;
bw=bwmorph(bw,'open',5); %  执行形态学开操作(先腐蚀后膨胀)
subplot(221);
imshow(bw);
title('形态学开操作(先腐蚀后膨胀)');

bw=bwmorph(bw,'hbreak',inf);% 'hbreak'移除连通的像素
subplot(222);
imshow(bw);
title('hbreak移除连通的像素');

bw=bwmorph(bw,'spur',inf);%   移除刺激(孤立)像素。
subplot(223);
imshow(bw);
title('移除刺激(孤立)像素');

bw=bwmorph(bw,'open',5);% 执行形态学开操作(先腐蚀后膨胀)
subplot(224);
imshow(bw);
title('形态学开操作(先腐蚀后膨胀)');
%%
[I2,III]=myCanny(bw,0.15);
  
figure,imshow(I2);title('canny算子边缘检测')

人脸定位

人脸定位:
基于几何特征的算法,对静态人脸从图像采集、预处理、到特征点定位提取,校验通过,对RGB图像通过形态学图像处理算法选定区域,再进行细化算法,找到其五官坐标并提取出来。
基于特征的方法,基于不变特征的方法主要是通过寻找人脸面部不变的特征来对输入图像进行人脸检测。该类方法认为人脸面部的一些特征(肤色、边缘、纹理等)具有在不同的姿态、视角、表情下都不会发生改变的特性,整体轮廓法。

[I2,III]=myCanny(bw,0.15);
  
figure,imshow(I2);title('canny算子边缘检测')

%%
img = I;

detector = buildDetector();
[bbox, bbimg ,faces ,bbfaces] = detectFaceParts(detector,img,2);  %检测人脸

figure;imshow(bbimg);
for i=1:size(bbfaces,1)
 figure;imshow(bbfaces{i});  %定位人脸,并画框
end

最终结果:
在这里插入图片描述
程序详情,见我博客主页的演示视频,资源也已上传。

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数&#xff1a; gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点&#xff1a; 完后运行&#xff0c;r gdb 中的有用命令 下面是一个有用的 gdb 命令子集&#xff0c;按可能需要的顺序大致列出。 第一列给出了命令&#xff0c;可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布&#xff1a; 一元高斯分布&#xff1a;(将多元高斯分布中的D取值1&#xff09; 其中代表的是平均值&#xff0c;是方差的平方&#xff0c;也可以用来表示&#xff0c;是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要&#xff0c;需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容&#xff0c;经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch &#xff0c;简称ES 。是一个全文搜索服务器&#xff0c;也可以作为NoSQL 数据库&#xff0c;存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项&#xff1a; (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候&#xff0c;访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议&#xff1a;以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么&#xff1f; 在java规范中是这样描述的&#xff1a;Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联&#xff0c;线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统&#xff0c;该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口&#xff0c;远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能&#xff0c;出了大概一年了。 程序员们在编程时遇到不会的问题&#xff0c;又没有老师可以提问&#xff0c;就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法&#xff0c;但是不一定得到回复&#xff0c;…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎&#xff0c;题目很狗&#xff0c;第一次踩这个坑&#xff0c;单拉出来写个题解记录一下 题意&#xff1a;给一个数字矩阵&#xff0c;一次操作&#xff1a;对于每一行&#xff0c;可以去掉左端或者右端的数&#xff0c;得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1&#xff09;全特化2&#xff09;偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类&#xff1a; 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…