clc
clear all
close all
originI=imread('qwe.bmp');
[m,n,s] = size(originI);
I=originI;
if s == 3
I = rgb2gray(originI);
end
I=double(I);
figure, imshow(uint8(I))
tic
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 归一化
M=0;var=0;
for x=1:m
for y=1:n
M=M+I(x,y);
end
end
M1=M/(m*n);
for x=1:m
for y=1:n
var=var+(I(x,y)-M1)*(I(x,y)-M1);
end
end
var1=var/(m*n);
%c=sqrt(30*(I(x,y)-M1)/var1);
for x=1:m
for y=1:n
if I(x,y)>=M1
I(x,y)=150+sqrt(2000*(I(x,y)-M1)/var1);
else
I(x,y)=150-sqrt(2000*(M1-I(x,y))/var1);
end
end
end
figure, imshow(uint8(I));
title('归一化之后的图');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 分割
M = 10; %1
H = m/M; L= n/M;
aveg1=zeros(H,L);
var1=zeros(H,L);
for x=1:H;
for y=1:L;
aveg=0;var=0;
for i=1:M;
for j=1:M;
aveg=I(i+(x-1)*M,j+(y-1)*M)+aveg;
end
end
aveg1(x,y)=aveg/(M*M); %区域内像素的平均值
for i=1:M;
for j=1:M;
var=(I(i+(x-1)*M,j+(y-1)*M)-aveg1(x,y))*(I(i+(x-1)*M,j+(y-1)*M)-aveg1(x,y))+var;
end
end
var1(x,y)=var/(M*M); % 区域内像素的方差
end
end
Gmean=0;Vmean=0;
for x=1:H
for y=1:L
Gmean=Gmean+aveg1(x,y);
Vmean=Vmean+var1(x,y);
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(x,y) %暗示指纹处,指纹处相对来说均值小,方差大
gtemp=gtemp+1; %%%
gtotle=gtotle+aveg1(x,y);
end
if Vmean1<var1(x,y) %暗示指纹处,指纹处相对来说均值小,方差大
vtemp=vtemp+1;
vtotle=vtotle+var1(x,y);
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<aveg1(x,y)
gtemp1=gtemp1+1;
gtotle1=gtotle1+aveg1(x,y);
end
if 0<var1(x,y)<V1
vtemp1=vtemp1+1;
vtotle1=vtotle1+var1(x,y);
end
end
end
G2=gtotle1/gtemp1;V2=vtotle1/vtemp1;
moban=zeros(H,L);
T1=G2;T2=V2;
T3=G1-100;T4=V2-10;
for x=1:H
for y=1:L
if aveg1(x,y)>T1 && var1(x,y)<T2
moban(x,y)=1;
end
if aveg1(x,y)<T3 && var1(x,y)<T2
moban(x,y)=1;
end
end
end
for x=2:H-1
for y=2:L-1
if moban(x,y)==1 %%%%如果这个模块被定义为1,而且它周围八块(八邻域)至少有四个为0,那么这个模块也为0. 3x3 模板
if moban(x-1,y) + moban(x-1,y+1) +moban(x,y+1) + moban(x+1,y+1) + moban(x+1,y) + moban(x+1,y-1) + moban(x,y-1) + moban(x-1,y-1) <=4
moban(x,y)=0; %
end
end
end
end %2
Icc = ones(m,n);
for x=1:H
for y=1:L
if moban(x,y)==1
for i=1:M
for j=1:M
I(i+(x-1)*M,j+(y-1)*M)=G1;
Icc(i+(x-1)*M,j+(y-1)*M)=0; % 这个估计是后面要用到的
end
end
end
end
end
figure, imshow(uint8(I));
title('分割图');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%二值化
temp=(1/9)*[1 1 1;1 1 1;1 1 1];%模版系数 %3
Im=double(I);
In=zeros(m,n);
for a=2:m-1;
for b=2:n-1;
In(a,b)=Im(a-1,b-1)*temp(1,1)+Im(a-1,b)*temp(1,2)+Im(a-1,b+1)*temp(1,3)+Im(a,b-1)*temp(2,1)+Im(a,b)*temp(2,2)+Im(a,b+1)*temp(2,3)+Im(a+1,b-1)*temp(3,1)+Im(a+1,b)*temp(3,2)+Im(a+1,b+1)*temp(3,3);
end
end
I=In;
Im=zeros(m,n);
for x=5:m-5;
for y=5:n-5;
sum1=I(x,y-4)+I(x,y-2)+I(x,y+2)+I(x,y+4);
sum2=I(x-2,y+4)+I(x-1,y+2)+I(x+1,y-2)+I(x+2,y-4);
sum3=I(x-2,y+2)+I(x-4,y+4)+I(x+2,y-2)+I(x+4,y-4);
sum4=I(x-2,y+1)+I(x-4,y+2)+I(x+2,y-1)+I(x+4,y-2);
sum5=I(x-2,y)+I(x-4,y)+I(x+2,y)+I(x+4,y);
sum6=I(x-4,y-2)+I(x-2,y-1)+I(x+2,y+1)+I(x+4,y+2);
sum7=I(x-4,y-4)+I(x-2,y-2)+I(x+2,y+2)+I(x+4,y+4);
sum8=I(x-2,y-4)+I(x-1,y-2)+I(x+1,y+2)+I(x+2,y+4);
sumi=[sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8];
summax=max(sumi);
summin=min(sumi);
summ=sum(sumi);
b=summ/8;
if (summax+summin+ 4*I(x,y))> (3*(sum1+sum2+sum3+sum4+sum5+sum6+sum7+sum8)/8)
sumf = summin;
else
sumf = summax;
end
if sumf > b
Im(x,y)=128;
else
Im(x,y)=255;
end
end
end
for i=1:m
for j =1:n
Icc(i,j)=Icc(i,j)*Im(i,j);
end
end
for i=1:m
for j =1:n
if (Icc(i,j)==128)
Icc(i,j)=0;
else
Icc(i,j)=1;
end;
end
end
figure,imshow(double(Icc));
title('二值化图');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%二值化后处理
Im=Icc;
In=Im;
for a=1:4
for i=2:m-1
for j=2:n-1
if Im(i,j)==1
if Im(i-1,j) + Im(i-1,j+1) +Im(i,j+1) + Im(i+1,j+1) + Im(i+1,j) + Im(i+1,j-1) + Im(i,j-1) + Im(i-1,j-1) <=3
In(i,j)=0;
end
end
if Im(i,j)==0
if Im(i-1,j) + Im(i-1,j+1) +Im(i,j+1) + Im(i+1,j+1) + Im(i+1,j) + Im(i+1,j-1) + Im(i,j-1) + Im(i-1,j-1) >=7
In(i,j)=1;
end
end
end
end
Im=In;
end
figure,imshow(double(In));
title('二值化后处理图');
for i=2:m-1 %反向
for j=2:n-1
if In(i,j)==1
In(i,j)=0;
else
In(i,j)=1;
end
end
end
%细化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Im = imSkeleton_LLLL(In);
I=Im;
for nn = 1:8
for x=2:m-1
for y=2:n-1
if I(x,y) == 1
if I(x,y-1)==1 && I(x,y+1)==0 %a
if (I(x-1,y)==0 && I(x-1,y+1)==1)||(I(x+1,y)==0 && I(x+1,y+1)== 1)
I(x,y)=1;
end
end
if I(x-1,y)==0 && I(x+1,y)==1 %b
if (I(x-1,y-1) ==1 && I(x,y-1)==0)||( I(x-1,y+1)==1 &&I(x,y+1)==0 )
I(x,y)=1;
end
end
if I(x,y-1)==0 && I(x,y+1)==1 %c
if (I(x-1,y-1)==1 & I(x-1,y)==0)||(I(x+1,y)==0 && I(x+1,y-1)== 1)
I(x,y)=1;
end
end
if I(x-1,y)==1 && I(x+1,y)==0 %d
if (I(x+1,y-1) ==1 && I(x,y-1)==0)||( I(x+1,y+1)==1 &&I(x,y+1)==0 )
I(x,y)=1;
else I(x,y)=0;
end
end
else I(x,y)=0;
end
end
end
end
figure,imshow(I);
title('细化图');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%特征提取
xxx=0;
Im=I;
tezheng=zeros(m,n,3);
for i=2:m-1
for j=2:n-1
if Im(i,j)==1
a = 0;
if Im(i-1,j) ~= Im(i-1,j+1)
a = a + 1;
end
if Im(i-1,j+1) ~= Im(i,j+1)
a = a + 1;
end
if Im(i,j+1) ~= Im(i+1,j+1)
a = a + 1;
end
if Im(i+1,j+1) ~= Im(i+1,j)
a = a + 1;
end
if Im(i+1,j) ~= Im(i+1,j-1)
a = a + 1;
end
if Im(i+1,j-1) ~= Im(i,j-1)
a = a + 1;
end
if Im(i,j-1) ~= Im(i-1,j-1)
a = a + 1;
end
if Im(i-1,j-1) ~= Im(i-1,j)
a = a + 1;
end
if a==6 %%%分叉点判断
tezheng(i,j,1)=i;
tezheng(i,j,2)=j;
tezheng(i,j,3)=1;
xxx=xxx+1;
I(i,j)=0;
I(i-1,j)=1;I(i-1,j+1)=1;I(i,j+1)=1;I(i+1,j+1)=1;I(i+1,j)=1;I(i+1,j-1)=1;I(i,j-1)=1;I(i-1,j-1)=1;
%%%%%%%%%%%%%%%%%%%%%%%%%1表示分叉点 0表示端点
end