基于MATLAB的指纹识别系统设计与实现:包含图像归一化、二值化、细化及中心点特征提取算法的无...

基于MATLAB的指纹识别系统设计与实现:包含图像归一化、二值化、细化及中心点特征提取算法的无... 基于matlab指纹识别系统 步骤 1.图像归一化 2.二值化 3.图像细化 确定指纹中心点 5.确定指纹特征 无GUI界面程序可正常运行% 读取指纹图像I imread(fingerprint_sample.jpg);if size(I,3) 3 % 彩色图转灰度I rgb2gray(I);endfigure; subplot(2,3,1); imshow(I); title(原指纹图像);%% 1. 图像归一化% 计算原图像灰度均值和方差I_double im2double(I);meanI mean(Idouble(:));varI var(Idouble(:));% 目标均值和方差统一指纹灰度基准target_mean 0.5;target_var 0.1;% 归一化公式变换Inorm (Idouble - meanI) / sqrt(varI) * sqrt(targetvar) targetmean;% 限制灰度在[0,1]区间防止溢出Inorm max(min(Inorm, 1), 0);subplot(2,3,2); imshow(I_norm); title(归一化后图像);说真的归一化这步真不能省之前图省事跳过结果亮区的指纹二值化直接把纹路糊成背景暗区的又把背景当成纹路。说白了就是给所有指纹“统一妆容”——不管拍的时候是曝光过度还是欠曝拉到同一个灰度基准线后面处理才不会乱。%% 2. 二值化% 自适应阈值应对光照不均比固定阈值靠谱100倍level adaptthresh(I_norm, 0.4); % 0.4是阈值比例可根据实际调Ibin imbinarize(Inorm, level);% 反转图像让纹路变成白色方便后续细化处理Ibin ~Ibin;subplot(2,3,3); imshow(I_bin); title(二值化后图像);为啥不用全局阈值你想啊指纹边缘肯定比中心暗用固定阈值的话边缘的纹路直接被当成背景删掉了。自适应阈值是局部算阈值每个小区域自己调亮度标准保证亮区不吞纹路、暗区不误判背景。%% 3. 图像细化% 把宽纹路瘦成单像素骨架迭代到不能再细为止Ithin bwmorph(Ibin, skel, Inf);% 去掉孤立噪声点避免后面把噪声当特征点Ithin bwmorph(Ithin, spur, 8);subplot(2,3,4); imshow(I_thin); title(细化后图像);细化就是把粗粗的纹路“磨尖”成单像素不然后面找端点、分叉点的时候宽纹路的边界会乱跳。加个spur参数去孤立点那些是二值化时带出来的小毛刺不删掉的话会被当成假的端点特征点误报率直接拉满。%% 4. 确定指纹中心点% 用细化后纹路的质心做近似中心点简单够用基于matlab指纹识别系统 步骤 1.图像归一化 2.二值化 3.图像细化 确定指纹中心点 5.确定指纹特征 无GUI界面程序可正常运行stats regionprops(I_thin, Centroid);centroid stats.Centroid;% 画个大红点标出来subplot(2,3,5); imshow(I_thin); hold on;plot(centroid(1), centroid(2), ro, MarkerSize, 10, DisplayName, 中心点);title(指纹中心点); legend; hold off;中心点是后续比对的“锚点”——不管手指怎么放、图像怎么平移以中心点为参考计算特征点相对位置就能把两个指纹对齐。要是追求极致精准可以专门找核心点周围纹路呈环形的点不过日常用质心足够应付大部分场景代码还简单。%% 5. 提取指纹特征细节点端点分叉点[m, n] size(I_thin);minutiae []; % 存储格式[行坐标, 列坐标, 类型(1端点,2分叉点)]% 遍历所有纹路像素避开边界防止数组越界for i 2:m-1for j 2:n-1if I_thin(i,j) 1 % 只处理纹路像素% 取8邻域排除自身neighbors I_thin(i-1:i1, j-1:j1);neighbors(2,2) 0;% 统计邻域连通的纹路像素数conn_count sum(neighbors(:));% 端点邻域只有1个连通点纹路断了分叉点邻域有3个连通点一分三if conn_count 1minutiae [minutiae; i, j, 1];elseif conn_count 3minutiae [minutiae; i, j, 2];endendendend% 可视化特征点subplot(2,3,6); imshow(I_thin); hold on;plot(centroid(1), centroid(2), ro, MarkerSize, 10);% 蓝色*标端点绿色标分叉点idx_end minutiae(:,3) 1;idx_bif minutiae(:,3) 2;plot(minutiae(idxend,2), minutiae(idxend,1), b*, MarkerSize, 6, DisplayName, 端点);plot(minutiae(idxbif,2), minutiae(idxbif,1), g, MarkerSize, 8, DisplayName, 分叉点);title(指纹特征点); legend; hold off;这就是指纹识别的“身份证”——每个人的端点、分叉点数量、位置全不一样。把代码存成.m文件直接运行就行不用搞花里胡哨的GUI把你的指纹图替换掉fingerprint_sample.jpg就能一键跑出所有步骤的结果从原图像到特征点一目了然。要是后续想加比对功能直接算两个指纹特征点的匹配度就行这部分就留给你们自己折腾啦~