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函数见附件程序