gusucode.com > 《matlab图像处理与界面编程宝典》秦襄培 编著,每章的MATLAB源代码程序 > 第26章/第26.2.3节中的代码.txt

    
clear all,close all,clc            % 清理工作空间,关闭运行窗口,清理命令窗口
I=imread('Empreinte.bmp');         % 读入图像
imshow(I)                          % 显示图像
set(gcf,'position',[1 1 600 600]); % 得到图形窗口句柄,设置图形窗口位置
J=I(:,:,1)>160;                         % 设定阈值为160,进行黑白化处理
imshow(J)                             % 显示处理后的图像
set(gcf,'position',[1 1 600 600]);           % 得到图形窗口句柄,设置图形窗口位置
K=bwmorph(~J,'thin','inf');          % 数学形态学运算,图像细化,~符号代表黑白反色
imshow(~K)                      % 显示处理后的图像,~符号代表黑白反色
set(gcf,'position',[1 1 600 600]);     % 得到图形窗口句柄,设置图形窗口位置
function y=minutie(x)
i=ceil(size(x)/2);
if x(i,i)==0;
    y=0;
else
    y=sum(x(:)) - 1;
end
fun=@minutie;                         % 得到函数句柄
L = nlfilter(K,[3 3],fun);            % 滤波处理
LTerm=(L==1);                         % 选择端点
imshow(LTerm)                         % 显示白色点
LTermLab=bwlabel(LTerm);                        % 端点标识
propTerm=regionprops(LTermLab,'Centroid');        % 端点区域分析,寻找端点区域中心
CentroidTerm=round(cat(1,propTerm(:).Centroid));    % 端点圆整为整数
imshow(~K)                                     % 显示隆线细化图像
set(gcf,'position',[1 1 600 600]);                    % 得到当前图形窗口句柄,设置位置
hold on                                         % 在前面的图形窗口继续绘制图像
plot(CentroidTerm(:,1),CentroidTerm(:,2),'ro')   % 绘制隆线端点标识,红色圆圈
LBif=(L==3);                                     % 选择分叉点
LBifLab=bwlabel(LBif);                            % 分叉点标识
propBif=regionprops(LBifLab,'Centroid','Image');     % 区域分析,寻找区域中心
CentroidBif=round(cat(1,propBif(:).Centroid));        % 分叉点圆整为整数
plot(CentroidBif(:,1),CentroidBif(:,2),'go')             % 绘制隆线分叉点标识,绿色圆圈
D=6;
Distance=DistEuclidian(CentroidBif,CentroidTerm); % 求端点和分叉点的距离
SpuriousMinutae=Distance<D;                       % 满足距离小于D的点 
[i,j]=find(SpuriousMinutae);                      % 查找对应像素点
CentroidBif(i,:)=[];                              % 去除该分叉点
CentroidTerm(j,:)=[];                             % 去除该端点   
Distance=DistEuclidian(CentroidBif);             % 求两个分叉点的距离
SpuriousMinutae=Distance<D;                      % 满足距离小于D的点
[i,j]=find(SpuriousMinutae);                     % 查找对应像素点
CentroidBif(i,:)=[];                             % 去除该分叉点
Distance=DistEuclidian(CentroidTerm);            % 求两个端点的距离
SpuriousMinutae=Distance<D;                      % 满足距离小于D的点
[i,j]=find(SpuriousMinutae);                     % 查找对应像素点    
CentroidTerm(i,:)=[];                            % 去除该端点
hold off                                         % 结束在前面的图形窗口绘图
imshow(~K)                                       % 显示细化图
hold on                                          % 继续在前面的图形窗口绘图
plot(CentroidTerm(:,1),CentroidTerm(:,2),'ro')   % 绘制隆线端点标识,红色圆圈
plot(CentroidBif(:,1),CentroidBif(:,2),'go')     % 绘制隆线分叉点标识,绿色圆圈
hold off                                         % 结束在前面的图形窗口绘图
Kopen=imclose(K,strel('square',7));          % 闭合运算         
KopenClean= imfill(Kopen,'holes');           % 填充图像中的孔洞  
KopenClean=bwareaopen(KopenClean,5);         % 开运算
imshow(KopenClean)                           % 显示处理结果
KopenClean([1 end],:)=0;                     % 赋值语句
KopenClean(:,[1 end])=0;                     % 赋值语句
ROI=imerode(KopenClean,strel('disk',10));    % 腐蚀运算
imshow(ROI)                                  % 显示处理结果
imshow(I)                                          % 显示原始图像
hold on                                            % 继续在前面的图形窗口绘图
imshow(ROI)                    % 显示感兴趣区域
alpha(0.5)                                         % 设置透明度
hold on                                            % 继续在前面的图形窗口绘图
plot(CentroidTerm(:,1),CentroidTerm(:,2),'ro')     % 绘制端点标识,红色圆圈
plot(CentroidBif(:,1),CentroidBif(:,2),'go')         % 绘制分叉点标识,绿色圆圈
hold off                                           % 结束在前面的图形窗口绘图
 [m,n]=size(I(:,:,1));                                      % 求图像尺寸
indTerm=sub2ind([m,n];                                 % 从下标得到单精度索引
CentroidTerm(:,1),CentroidTerm(:,2));                      % 端点  
Z=zeros(m,n);                                           % 全零矩阵
Z(indTerm)=1;
ZTerm=Z.*ROI';
[CentroidTermX,CentroidTermY]=find(ZTerm);
indBif=sub2ind([m,n],CentroidBif(:,1),CentroidBif(:,2));   % 从下标得到单精度索引
Z=zeros(m,n);
Z(indBif)=1;
ZBif=Z.*ROI';
[CentroidBifX,CentroidBifY]=find(ZBif);
imshow(I)                                                  % 显示原始图像
hold on                                                    % 继续绘图
plot(CentroidTermX,CentroidTermY,'ro','linewidth',2)       % 红色圆圈
plot(CentroidBifX,CentroidBifY,'go','linewidth',2)         % 绿色圆圈
Table=[3*pi/4 2*pi/3 pi/2 pi/3 pi/4               % 角度查找表
       5*pi/6 0 0 0 pi/6
       pi 0 0 0 0
      -5*pi/6 0 0 0 -pi/6
      -3*pi/4 -2*pi/3 -pi/2 -pi/3 -pi/4];
for ind=1:length(CentroidTermX)
    Klocal=K(CentroidTermY(ind)-2:CentroidTermY(ind)+2, ...
CentroidTermX(ind)-2:CentroidTermX(ind)+2);
    Klocal(2:end-1,2:end-1)=0;
    [i,j]=find(Klocal);
    OrientationTerm(ind,1)=Table(i,j);
end
dxTerm=sin(OrientationTerm)*5;
dyTerm=cos(OrientationTerm)*5;
figure                                                        % 新建窗口
imshow(K)                                                     % 显示黑白图
set(gcf,'position',[1 1 600 600]);                            % 设置图像窗口属性
hold on                                                       % 继续绘图
plot(CentroidTermX,CentroidTermY,'ro','linewidth',2)          % 红色圆圈
plot([CentroidTermX CentroidTermX+dyTerm]',...                % 红色短线
    [CentroidTermY CentroidTermY-dxTerm]','r','linewidth',2)
for ind=1:length(CentroidBifX)
    Klocal=K(CentroidBifY(ind)-2:CentroidBifY(ind)+2, ...
CentroidBifX(ind)-2:CentroidBifX(ind)+2);
    Klocal(2:end-1,2:end-1)=0;
    [i,j]=find(Klocal);
    if length(i)~=3
        CentroidBifY(ind)=NaN;
        CentroidBifX(ind)=NaN;
        OrientationBif(ind)=NaN;
    else
        for k=1:3
            OrientationBif(ind,k)=Table(i(k),j(k));
            dxBif(ind,k)=sin(OrientationBif(ind,k))*5;
            dyBif(ind,k)=cos(OrientationBif(ind,k))*5;
        end
    end
end
plot(CentroidBifX,CentroidBifY,'go','linewidth',2)          % 绿色圆圈
OrientationLinesX=[CentroidBifX ...
CentroidBifX+dyBif(:,1);CentroidBifX ...
CentroidBifX+dyBif(:,2);CentroidBifX CentroidBifX+dyBif(:,3)]';
OrientationLinesY=[CentroidBifY 
CentroidBifY-dxBif(:,1);CentroidBifY ...
CentroidBifY-dxBif(:,2);CentroidBifY CentroidBifY-dxBif(:,3)]';
plot(OrientationLinesX,OrientationLinesY,'g','linewidth',2) % 绿色短线
MinutiaTerm=[CentroidTermX,CentroidTermY,OrientationTerm];
MinutiaBif=[CentroidBifX,CentroidBifY,OrientationBif];
saveMinutia('John Doe',MinutiaTerm,MinutiaBif);   % saveMinutia函数见附件程序