【指纹识别】基于matlab GUI指纹识别【含Matlab源码 029期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
⛳️座右铭:行百里者,半于九十。

更多Matlab仿真内容点击👇
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)

⛄一、指纹识别简介

指纹识别技术主要分三个步骤:指纹预处理、特征提取、指纹分类与匹配。
无论是指纹分类还是指纹匹配,都需要提取指纹的有效特征,而特征提取的性能很大程度上要依赖于指纹图像的质量。在实际应用中,由于采集条件和采集设备的因素,采集到的指纹图像质量比较差,容易导致很多问题,影响后续处理的效果。因此,指纹图像的预处理是关系到指纹识别系统性能好坏的一个关键。

1 预处理主要分以下四个步骤:
指纹图像灰度归一化和均衡化
归一化的目的:在于消除指纹采集过程中由于传感器自身的噪声以及因为手指压力不同而造成的灰度差异,将指纹图像的对比度和灰度调整到一个固定的级别上,为后续处理提供一个较为统一的图像规格。均衡化是对图像中像素个数多的灰度级进行展宽,对像素个数少的灰度级进行缩减。

指纹图像分割

其目标就是根据特征提取的需要,把指纹图像中质量很差、在后续处理中很难恢复的图像区域与有效区域分开,使后续处理能够集中在有效区域;能提高特征提取的精确度;能大大减少指纹预处理的时间。

指纹图像二值化

二值化的目的是把灰度指纹图像变成0、1取值的二值图像二值化后处理及细化
由于灰度滤波的不完全性,而且在二值化过程中有时会引入新的噪声,需要对图像进行滤波处理。采用加权中值滤波的方法,根据前景点的不同方向选用不同的权值模板进行滤波,以便于消除纹线上的孔洞和缺口。二值化后的纹线仍然有一定宽度,需要细化为单个像素宽度的骨架。细化算法很多,这里采用骨架提取技术。

⛄二、部分源代码

clc;

close all;

global immagine n_bands h_bands n_arcs h_radius h_lato n_sectors matrice num_disk

%immagine 双精度类型的灰度图

n_bands=4;

h_bands=20;

n_arcs=16;

h_radius=12;

h_lato=h_radius+(n_bandsh_bands2)+16;

if mod(h_lato,2)==0

h_lato=h_lato-1;

end

n_sectors=n_bands*n_arcs;%多少行数据量

matrice=zeros(h_lato);

for ii=1:(h_lato*h_lato)

matrice(ii)=whichsector(ii);

end

num_disk=8;%8个方向

% 1–> add database

% 0–> recognition

% ok=0;

chos=0;

possibility=6;%有6个菜单,分别为’选择图像并加入数据库’,‘指纹识别’,‘删除数据库’,‘可视化指纹图像’,‘可视化Gabor滤波’,‘退出’

messaggio=‘Insert the number of set: each set determins a class. This set should include a number of images for each person, with some variations in expression and in the lighting.’;

while chos~=possibility,

chos=menu('指纹识别系统','选择图像并加入数据库','指纹识别','删除数据库','可视化指纹图像','可视化Gabor滤波','退出');

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 计算指纹编码并添加到数据库

if chos==1

    clc;

    close all;

    selezionato=0;%选择标志

    while selezionato==0

        [namefile,pathname]=uigetfile({'*.bmp;*.tif;*.tiff;*.jpg;*.jpeg;*.gif','IMAGE Files (*.bmp,*.tif,*.tiff,*.jpg,*.jpeg,*.gif)'},'选在灰度图');%打开一个灰度图

        if namefile~=0 %文件存在

            [img,map]=imread(strcat(pathname,namefile));%读取文件

            selezionato=1;

        else

            disp('选择灰度图');

        end

        if (any(namefile~=0) && (~isgray(img)))%文件不存在或不是灰度图

            disp('选择灰度图');

            selezionato=0;

        end

    end

    

    immagine=double(img);

    

    if isa(img,'uint8')%如果img是uint8

        graylevmax=2^8-1;%计算大小

    end

    if isa(img,'uint16')

        graylevmax=2^16-1;

    end

    if isa(img,'uint32')

        graylevmax=2^32-1;

    end

    fingerprint = immagine;

    

    N=h_lato;

    

    [BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);%二值化图像,计算中心点

    [CroppedPrint]=Cropping(XofCenter,YofCenter,fingerprint);%图像修剪

    [NormalizedPrint,vector]=sector_norm(CroppedPrint,0);%扇形,归一化输入图像        

    

    for (angle=0:1:num_disk-1)    

        gabor=gabor2d_sub(angle,num_disk);%Gabor滤波

        ComponentPrint=conv2fft(NormalizedPrint,gabor,'same');

        [disk,vector]=sector_norm(ComponentPrint,1);    

        finger_code1{angle+1}=vector(1:n_sectors);

    end       

    

    img=imrotate(img,180/(num_disk*2));%以一定角度对图像进行旋转

    fingerprint=double(img);

    

    [BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);

    [CroppedPrint]=Cropping(XofCenter,YofCenter,fingerprint);

    [NormalizedPrint,vector]=sector_norm(CroppedPrint,0);

    

    for (angle=0:1:num_disk-1)    

        gabor=gabor2d_sub(angle,num_disk);

        ComponentPrint=conv2fft(NormalizedPrint,gabor,'same');

        [disk,vector]=sector_norm(ComponentPrint,1);    

        finger_code2{angle+1}=vector(1:n_sectors);

    end

    % 增加指纹编号到数据库

    if (exist('database.dat')==2)

        load('database.dat','-mat');

        fingerprint_number=fingerprint_number+1;

        data{fingerprint_number,1}=finger_code1;

        data{fingerprint_number,2}=finger_code2;

        save('database.dat','data','fingerprint_number','-append');

    else

        fingerprint_number=1;

        data{fingerprint_number,1}=finger_code1;

        data{fingerprint_number,2}=finger_code2;

        save('database.dat','data','fingerprint_number');

    end

    

    message=strcat('指纹增加成功。编号:',num2str(fingerprint_number));

    msgbox(message,'指纹编数据库','信息');

end % chos 1

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 指纹识别

if chos==2

    clc;

    close all;

    selezionato=0;

    while selezionato==0

        [namefile,pathname]=uigetfile({'*.bmp;*.tif;*.tiff;*.jpg;*.jpeg;*.gif','IMAGE Files (*.bmp,*.tif,*.tiff,*.jpg,*.jpeg,*.gif)'},'选择灰度图');

        if namefile~=0

            [img,map]=imread(strcat(pathname,namefile));

            selezionato=1;

        else

            disp('选择灰度图');

        end

        if (any(namefile~=0) && (~isgray(img)))

            disp('选择灰度图');

            selezionato=0;

        end

    end

    

    immagine=double(img);

    

    if isa(img,'uint8')

        graylevmax=2^8-1;

    end

    if isa(img,'uint16')

        graylevmax=2^16-1;

    end

    if isa(img,'uint32')

        graylevmax=2^32-1;

    end

    fingerprint = immagine;

    

    N=h_lato;

    

    [BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);%二值化

    [CroppedPrint]=Cropping(XofCenter,YofCenter,fingerprint);%裁剪

    [NormalizedPrint,vector]=sector_norm(CroppedPrint,0);%归一化

    

    % 存储每个特征向量d的入口

    vettore_in=zeros(num_disk*n_sectors,1);

    for (angle=0:1:num_disk-1)    

        gabor=gabor2d_sub(angle,num_disk);

        ComponentPrint=conv2fft(NormalizedPrint,gabor,'same');

        [disk,vector]=sector_norm(ComponentPrint,1);    

        finger_code{angle+1}=vector(1:n_sectors);

        vettore_in(angle*n_sectors+1:(angle+1)*n_sectors)=finger_code{angle+1};

    end     

   

    % 计算输入值文编号

    % 检查数据库

    if (exist('database.dat')==2)

        load('database.dat','-mat');

        %---- 分配内存 -----------------------------------

        %...

        vettore_a=zeros(num_disk*n_sectors,1);

        vettore_b=zeros(num_disk*n_sectors,1);

        best_matching=zeros(fingerprint_number,1);

        valori_rotazione=zeros(n_arcs,1);

        % 开始检查 ---------------------------------------

        for scanning=1:fingerprint_number

            fcode1=data{scanning,1};

            fcode2=data{scanning,2};

            for rotazione=0:(n_arcs-1)

                p1=fcode1;

                p2=fcode2;

                % ruoto i valori dentro disco

                for conta_disco=1:num_disk%取出每列数据

                    disco1=p1{conta_disco};

                    disco2=p2{conta_disco};

                    for old_pos=1:n_arcs

                        new_pos=mod(old_pos+rotazione,n_arcs);

                        if new_pos==0

                            new_pos=n_arcs;

                        end

                        for conta_bande=0:1:(n_bands-1)%取该列每行

                            disco1r(new_pos+conta_bande*n_arcs)=disco1(old_pos+conta_bande*n_arcs);

                            disco2r(new_pos+conta_bande*n_arcs)=disco2(old_pos+conta_bande*n_arcs);

                        end

                    end

                    p1{conta_disco}=disco1r;

                    p2{conta_disco}=disco2r;

                end

                % ruoto i dischi circolarmente

                for old_disk=1:num_disk

                    new_disk=mod(old_disk+rotazione,num_disk);

                    if new_disk==0

                        new_disk=num_disk;

                    end

                    pos=old_disk-1;

                    vettore_a(pos*n_sectors+1:(pos+1)*n_sectors)=p1{new_disk};

                    vettore_b(pos*n_sectors+1:(pos+1)*n_sectors)=p2{new_disk};                    

                end

                d1=norm(vettore_a-vettore_in);

                d2=norm(vettore_b-vettore_in);

                if d1<d2

                    val_minimo=d1;

                else

                    val_minimo=d2;

                end

                valori_rotazione(rotazione+1)=val_minimo;

            end

            [minimo,posizione_minimo]=min(valori_rotazione);

            best_matching(scanning)=minimo;

        end

        [distanza_minima,posizione_minimo]=min(best_matching);

        beep;

        message=strcat('与数据库中最相似的指纹是 : ',num2str(posizione_minimo)');% 具有',num2str(distanza_minima),'个实例');

        msgbox(message,'数据库信息','信息');            

    else

        message='数据库为空. 不能匹配.';

        msgbox(message,'指纹编号数据库错误','错误');    

    end

    

end % chos 2

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 删除数据库  

if chos==3

    clc;

    close all;

    if (exist('database.dat')==2)

        button = questdlg('你确定要删除数据库吗?');

        if strcmp(button,'Yes')

            delete('database.dat');

            msgbox('数据库删除成功。','数据库删除','信息');

        end

    else

        warndlg('数据库为空!','警告')

    end

end % chos 3

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 可视化指纹图像    

if chos==4

    clc;

    close all;

    selezionato=0;

    while selezionato==0

        [namefile,pathname]=uigetfile({'*.bmp;*.tif;*.tiff;*.jpg;*.jpeg;*.gif','IMAGE Files (*.bmp,*.tif,*.tiff,*.jpg,*.jpeg,*.gif)'},'Chose GrayScale Image');

        if namefile~=0

            [img,map]=imread(strcat(pathname,namefile));

            selezionato=1;

        else

            disp('选择灰度图');

        end

        if (any(namefile~=0) && (~isgray(img)))

            disp('选择灰度图');

            selezionato=0;

        end

    end

    figure('name','选择图像');

    imshow(img);

end % chos 4

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 可视化Gabor滤波

if chos==5

    clc;

    close all;

    figure('name','Gabor滤波');

    mesh(gabor2d_sub(0,num_disk));

end % chos 5 

end % end while

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]刘艳华.基于MATLAB/GUI的指纹识别系统设计[J].信息与电脑(理论版). 2021,33(18)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海神之光

有机会获得赠送范围1份代码

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

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

打赏作者

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

抵扣说明:

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

余额充值