matlab:基于二维直方图的图像签名与认证。
代码:
clear all
data=imread('E:\matlabCX\图片\7.jpg');
%data=double(data);
%data=imnoise(data,'gaussian',0.01)
figure(1)
subplot(2,2,1)
imshow(uint8(data));
title('原图像');
subplot(2,2,2);
data=rgb2gray(data);
imhist(uint8(data));
title('1D直方图');
[M,N]=size(data);
data=double(data);
%3*3的滤波窗口;
data1=medfilt2(data);
subplot(2,2,3);
imshow(uint8(data1));
title('平滑图像');
L=256;
D=zeros(L,L);
for i=1:M
for j=1:N
T1=data(i,j)+1;
T2=data1(i,j)+1;
D(T1,T2)=D(T1,T2)+1;
end
end
subplot(2,2,4);
mesh(D);
title('2D直方图');
data1=zeros(L,L);
data0=D;
% l为控制置乱加密次数,l=15;
% Arnold变换参数: a=1,b=1,c=1,d=2;
% x0=0,y0=0;
for l=1:15
x0=0;
y0=0;
for x=1:L
for y=1:L
x1=x+y+x0;
y1=x+2*y+y0;
x1=mod(x1,L);
y1=mod(y1,L);
if x1==0
x1=L;
end
if y1==0
y1=L;
end
data1(x1,y1)=data0(x,y);
end
end
if l==15
figure(2)
subplot(1,2,1);
mesh(D);
title('原二维直方图');
t1=num2str(l);
ss=strcat('E:\matlabCX\图片\7.jpg',t1);
ss=strcat(ss,'.txt');
f1=fopen(ss,'w');
for i=1:L
for j=1:L
fwrite(f1,D(i,j),'ubit8');
end
fwrite(f1,'%\n');
end
fclose(f1);
subplot(1,2,2);
mesh(data1);
title('加密后二维直方图');
ss1=strcat('E:\matlabCX\图片\7.jpg',t1);
ss1=strcat(ss1,'.txt');
f2=fopen(ss1,'w');
for i=1:L
for j=1:L
fwrite(f2,data1(i,j),'ubit8');
end
fwrite(f2,'%\n');
end
fclose(f2);
end
data0=data1;
end
D1=data1;
m1=0;
m2=0;
m3=0;
for i=1:L
for j=1:L
m1=m1+i^2*D1(i,j);
m2=m2+j^2*D1(i,j);
m3=m3+i*j*D1(i,j);
end
end
m11=int2str(m1);
m22=int2str(m2);
m33=int2str(m3);
mm=strcat(m11,m22);
mm=strcat(mm,m33);
%签名输出信息mm;
%可对签名信息进一步实施加密.
figure(3)
imshow(uint8(data));
mm=strcat('签名信息=',mm);
xlabel(mm);
结果:
少年不被楼层误,余生不羁尽自由。
加油,加油!