图像加密基于行列像素置乱+DWT小波变换图像隐藏加密matlab源码

Posted 博主QQ2449341593

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像加密基于行列像素置乱+DWT小波变换图像隐藏加密matlab源码相关的知识,希望对你有一定的参考价值。

一、简介

小波变换原理
小波变换是一种信号的时间一尺度(时间一频率)分析方法,一种窗口大小固定不变形状可改变,时间窗和频率窗都可以改变的时频局部化分析方法。它具有多分辨率分析( Multi-resolution Analysis)的特点,且在时频两域都具有表征信号局部特征的能力。
小波分析方法在低频部分具有较高的频率分辨率和较低的时间分辨率,在高频部分具有较高的时间分辦率和较低的频率分辦率,所以被誉为“数学显微镜”。正是这种特性,使小波变换具有对信号的自适应性。
小波分析被看成调和分析这一数学领域半个世纪以来的工作结晶,已经广泛地应用于信号处理、图像处理、量子场论、地震勘探、语音识别与合成、音乐、雷达、CT成像、彩色复印、流体湍流、天体识别、机器视觉、机械故障诊断与监控、分形以及数字电视等科技领域。
原则上讲,传统上使用傅里叶分析的地方,都可以用小波分析取代。小波分析优于傅里叶变换的地方是在时域和频域同时具有良好的局部化性质。
在这里插入图片描述
这样小波变換对不同的频率在时域上的取样步长是调节性的:在低频时,小波变换的时间分辨率较低,而频率分辦率较高;在高频时,小波变换的时间分辨率较高,而類率分辨率较低。这正符合低频信号变化缓慢而高频信号变化迅速的特点。
这便是它优于经典傅里叶变换与短时傅里叶变换的地方。

二、源代码

%同时打乱各行和各列进行明文图像第一次加密 %%% 
clear;  
W = imread('lena.tif');  
s = size(W);  
r = randsample(s(1), s(1));  
W1 = W(r, :, :);  
c = randsample(s(2), s(2));  
W2 = W1(:, c, :);  
i = 1; f = 1:length(c);  
while i <= length(c)  
    f(i) = find(c == i);  
    i = i + 1;  
end   
P = W2;   
R = P(:,:,1);        %提取明文图像的R层像素
G = P(:,:,2);        %提取明文图像的G层像素
B = P(:,:,3);        %提取明文图像的B层像素
figure(1)
subplot(2,2,1);imshow(R,[]);title('第一次加密的R层');imwrite(R,'R1.tif')
subplot(2,2,2);imshow(G,[]);title('第一次加密的G层');imwrite(G,'G1.tif')
subplot(2,2,3);imshow(B,[]);title('第一次加密的B层');imwrite(B,'B1.tif')
subplot(2,2,4);imshow(P,[]);title('第一次加密的RGB彩色层');imwrite(P,'第一次加密的RGB彩色层.tif')
%%%%%%第二次加密%%%%%
[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,'R2.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,'G2.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,'B2.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

[Gll,Glh,Ghl,Ghh]=dwt2(Gf,wave_in);
mv=mean(Gll(:));%求出矩阵Gll平均值
for i=1:floor(M)
    for j=1:floor(N)
        if(Gll(i,j)>=mv)
            Glh(i,j)=GCV(i,j);
            Ghl(i,j)=GCD(i,j);
        else
            Glh(i,j)=GCD(i,j);
            Ghl(i,j)=GCV(i,j);
        end
    end
end

[Bll,Blh,Bhl,Bhh]=dwt2(Bf,wave_in);
mv=mean(Bll(:));%求出矩阵Bll平均值
for i=1:floor(M)
    for j=1:floor(N)
        if(Bll(i,j)>=mv)
            Blh(i,j)=BCV(i,j);
            Bhl(i,j)=BCD(i,j);
        else
            Blh(i,j)=BCD(i,j);
            Bhl(i,j)=BCV(i,j);
        end
    end
end

% 进行逆小波变换(idwt),得到视觉安全上的图像FRGB
Fr=idwt2(Rll,Rlh,Rhl,Rhh,wave_in);
Fg=idwt2(Gll,Glh,Ghl,Ghh,wave_in);
Fb=idwt2(Bll,Blh,Bhl,Bhh,wave_in);
Frgb(:,:,1)=Fr;%%合成
Frgb(:,:,2)=Fg;%%合成
Frgb(:,:,3)=Fb;%%合成
Frgb=uint8(Frgb);
figure(4);
subplot(2,2,1);imshow(Fr,[]);title('载密R层');
subplot(2,2,2);imshow(Fg,[]);title('载密G层');
subplot(2,2,3);imshow(Fb,[]);title('载密B层');
subplot(2,2,4);imshow(uint8(Frgb),[]);title('视觉安全图像');
imwrite(Frgb,'视觉安全图像.tif')

%%%%%%%%%%%%%%%%%%%%%%%%%%从视觉上安全的密文图像提取明文的密文图像%%%%%%%%%%%%%%%%%%%
C=Frgb;
%从这里开始是还原首先分解出RGB三层
% close all;
Cr=C(:,:,1);
Cg=C(:,:,2);
Cb=C(:,:,3);
[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

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

完整代码或者仿真咨询添加QQ2449341593

以上是关于图像加密基于行列像素置乱+DWT小波变换图像隐藏加密matlab源码的主要内容,如果未能解决你的问题,请参考以下文章

图像加密基于matlab行列像素置乱+DWT图像加密含Matlab源码 675期

图像隐藏基于小波变换DWT图像水印嵌入提取含各类攻击matlab源码

图像隐写基于matlab小波变换DWT数字盲水印嵌入+攻击含Matlab源码 2313期

图像隐写基于matlab小波变换DWT数字盲水印嵌入+攻击含Matlab源码 2313期

图像检索基于matlab小波变换DWT图像检索含Matlab源码 2404期

图像融合基于matlab主成分结合小波离散变换PCA-DWT图像融合含Matlab源码 2199期