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

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

设计的虹膜识别系统流程图如图 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:numImages
    eye0=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:imgN
    for j=1:imgM
        if eye1(i,j)<50
            eye1(i,j)=0;
        else
            eye1(i,j)=255;
        end
    end
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:imgN
    for j=1:imgM
        if((i-C(2))^2+(j-C(1))^2)>C1(3)^2||((i-C(2))^2+(j-C(1))^2)<C(3)^2
            img5(i,j)=255;
        end
    end
end

figure;
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/2
    for j=1:imgM
        eyegfh(i,j)=eyeizb(i,j);
    end
end

figure
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>1
        scaleImage=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>1
        imageTrain=rgb2gray(imageTrain);
    end    
   
    % HOG
    featuresTrain(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>1
        scaleImage=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>1
        imageTest=rgb2gray(imageTest);
    end    
   
    
    % HOG
    featuresTest2(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);

下载链接

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桃子技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值