⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rao.m

📁 图像的方向图处理
💻 M
字号:
%利用梯度法求解指纹的块方向图
clear;close all;
fp=imread('102_3.tif');  %读入指纹图象
imshow(fp);title('原始指纹图象')               %显示指纹图象  
%以下是对原始指纹图象进行规格化,规格化后的灰度均值M0设为80,方差Var0为200
M0=80;  
Var0=200;
[len,wid]=size(fp);
fpn=zeros(len,wid);       %为规格化后的图象设置存储空间
M=mean2(fp);              %求原始指纹图象灰度均值
Var=std2(fp)^2;             %求原始指纹图象灰度方差
%规格化
fp=double(fp);   %将uint8型转换成double,便于sqrt的计算
for i=1:len
    for j=1:wid
        if fp(i,j)>M
            fpn(i,j)=M0+sqrt( Var0*(fp(i,j)-M)^2/Var );  
        else
            fpn(i,j)=M0-sqrt( Var0*(fp(i,j)-M)^2/Var );
        end
    end
end
fpn=uint8(fpn);
figure,imshow(fpn);title('规格化后的指纹图象');  %显示规格化后的指纹图象

sobelx=[-1 0 1;-2 0 2;-1 0 1];
sobely=sobelx';
dx=zeros(len,wid);
dy=dx;
theta=dx;
%计算x和y方向上的梯度dx和dy
for m=2:254
   for  n=2:254
       for i=1:3
           for j=1:3
              dx(m,n)=dx(m,n)+fp(m+i-2,n+j-2)*sobelx(i,j);
              dy(m,n)=dy(m,n)+fp(m+i-2,n+j-2)*sobely(i,j);
           end
       end
   end
end
     
block_dmap=ones(256,256);                   %给块方向图定义存储空间,初值为1

Vx=zeros(32,32);
Vy=Vx;
jiaodu=Vx;
for  i=1:32
  for       j=1:32                  %分成32*32个块
      %计算块方向 
       x=dx([1+(i-1)*8:8+(i-1)*8],[1+(j-1)*8:8+(j-1)*8]); 
       y=dy([1+(i-1)*8:8+(i-1)*8],[1+(j-1)*8:8+(j-1)*8]); 
       temp=x.*y;       
       Vx(i,j)=2*sum(temp(:));
       temp=x.^2-y.^2;
       Vy(i,j)=sum(temp(:));
       if Vy(i,j)==0
           jiaodu(i,j)=0;
       else
           jiaodu(i,j)=1/2*atan( Vx(i,j)/Vy(i,j) );
       theta([1+(i-1)*8:8+(i-1)*8],[1+(j-1)*8:8+(j-1)*8])=jiaodu(i,j);
       end
 %弧度改成角度
       theta([1+(i-1)*8:8+(i-1)*8],[1+(j-1)*8:8+(j-1)*8])=theta([1+(i-1)*8:8+(i-1)*8],[1+(j-1)*8:8+(j-1)*8])*180/pi;
       jiaodu(i,j)=jiaodu(i,j)*180/pi;
       if  Vy(i,j)>0
            jiaodu(i,j)=jiaodu(i,j)+90;
       end
       if   Vy(i,j)<0 && Vx(i,j)>0
            jiaodu(i,j)=jiaodu(i,j)+180;
       end

               if  jiaodu(i,j)<=11.25 ||  jiaodu(i,j)>168.75;
                    y1=1;
                elseif    jiaodu(i,j)>11.25 &&jiaodu(i,j)<=33.75;
                    y1=2;  
                elseif    jiaodu(i,j)>33.75 &&  jiaodu(i,j)<=56.25; 
                    y1=3;  
                elseif   jiaodu(i,j)>56.25 && jiaodu(i,j)<=78.75;
                   y1=4;    
               elseif   jiaodu(i,j)>78.75 && jiaodu(i,j)<=101.25;
                    y1=5;
               elseif    jiaodu(i,j)>101.25 && jiaodu(i,j)<=123.75;
                    y1=6;
               elseif    jiaodu(i,j)>123.75 && jiaodu(i,j)<=146.25;
                    y1=7;
               elseif   jiaodu(i,j)>146.25 && jiaodu(i,j)<=168.75;
                    y1=8;
                end
      angle_xy=ones(8,8);
       
       switch  y1
                case 1
                  angle_xy(4,[2:7])=0;                 %方向1,即方向为0度时,令第8行第2-15列的元素为0(黑色)
                case 2
                  idx=sub2ind(size(angle_xy),[  3 4 4 5 5 6  ],[2:7]);
                  angle_xy(idx)=0;                 
                case 3
                  idx=sub2ind(size(angle_xy),[2:7],[2:7]);
                  angle_xy(idx)=0;
                case 4
                  idx=sub2ind(size(angle_xy),[2:7],[  3 4 4 5 5 6  ]);
                  angle_xy(idx)=0;
                case 5
                  angle_xy([2:7],4)=0;
                case 6
                  idx=sub2ind(size(angle_xy),[7:-1:2],[   3 4 4 5 5 6 ]);
                  angle_xy(idx)=0;
                case 7
                  idx=sub2ind(size(angle_xy),[7:-1:2],[7:-1:2]);
                  angle_xy(idx)=0;                     
                case 8
                  idx=sub2ind(size(angle_xy),[  6 5 5 4 4 3  ],[2:7]);
                  angle_xy(idx)=0;
                end
  
                block_dmap([1+(i-1)*8:8+(i-1)*8],[1+(j-1)*8:8+(j-1)*8])=angle_xy;
  end
end

               
figure;imshow(block_dmap);title('RAO梯度法求得的块方向图');
fp=double(fp);
rever_block_dmap=1-block_dmap;               %rever_block_dmap内的元素非0即1
rever_block_dmap=250*rever_block_dmap;       %将rever_block_dmap内的灰度值乘上250,以便显示叠加的图形
addblock_dmap=imadd(fp,rever_block_dmap,'double');
figure;imshow(addblock_dmap,[]); title('原指纹图象和块方向图的叠加图形');     %显示原指纹图象和块方向图叠加的图形

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -