1 简介
在传统算法的基础上,结合小波理论和混沌理论及置乱方法,研究实现了一种基于小波变换的图像置乱加密算法,首先对图像进行二维离散小波变换,再进行混沌加密.实验结果证明该算法加密效果良好,加密后图像的直方图分布均匀且峰值信噪比较高.
2 部分代码
%同时打乱各行和各列进行数字图像加密
clear;
RGB = imread('lena.tif');
s = size(RGB);
r = randsample(s(1), s(1));
RGBS = RGB(r, :, :);
c = randsample(s(2), s(2));
RGBSS = RGBS(:, c, :);
i = 1; f = 1:length(c);
while i <= length(c)
f(i) = find(c == i);
i = i + 1;
end
P = RGBSS;
R = P(:,:,1); %提取明文图像的R层像素
G = P(:,:,2); %提取明文图像的G层像素
B = P(:,:,3); %提取明文图像的B层像素
figure(1)
subplot(2,2,1);imshow(R,[]);title('第一次加密的R层');
subplot(2,2,2);imshow(G,[]);title('第一次加密的G层');
subplot(2,2,3);imshow(B,[]);title('第一次加密的B层');
subplot(2,2,4);imshow(P,[]);title('第一次加密的RGB彩色层');
%%%%%%第二次加密%%%%%
[M,N]=size(R); %利用Logistic混沌映射,对R分层图像进行序列加密
u=3.9;
x0=0.5;
x=x0;
for i=1:100 %迭代100次,达到充分混沌状态
x=u*x*(1-x);
end
R1=zeros(1,M*N); %产生一维混沌加密序列
R1(1)=x;
for i=1:M*N-1
R1(i+1)=u*R1(i)*(1-R1(i));
end
R2=uint8(255*R1); %归一化序列
R3=reshape(R2,M,N); %转化为二维混沌加密序列
R4=bitxor(R,R3); %异或操作加密
imwrite(R4,'R.tif')
% [M,N]=size(G); %利用Logistic混沌映射,对G分层图像进行序列加密
u=3.9;
x0=0.5;
x=x0;
for i=1:100 %迭代100次,达到充分混沌状态
x=u*x*(1-x);
end
G1=zeros(1,M*N); %产生一维混沌加密序列
G1(1)=x;
for i=1:M*N-1
G1(i+1)=u*G1(i)*(1-G1(i));
end
G2=uint8(255*G1); %归一化序列
G3=reshape(G2,M,N); %转化为二维混沌加密序列
G4=bitxor(G,G3); %异或操作加密
imwrite(G4,'G.tif')
% [M,N]=size(B); %利用Logistic混沌映射,对B分层图像进行序列加密
u=3.9;
x0=0.5;
x=x0;
for i=1:100 %迭代100次,达到充分混沌状态
x=u*x*(1-x);
end
B1=zeros(1,M*N); %产生一维混沌加密序列
B1(1)=x;
for i=1:M*N-1
B1(i+1)=u*B1(i)*(1-B1(i));
end
B2=uint8(255*B1); %归一化序列
B3=reshape(B2,M,N); %转化为二维混沌加密序列
B4=bitxor(B,B3); %异或操作加密
imwrite(B4,'B.tif')
%RGB三分层合成
P1=cat(3,R4,G4,B4);
figure(2);
subplot(2,2,1);imshow(R4);title('第二次R分层加密后图像');
subplot(2,2,2);imshow(G4);title('第二次G分层加密后图像');
subplot(2,2,3);imshow(B4);title('第二次B分层加密后图像');
subplot(2,2,4);imshow(P1);title('第二次加密彩色RGB图像');
imwrite(P1,'第二次加密彩色RGB图像.tif')
%%%%%%%%%%%%%%%%%%%%%%%%%%将密文图像嵌入载体图像%%%%%%%%%%%%%%%%%%%
%读取载体图像
F = imread('houlian.tif');
Rf = F(:,:,1); %提取载体图像的R层像素
Gf = F(:,:,2); %提取载体图像的G层像素
Bf = F(:,:,3); %提载体取图像的B层像素
figure(3);
subplot(2,2,1);imshow(Rf);title('载体图像R层');
subplot(2,2,2);imshow(Gf);title('载体图像G层');
subplot(2,2,3);imshow(Bf);title('载体图像B层');
subplot(2,2,4);imshow(F);title('载体图像RGB彩色层');
%将R4,G4,B4的像素值分为小数位和十位个位两部分
RCV=mod(R4,10);RCD=floor(R4./10);
GCV=mod(G4,10);GCD=floor(G4./10);
BCV=mod(B4,10);BCD=floor(B4./10);
% 将载体图像进行分层的小波分解,并嵌入
wave_in='db1';
[Rll,Rlh,Rhl,Rhh]=dwt2(Rf,wave_in);
mv=mean(Rll(:));%求出矩阵Rll平均值
for i=1:floor(M)
for j=1:floor(N)
if(Rll(i,j)>=mv)
Rlh(i,j)=RCV(i,j);
Rhl(i,j)=RCD(i,j);
else
Rlh(i,j)=RCD(i,j);
Rhl(i,j)=RCV(i,j);
end
end
end
[Rll1,Rlh1,Rhl1,Rhh1]=dwt2(Cr,wave_in);
mv=median(Rll1(:));
RD1=zeros(M,N);RD2=zeros(M,N);%定义两个矩阵用于存放小数位和十位个位
for i=1:floor(M)
for j=1:floor(N)
if(Rll1(i,j)>=mv)
RD1(i,j)=Rlh1(i,j);
RD2(i,j)=Rhl1(i,j);
else
RD2(i,j)=Rlh1(i,j);
RD1(i,j)=Rhl1(i,j);
end
end
end
RP5=RD2.*10+RD1;%合成提取密文图像的R分量
[Gll1,Glh1,Ghl1,Ghh1]=dwt2(Cg,wave_in);
mv=median(Gll1(:));
GD1=zeros(M,N);GD2=zeros(M,N);
for i=1:floor(M)
for j=1:floor(N)
if(Gll1(i,j)>=mv)
GD1(i,j)=Glh1(i,j);
GD2(i,j)=Ghl1(i,j);
else
GD2(i,j)=Glh1(i,j);
GD1(i,j)=Ghl1(i,j);
end
end
end
GP5=GD2.*10+GD1;%合成提取密文图像的G分量
[Bll1,Blh1,Bhl1,Bhh1]=dwt2(Cb,wave_in);
mv=median(Bll1(:));
BD1=zeros(M,N);BD2=zeros(M,N);
for i=1:floor(M)
for j=1:floor(N)
if(Bll1(i,j)>=mv)
BD1(i,j)=Blh1(i,j);
BD2(i,j)=Bhl1(i,j);
else
BD2(i,j)=Blh1(i,j);
BD1(i,j)=Bhl1(i,j);
end
end
end
BP5=BD2.*10+BD1;
% BP5=BP5(1:M/2,1:N/2);
P14(:,:,1)=RP5;P14(:,:,2)=GP5;P14(:,:,3)=BP5;
figure(5);
subplot(2,2,1);imshow(uint8(RP5),[]);title('提取后R层');
subplot(2,2,2);imshow(uint8(GP5),[]);title('提取后G层');
subplot(2,2,3);imshow(uint8(BP5),[]);title('提取后B层');
subplot(2,2,4);imshow(uint8(P14),[]);title('提取后初步密文图像P14');
%重构图像
R_final=bitxor(uint8(RP5),R3); %异或操作加密
G_final=bitxor(uint8(GP5),G3); %异或操作加密
B_final=bitxor(uint8(BP5),B3); %异或操作加密
Pic_final(:,:,1)=R_final;Pic_final(:,:,2)=G_final;Pic_final(:,:,3)=B_final;%合成解密图像
figure(6);
subplot(2,2,1);imshow(R_final,[]);title('解密R层');
subplot(2,2,2);imshow(G_final,[]);title('解密G层');
subplot(2,2,3);imshow(B_final,[]);title('解密B层');
subplot(2,2,4);imshow(Pic_final,[]);title('解密图像');
j = 1;g = 1:length(r);
RGBE = Pic_final(:, f, :);
while j <= length(r)
g(j) = find(r == j);
j = j + 1;
end
RGBEE = RGBE(g, :, :);
figure(7)
imshow(RGBEE);
title('恢复的明文图像');
imwrite(RGBEE,'恢复的明文图像.tif')
3 仿真结果
4 参考文献
[1]李媛, and 张培. "基于小波变换的图像置乱加密算法研究." 山西电子技术 4(2011):2.
部分理论引用网络文献,若有侵权联系博主删除。
5 MATLAB代码与数据下载地址
见博客主页