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







四、備注
完整代碼或者代寫添加QQ 1564658423
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272174.html
標籤:其他
上一篇:實用技巧:阿里云服務器建立公網物聯網服務器(解決阿里云服務器埠,公網連接不上的問題)
下一篇:普歌-允異團隊-【Java知識點】這些Java學習路上你必須知道的底層原理(1),Java面試考點!!!Java類加載的機制/static、final關鍵字/堆、堆疊
