1. 程式人生 > 其它 >【影象加密】基於matlab行列畫素置亂+DWT影象加密【含Matlab原始碼 675期】

【影象加密】基於matlab行列畫素置亂+DWT影象加密【含Matlab原始碼 675期】

一、簡介

小波變換原理
小波變換是一種訊號的時間一尺度(時間一頻率)分析方法,一種視窗大小固定不變形狀可改變,時間窗和頻率窗都可以改變的時頻區域性化分析方法。它具有多解析度分析( 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

三、執行結果







四、備註

版本:2014a

完整程式碼或代寫加1564658423