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

📄 main.asv

📁 基于混沌
💻 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 + -