📄 main.asv
字号:
%基于混沌矩阵可逆运算对图象进行加密解密的程序
%混沌系统Chen与混沌系统Liu之间保持同步
clear all
close all
%---------------运行异结构混沌系统同步程序---------------------------------
T=75; %设定异结构混沌系统同步程序的运行时间
sim('yiyiegou_xx1yy1_xx2yy2');
%---------------导入任意一张jpg格式图像-------------------------------------
% A=imread('flower1.jpg'); %图像大小:448*336(f>g)
% A=imread('flower2.jpg'); %图像大小:465*700(f<g)
A=imread('flower3.jpg');%图像大小:1024*768(f>g)
% A=imread('flower4.jpg');%图像大小:1024*768(f>g)
% A=imread('flower5.jpg');%图像大小:665*767(f<g)
% A=imread('flower6.jpg');%图像大小:640*512(f>g)
figure;
imshow(A);
title('原始图像');
[f1,g1,h]=size(A);
%---------------构造加密混沌矩阵和解密混沌矩阵--------------------------
a0=0.3*xx1+0.55*yy1;%由驱动系统xx1,yy1叠加,生成混沌序列a0;
b0=0.3*xx2+0.55*yy2;%由响应系统xx2,yy2叠加,生成混沌序列b0;
c0=length(a0)-2000;%去除未达到同步时的前2000个数。
for i=1:1:c0
a(i)=a0(i+2000); %把a0中剩余的数赋于新的序列a。达到同步时,从第2001个数开始对加密解密有用。
b(i)=b0(i+2000); %把b0中剩余的数赋于新的序列b。达到同步时,从第2001个数开始对加密解密有用。
end
[f,g,h]=size(A);
if (f>=g)
A=imrotate(A,90);
end
[f,g,h]=size(A);
%以下为根据同步序列a和b来构造同步序列X,Y,使得length(X)>g*g, length(Y)>g*g
d0=length(a);
QZ=ceil((g*g)/d0);
for i=1:1:QZ
HdxL1(i,:)=a;
HdxL2(i,:)=b;
end
X=reshape(HdxL1,1,QZ*d0);% X为形成加密混沌矩阵的混沌序列,该序列所有元素均与Y序列同步
Y=reshape(HdxL2,1,QZ*d0);% Y为形成解密混沌矩阵的混沌序列,该序列所有元素均与X序列同步
for i=1:g
for j=1:g
K(i,j)=X(i*j);%把混沌序列X中的数,按序填满方阵,形成混沌矩阵K
end
end
for i=1:g
for j=1:g
L1(i,j)=Y(i*j);%把混沌序列Y中的数,按序填满方阵,形成混沌矩阵L1
end
end
%---------------以灰度图像格式显示混沌矩阵图像-------------------------------
U=mat2gray(K);%此时将驱动系统混沌矩阵K转化成灰度图象U,范围为[0,1]
figure;
imshow(U);
title('由混沌序列X生成的加密混沌矩阵');
colorbar;
figure;
imhist(U);
title('混沌序列X生成混沌图像的直方图');
V=mat2gray(L1);%此时将响应系统混沌矩阵L1转化成灰度图象V,范围为[0,1]
figure;
imshow(V);
title('由混沌序列Y生成的解密混沌矩阵');
colorbar;
figure;
imhist(V);
title('混沌序列Y生成混沌图像的直方图');
%---------------初始化加密解密时用到的各个矩阵-------------------------------
C=zeros(f,g);%初始化原图片矩阵C
R=zeros(f,g,3);%初始化加密后的方阵图象R
S=zeros(f,g,3);%初始化解密后的方阵图象S
T=zeros(f,g,3);%初始化解密后的图象T
M1=char('图象A的红色分量灰度图象','图象A的绿色分量灰度图象','图象A的蓝色分量灰度图象');
M2=char('加密前红色分量灰度图象直方图','加密前绿色分量灰度图象直方图','加密前蓝色分量灰度图象直方图');
M3=char('加密后的红色分量灰度图象','加密后的绿色分量灰度图象','加密后的蓝色分量灰度图象');
M4=char('加密后的红色分量灰度图象直方图','加密后的绿色分量灰度图象直方图','加密后的蓝色分量灰度图象直方图');
M5=char('解密后的红色分量灰度图象','解密后的绿色分量灰度图象','解密后的蓝色分量灰度图象');
M6=char('解密后的红色分量灰度图象直方图','解密后的绿色分量灰度图象直方图','解密后的蓝色分量灰度图象直方图');
%---------------加密解密过程----------------------------------------------
for m=1:h; %以下对图象A的RGB三层颜色分别加密及解密,然后再整合成RGB图象
B=A(:,:,m);
figure;
imshow(B);
title(M1(m,:));%显示灰度图像
figure;
imhist(B);
title(M2(m,:));%显示灰度图像直方图
for i=1:f
for j=1:g
C(i,j)=B(i,j);
end
end
%把原图象的信息按象素位置加载到初始化矩阵C中,形成图象信息矩阵C
D=mat2gray(C);%把此图象信息矩阵C转化为灰度图象D
%----------------------------------------------------------------------
%加密
F=D*U; %用混沌矩阵U右乘图象信息方阵D,形成加密后的矩阵F
I=mat2gray(F);%对矩阵F转化为灰度图象I
figure;
imshow(I);%显示加密后的灰度图象I
title(M3(m,:));
colorbar;
figure;
imhist(I);%显示加密后的灰度图象I的直方图
title(M4(m,:));
R(:,:,m)=I;%把加密后图象I的数据分别赋于图象R的R、G、B三层
%----------------------------------------------------------------------
%解密
G=inv(V);%求混沌矩阵V的逆矩阵,形成解密矩阵G
H=F*G;%解密矩阵G右乘加密后的矩阵F,转化成解密后的矩阵H
L=mat2gray(H);%把解密后的矩阵H转化成灰度图象
figure;
imshow(L);%显示解密后的灰度图象L
title(M5(m,:));
colorbar;
figure;
imhist(L);
title(M6(m,:));
S(:,:,m)=L;%将解密后图象L的数据分别赋于图象S的R、G、B三层
for r=1:f
for s=1:g
T(r,s,m)=L(r,s);
end
end
end
%------------------显示加密后的jpg图像------------------------------------
if(f1>g1);
R1=imrotate(R,-90);
figure;
imshow(R1);
title('加密后旋转-90度后的RGB图像');
else
figure;
imshow(R);
title('加密后的RGB图象');
end
%------------------显示解密后的jpg图像-----------------------------------
if(f1>g1);
R2=imrotate(T,-90);
figure;
imshow(R2);
title('解密后旋转-90度后的RGB图像');
else
figure;
imshow(T);
title('解密后的图象');
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -