• 大小: 9KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-18
  • 语言: Matlab
  • 标签: matlab  

资源简介

利用matlab,对指纹图片进行预处理,包括缩放处理,归一化,区分出前景色和背景色,沿脊线方向增强指纹纹路,去除指纹中的空洞和毛刺,图像细化,可直接编译使用

资源截图

代码片段和文件信息


f=imread(‘C:\Users\lin\Desktop\t.png‘);%读取图像到内存
f=imresize(f[363312]);%该函数用于对图像做缩放处理。
figure;imshow(f);
%用rgb2gray 将彩色图像转换为灰度图像。matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。
%所以要先将图像转为double格式的才能运算
gray=double(rgb2gray(f));
%转成uint8 imshow()显示图像时对double型是认为在0~1范围内即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。
%所以对double类型的图像显示的时候,要么归一化到0~1之间,要么将double类型的0~255数据转为uint8类型。
figure;imshow(uint8(gray));

%归一化,灰度值限制在某一范围
M=0;var=0;
%均值
m=size(gray1);n=size(gray2);
for x=1:m
    for y=1:n
        M=M+gray(xy);
    end
end
M1=M/(m*n);%M1为均值 所有像素总共和除以多少个像素
%方差
for x=1:m
    for y=1:n
        var=var+(gray(xy)-M1).^2;
    end;
end;
var1=var/(m*n);%计算方差最终的大小 var1
%归一化 ********************************
for x=1:m
    for y=1:n
        if gray(xy)>M1
            gray(xy)=150+sqrt(2000*(gray(xy)-M1)/var1);
        else
            gray(xy)=150-sqrt(2000*(M1-gray(xy))/var1);
        end
    end
end
figure;imshow(uint8(gray));

%*************************************************************************************************************
%归一化处理完毕后会对图像进行分割处理,目的是区分出前景色和背景色。我采用的分割为根据多区域阈值分割。
%多区域分割的效果取决于区域的大小,而指纹的区域分为一脊一谷最好,所以我选择3x3的区域大小。我会根据对区域多次进行求均值和方差进行分割。
%分割 分成多个3*3的块大小 
M=3;
H=floor(m/M);L=floor(n/M);
aveg1=zeros(HL);
var1=zeros(HL);
%计算每一块的平均值
for x=1:H
    for y=1:L
        aveg=0;var=0;
        %每一块的均值
        for i=1:M
            for j=1:M
                aveg=gray(i+(x-1)*Mj+(y-1)*M)+aveg;
            end;
        end;
        aveg1(xy)=aveg/(M*M);
        %每一块的方差值
        for i=1:M
            for j=1:M
                var=(gray(i+(x-1)*Mj+(y-1)*M)-aveg1(xy)).^2+var;
            end;
        end;
        var1(xy)=var/(M*M);
    end;
end;
%所有块的平均值和方差
Gmean=0;Vmean=0;
for x=1:H
    for y=1:L
        Gmean=Gmean+aveg1(xy);
        Vmean=Vmean+var1(xy);
    end
end
Gmean1=Gmean/(H*L);
Vmean1=Vmean/(H*L);

%每一小块和整块相比,再次求均值方差
% 前景(黑色)
gtemp=0;gtotle=0;vtotle=0;vtemp=0;
for x=1:H
    for y=1:L
        if Gmean1>aveg1(xy)%如果当前快的均值小于全局均值 就认为是前景 
            gtemp=gtemp+1;
            gtotle=gtotle+aveg1(xy);
        end
        if Vmean1            vtemp=vtemp+1;
            vtotle=vtotle+var1(xy);
        end
    end
end
% 前景均值
G1=gtotle/gtemp;
% 前景方差
V1=vtotle/vtemp;

%再次与刚刚产生的值相比
% 求得背景(白色)均值方差 增加可靠性
gtemp1=0;gtotle1=0;vtotle1=0;vtemp1=0;
for x=1:H
    for y=1:L
        if G1            gtemp1=gtemp1+1;
            gtotle1=gtotle1+aveg1(xy);
        end
        if 0            vtemp1=vtemp1+1;
            vtotle1=vtotle1+var1(xy);
        end
    end
end
% 背景均值
G2=gtotle1/gtemp1;
% 背景方差
V2=vtotle1/vtemp1;
%我会根据对区域多次进行求均值和方差进行分割。采集到的指纹图背景的灰度值大于前景色,背景主要为低频,所以背景的方差小于前景的方差。
%我分别求得背景和前景的均值和方差然后会得到背景为白色 脊线为黑色。
%然后保存在矩阵e(二值图)中,我会根据e中位置等于1的点的八邻域点的和小于四得到背景色,达到背景和前景分离(e矩阵)。
%****************************************
%构建矩阵(H*L

评论

共有 条评论