【图像加密】基于行列像素置乱和小波变换DWT实现图像隐藏加密matlab代码

206 阅读2分钟

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代码与数据下载地址

见博客主页