基于机器学习的虹膜识别系统设计

设计的虹膜识别系统流程图如图 1 所示,在图像的预处理过程中主要包括虹膜定位、虹膜区域提取、虹膜区域极坐标变换和归一化处理。最后采用SVM识别方法实现虹膜识别。

图1 虹膜识别系统流程图

虹膜识别主要包括虹膜定位、虹膜裁剪、极坐标变换、归一化、HOG特征提取、虹膜识别六个主要步骤。本系统采用MATLAB作为开发工具实现

图 2 虹膜识别系统设计图

1.虹膜定位
1.1霍夫变换——虹膜快速定位
虹膜定位的目的是较为精确地估计两个圆的中心和半径。大多数经典算法是根据瞳孔的灰度值较低,从而容易找到一个阈值来对图像二值化,进而找到虹膜的内边界,但是在遇到较强烈的光照情况下,瞳孔会有斑点,使阈值选择变得不太容易。而霍夫变换是一种基于参数的投票机制算法,它通过判断图像空间中的每一个边界点是否满足参数空间构成的可能轨迹,以一种累加投票的方式求得边界参数,并根据参数方程将满足参数空间的边界点连接起来,达到目标轮廓跟踪拟合的目的。投票机制是针对所有检测到的边缘点,计算量大是霍夫变换的一个严重缺点。霍夫变换在计算机视觉中广泛应用于轮廓跟踪和图形拟合领域。从理论上来说,霍夫变换可以用来检测任意已知形状的目标。本文采用基于霍夫变换实现虹膜定位,并改进该方法,提高虹膜定位的速度。霍夫变换用于虹膜定位的过程为∶首先,对原虹膜图像用一个边缘检测算子检测其边缘,这里采用经典的Canny 算子,并且得到一个二值边界图像I(xi,yi),(xi,yi)为所有边界点的位置,其中i=1,2,n,n为边界点的个数。然后通过一种投票累加机制用来估计圆心(xj,vj)和半径r。
霍夫变换的定义为:

其中,(xj,yj,r)为圆心坐标和半径大小,构成参数组对应累加器,其值的大小表示该参数组得票多少。得票的多少取决于有多少个边界点落在由该参数组构成的圆上。如果某一边界点(xi,yi,)落在了参数组(xj,yj,r)对应的圆上,那么对应的累加器H(xj,yj,r)的票数就会自动加1。式判断边界点(xi, yi)是否落在(xj,yj ,r)圆上:

其中,
最后统计H (xi, yi , xj,yj ,r)的票数,得票最多的H (xi, yi , xj,yj ,r)所对应的(xj,yj,r)即所求圆的圆心和半径。

霍夫变换的主要缺点在于其计算时间比较长。在霍夫变换中,投票机制要考虑图像中所有边缘点(xi,yi,)到可能的圆心(x0,y0)和半径r的值。霍夫变换的另一个缺点是如果有太多的边缘点,使得搜索范围增大。本文提出一种基于感兴趣区域的虹膜定位算法,该算法改变了以往算法先定位虹膜内边界,再定位外边界的传统思路,而是先定位虹膜的外边界。在搜索边界之前,先定义感兴趣区域,使得搜索范围变小,再去掉一些干扰点,进一步缩小了搜索的范围,有效地解决了霍夫变换运行时间长的问题。
1.2外圆定位
具体算法步骤如下。
(1)在虹膜图像中,取一条水平区域HF (Horizon Field),定义为从虹膜图像的中心行开始向下取四分之一的图像区域,如图所示。
(2)根据直方图方法得到一个阈值T,用于对H进行二值化,如图9-6(b)所示,并且找到二值化后水平区域中的最大连通区域LUF (The Largest Union Filed),如图所示。
(3)计算原图像中LUF中的像素的平均值a和方差v,考虑原图像中像素值在[a-v,a+v]的所有像素作为虹膜像素,如图所示。
(4)对原图像中,被LUF包含的区域应用 Canny 算子提取图像的边界,如图所示。
(5)经过边缘提取后得到了一些边缘部分,在这些边缘中忽略掉一些小的边缘,如图所示。
(6)最后通过霍夫变换对这些边缘部分进行处理,得到虹膜的外边界,如图所示。
1.3 内圆定位
(1)计算虹膜区域内部所有像素的灰度平均值 avg,并且以 avg 作为区分虹膜和瞳孔区域的阙值。
(2)根据阙值对图像进行二值化,如图所示。
(3)对图像进行滤波,去除一些噪声,如图所示。通过Canny算子找到瞳孔区域的边界点,如图所示。
(5)对处理后的图像用霍夫变换找到虹膜的内边界,如图所示。

数据库:中科院虹膜数据库CASIA-Iris

一共249类

这里只选取两类进行分析

clc;
clear all;
%% 批量处理数据集
pwd='D:\Desktop\基于机器学习的虹膜识别系统设计';
currentPath = pwd;  % 获得当前的工作目录imds = imageDatastore(fullfile(pwd,'虹膜库/'),'IncludeSubfolders',true,'LabelSource','foldernames');   % 载入所有图片集合
numImages = length(imds.Files); %图片总的张数
for i=1:numImageseye0=imread(imds.Files{i,1});Result=preprocess(eye0);path=strcat('处理后数据\',imds.Files{i,1}(32:35),string(i),'.jpg')imwrite(Result,path);
end


最后预处理结果

HOG+SVM分类结果

eye0=imread('D:\Desktop\基于机器学习的虹膜识别系统设计\虹膜库\001\L\S1001L02.jpg');
eye1=eye0;
%% 提取眼球
[imgN,imgM]=size(eye1);
for i=1:imgNfor j=1:imgMif eye1(i,j)<50eye1(i,j)=0;elseeye1(i,j)=255;endend
end
img2=eye1;
figure;
imshow(img2);
title('提取眼球');
%% 对图像进行滤波
img3=medfilt2(img2);
figure;
imshow(img3);
title('中值滤波');
se=strel('square',3);
img31=imerode(img3,se);
figure;
imshow(img31);
title('形态学处理-膨胀腐蚀');
%% 运用 Canny 算子提取边缘
img4=edge(img31, 'canny');
figure
imshow(img4);
title(' Canny 算子提取边缘')
%% 运用霍夫变换对图像进行圆拟合
[C,HM]=Houghcircle(img4,[30,140]);%%画内圆
I=eye0;
x0=C(1);
yO=C(2);
r=C(3);
DrawCircle(I,C);
%% 画外圆
img=I;
C1(3)=C(3)+55;
C1(1)=C(1);
C1(2)=C(2);
DrawCircle(img,C1);
%% 虹膜裁剪
img4=I;
img5=img4;
for i=1:imgNfor j=1:imgMif((i-C(2))^2+(j-C(1))^2)>C1(3)^2||((i-C(2))^2+(j-C(1))^2)<C(3)^2img5(i,j)=255;endend
endfigure;
imshow(img5);
title('虹膜裁剪')
%% 极坐标变换
img6=img5;
eyeizb=Expan_normalization(img6,C(1),C(2),C(3),C(1),C(2),C1(3));
figure
imshow(eyeizb)
title('极坐标变换');
%% 虹膜图像规范化
[imgN,imgM]=size(eyeizb);
for i=1:imgN/2for j=1:imgMeyegfh(i,j)=eyeizb(i,j);end
endfigure
imshow(uint8(eyegfh));
title('规范化虹膜32*512');
clc;
clear all;
%% 划分数据集
pwd='D:\Desktop\基于机器学习的虹膜识别系统设计';
currentPath = pwd;  % 获得当前的工作目录
imds = imageDatastore(fullfile(pwd,'处理后数据/'),'IncludeSubfolders',true,'LabelSource','foldernames');   % 载入所有图片集合
[imdsTrain,imdsTest]=splitEachLabel(imds,0.8);
N1=length(imdsTrain.Files);
N2=length(imdsTest.Files);%  初始化特征矩阵
imageSize = [32 512];% 对所有图像进行此尺寸的缩放I = readimage(imdsTrain,1);scaleImage = imresize(I,imageSize); m =size(scaleImage,3);%如果是彩色图片转成灰度图片,灰度图片则不处理if m>1scaleImage=rgb2gray(scaleImage);end    % hog的参数是以下三个,
hog_CellSize=8;
hog_BlockSize=3;
NumBins=9;% 构造和初始化两种特征向量矩阵
numTrainImages = length(imdsTrain.Files);  %训练集样本数
numTestImages = length(imdsTest.Files);    %测试集样本数% featuresTrain 是HOG特征
[hogfeaturestrain, visualization] = extractHOGFeatures(scaleImage,'CellSize',[hog_CellSize hog_CellSize],'BlockSize',[hog_BlockSize hog_BlockSize],'NumBins',NumBins);
featuresTrain = zeros(numTrainImages,size(hogfeaturestrain,2),'double');
% 对每张图片提取两种特征向量
for i = 1:numTrainImages imageTrain = readimage(imdsTrain,i); imageTrain = imresize(imageTrain,imageSize); % 缩放m =size(imageTrain,3);if m>1imageTrain=rgb2gray(imageTrain);end    % HOGfeaturesTrain(i,:) = extractHOGFeatures(imageTrain,'CellSize',[hog_CellSize hog_CellSize],'BlockSize',[hog_BlockSize hog_BlockSize],'NumBins',NumBins);
end% 所有训练图像标签
trainLabels = imdsTrain.Labels; % 训练集的样本标签,是mx1的矩阵,是文字的
double_trainLabels=double(imdsTrain.Labels);% 将标签转成数值
%% 提取测试集的特征和特征标签
imageSize = [32 512];% 对所有图像进行此尺寸的缩放   参数1:图片大小I = readimage(imdsTest,1);scaleImage = imresize(I,imageSize); m =size(scaleImage,3);% 如果是彩色图片转成灰度图片,灰度图片则不处理if m>1scaleImage=rgb2gray(scaleImage);end    numTestImages = length(imdsTest.Files);    % 测试集样本数% featuresTest2是HOG特征
[hogfeaturestest, visualization] = extractHOGFeatures(scaleImage,'CellSize',[hog_CellSize hog_CellSize],'BlockSize',[hog_BlockSize hog_BlockSize],'NumBins',NumBins);
featuresTest2 = zeros(numTestImages,size(hogfeaturestest,2),'double'); for i = 1:numTestImages imageTest = readimage(imdsTest,i); imageTest = imresize(imageTest,imageSize); %缩放m =size(imageTest,3);if m>1imageTest=rgb2gray(imageTest);end    % HOGfeaturesTest2(i,:) = extractHOGFeatures(imageTest,'CellSize',[hog_CellSize hog_CellSize],'BlockSize',[hog_BlockSize hog_BlockSize],'NumBins',NumBins);
end
featuresTest = featuresTest2;% 把两种特征横向地拼接起来
% 所有测试图像标签
testLabels = imdsTest.Labels; % 训练集的样本标签每一类的数量,是mx1的矩阵
double_testLabels=double(imdsTest.Labels);% 将标签转成数值
%% svm分类
SVMModel=fitcsvm(featuresTrain,double_trainLabels)
%% 测试
s=0;
predict_testLabels=SVMModel.predict(featuresTest);
for i=1:length(predict_testLabels)if predict_testLabels(i)==double_testLabels(i)s=s+1;end
end
acc=s/length(predict_testLabels);
disp('测试集正确率')
acc
confusionchart(double_testLabels, predict_testLabels);

下载链接

【项目实战-MATLAB】:基于机器学习的虹膜识别系统设计相关推荐

  1. 人脸年龄估计matlab,基于人脸的年龄识别系统设计与实现

    内容介绍 原文档由会员 小丑88 发布 基于人脸的年龄识别系统设计与实现 1.36万字 自己原创的毕业论文,已经通过校内系统检测,重复率低,仅在本站独家出售,大家放心下载使用 摘 要 本文分析了年龄估 ...

  2. matlab统计所有股票分析,MATLAB金融算法分析实战:基于机器学习的股票量化分析...

    MATLAB金融算法分析实战:基于机器学习的股票量化分析 作者:吴婷;余胜威 编著 出版日期:2017年07月 文件大小:32.24M 支持设备: ¥50.00在线试读 适用客户端: 言商书局 iPa ...

  3. 【北京大学】13 TensorFlow1.x的项目实战之手写英文体识别OCR技术

    目录 1 项目介绍 1.1 项目功能 1.2 评估指标 2 数据集介绍 2.1 数据特征 3 数据的预处理 3.1 数据增强 3.2 倾斜矫正 3.3 去横线 3.4 文本区域定位 4 网络结构 5 ...

  4. android中私有方法 继承,Android项目实战系列—基于博学谷(五)个人资料

    由于这个模块内容较多,篇幅较长,请耐心阅读. 个人资料模块分为两个部分 [x] [个人资料]() [x] [资料修改]() 一.个人资料 1.个人资料界面 (1).创建个人资料界面 在com.buxu ...

  5. android注册文件打开,Android项目实战系列—基于博学谷(三)注册与登录模块

    由于这个模块内容较多,篇幅较长,请耐心阅读. 注册与登录模块分为三个部分 [x] [欢迎界面]() [x] [注册界面]() [x] [登录界面]() 一.欢迎界面 1.创建工程,命名为BoXueGu ...

  6. 基于机器学习的车牌识别系统

    基于机器学习的车牌识别系统 本文设计的车牌处理系统主要用于通过手机.路口监视器拍到的车牌照片进行识别.由图像处理.车牌定位.字符分割和字符识别四个模块组成,该四部分需要依次执行,其中的每一模块需要利用 ...

  7. python验证码识别库底色深_基于机器学习的验证码识别

    基于机器学习的验证码识别 目录说明 ├── . ├── catpcha_images 验证码采集存储目录 ├── thred_images二值化图片存储目录 ├── noised_images降噪图片 ...

  8. Android项目实战系列—基于博学谷(四)我的模块(上)

    由于这个模块内容较多,篇幅较长,请耐心阅读. "我"的模块分为四个部分 我的界面 设置界面 修改密码界面 设置密保和找回密码 一."我"的界面 1.底部导航栏 ...

  9. 基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)

    基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类) 一.数据集说明 训练样本来自于github上的EasyPR的c++版本,包含一万三千多张数字及大写字母的图片以及三千多张中 ...

最新文章

  1. Oracle 执行计划
  2. android 上键,在Android键盘上设置Return键
  3. 团队作业——随堂小测
  4. Java黑皮书课后题第5章:5.4(将英里转换成千米)编写程序,显示下面的表格(注意:1英里为1.609千米)
  5. Mongodb账号密码模式的基本认证
  6. Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误...
  7. android纹理存储,Android:OpenGL存储纹理多长时间?
  8. 今日恐慌与贪婪指数为61 贪婪程度有所缓解
  9. armhf php环境搭建,armel、armhf 和 arm64 区别选择
  10. 只用两行代码,我让Transformer推理加速了10倍
  11. UML 类图符号简介-符号 各种关系说明以及举例
  12. python3 yum源_Redhat7.3更换CentOS7 yum源
  13. Galerkin method 热传导公式推导过程
  14. 中专计算机应用专业简历模板,2016计算机应用专业个人简历模板
  15. 搭建个人论坛网站图文教程
  16. Chrome OS Factory开发测试流程
  17. java protected 构造方法_java中子类调用父类构造方法注意事项
  18. Linux编译simplest_ffmpeg_player
  19. xsmax进入dfu模式_iPhoneXSMax怎么强制重启-如何进入DFU模式
  20. 水滴公司:左手口碑,右手商业

热门文章

  1. Java变量概述与使用
  2. 英语学习方法:我是怎么从高考英语115考到托福97的
  3. VMBox加载拷贝的vid报错E_INVALIDARG (0x80070057) Cannot register the hard disk 'D:\VMBox\win7.vdi' {7bca5a3
  4. Google 内购 - Android
  5. Android实现开屏广告(广点通SDK)
  6. 春招秋招,什么是群面和无领导小组讨论
  7. MGF6mARice:利用分子图特征和残差块预测水稻DNAn6-甲基腺嘌呤位点
  8. Cannot create PoolableConnectionFactory (Communications link failure due to unde
  9. 《伟大是熬出来的》冯仑与年轻人闲话人生之一
  10. 手机开锁显示无法连接到服务器是什么问题,苹果手机连接服务器失败原因 苹果手机连接服务器失败是什么原因...