【影象加密】基於matlab混沌系統圖像加密【含Matlab原始碼 1190期】
一、簡介
Logistic混沌置亂,先不說有多複雜,其實很簡單。 Logistic函式是源於一個人口統計的動力學系統,其系統方程形式如下: X(k+1) = u * X(k) * [1 - X(k)],(k=0,1,…,n) 先不用管這個方程是怎麼得出來的,覺得不舒服的話自己百度去。可以看出這個方程是非線性的,迭代的形式。要使用的話,我們需要知道兩個東西: ① 初值:X(0) ② 引數:u
為什麼這個方程可以稱作混沌呢?它什麼時候是一個混沌系統呢?這個也是有條件的:
① 0 < X(0) < 1
② 3.5699456... < u <=4
當滿足上述兩個條件時,Logistic函式工作於混沌狀態。這兩個條件是怎麼來的請百度,我們這裡只說演算法和實現。什麼是混沌狀態:顧名思義就是一種無序的、不可預測的、混亂的、摸不到頭、摸不到尾的狀態。混沌狀態時會出現什麼現象,我們以下面的引數為例:
① X(0) = 0.1
② u = 4
當迭代n次後,我們就得到了X(1)、X(2)、…,X(n)這麼n個值。那麼這就是一個混沌序列,是一維的暫且稱作序列A,也就是我們想要得到的序列,在MATLAB中,可以看出X(i)(i=1,2,…,n)的取值是在(0,1)之間的——這是一個很好地特性,就像影象灰度值是在(0,255)之間一樣。那麼我們把這個一維序列歸一化到(0,255)之間得到序列B。 再來看加密過程。對於一幅MN大小的影象(暫且稱為Picture),我們需要產生一個同樣大小的矩陣來對其進行加密。如此說來,只需要迭代MN次得到序列A,再轉成序列B,此時序列B是一維的,將其轉化成M*N的二維矩陣(暫且稱為Fuck)。因此,用Fuck與Picutre進行異或,便可得到一幅新的影象,稱作Rod,如此便完成了一次影象加密,加密後的影象為Rod。
Rod=Picture⊕Fuck(⊕表示異或)
這樣我們手中的祕鑰是:u,X(0)
此種加密方式稱作序列加密,可以看出這種加密方式改變了下畫素的灰度(直方圖變了),沒有改變位置。解密同樣道理:Picture = Rod⊕Fuck。
二、原始碼
```c clear;clc; I=imread('lena.bmp','bmp'); %讀取影象資訊 figure;imshow(I);title('原始圖片'); figure;imhist(I);title('原始圖片直方圖'); axis([0 255 0 4000]); [M,N]=size(I); %將影象的行列賦值給M,N t=4; %分塊大小
%% 原始圖片資訊熵 T1=imhist(I); %統計影象灰度值從0~255的分佈情況,存至T1 S1=sum(T1); %計算整幅影象的灰度值 xxs1=0; for i=1:256 pp1=T1(i)/S1; %每個灰度值佔比,即每個灰度值的概率 if pp1~=0 xxs1=xxs1-pp1*log2(pp1); end end
%% 原始影象相鄰畫素相關性分析 %{ 先隨機在0~M-1行和0~N-1列選中1000個畫素點, 計算水平相關性時,選擇每個點的相鄰的右邊的點; 計算垂直相關性時,選擇每個點的相鄰的下方的點; 計算對角線相關性時,選擇每個點的相鄰的右下方的點。 %} NN=1000; %隨機取1000對畫素點 x1=ceil(rand(1,NN)(M-1)); %生成1000個1~M-1的隨機整數作為行 y1=ceil(rand(1,NN)(N-1)); %生成1000個1~N-1的隨機整數作為列 EX1=0;EY1_SP=0;DX1=0;DY1_SP=0;COVXY1_SP=0; %計算水平相關性時需要的變數 EY1_CZ=0;DY1_CZ=0;COVXY1_CZ=0; %垂直 EY1_DJX=0;DY1_DJX=0;COVXY1_DJX=0; %對角線 I=double(I); for i=1:NN %第一個畫素點的E,水平、垂直、對角線時計算得出的第一個畫素點的E相同,統一用EX1表示 EX1=EX1+I(x1(i),y1(i)); %第二個畫素點的E,水平、垂直、對角線的E分別對應EY1_SP、EY1_CZ、EY1_DJX EY1_SP=EY1_SP+I(x1(i),y1(i)+1); EY1_CZ=EY1_CZ+I(x1(i)+1,y1(i)); EY1_DJX=EY1_DJX+I(x1(i)+1,y1(i)+1); end %統一在迴圈外除以畫素點對數1000,可減少運算次數 EX1=EX1/NN; EY1_SP=EY1_SP/NN; EY1_CZ=EY1_CZ/NN; EY1_DJX=EY1_DJX/NN; for i=1:NN %第一個畫素點的D,水平、垂直、對角線時計算得出第一個畫素點的D相同,統一用DX表示 DX1=DX1+(I(x1(i),y1(i))-EX1)^2; %第二個畫素點的D,水平、垂直、對角線的E分別對應DY1_SP、DY1_CZ、DY1_DJX DY1_SP=DY1_SP+(I(x1(i),y1(i)+1)-EY1_SP)^2; DY1_CZ=DY1_CZ+(I(x1(i)+1,y1(i))-EY1_CZ)^2; DY1_DJX=DY1_DJX+(I(x1(i)+1,y1(i)+1)-EY1_DJX)^2; %兩個相鄰畫素點相關函式的計算,水平、垂直、對角線 COVXY1_SP=COVXY1_SP+(I(x1(i),y1(i))-EX1)(I(x1(i),y1(i)+1)-EY1_SP); COVXY1_CZ=COVXY1_CZ+(I(x1(i),y1(i))-EX1)(I(x1(i)+1,y1(i))-EY1_CZ); COVXY1_DJX=COVXY1_DJX+(I(x1(i),y1(i))-EX1)(I(x1(i)+1,y1(i)+1)-EY1_DJX); end %統一在迴圈外除以畫素點對數1000,可減少運算次數 DX1=DX1/NN; DY1_SP=DY1_SP/NN; DY1_CZ=DY1_CZ/NN; DY1_DJX=DY1_DJX/NN; COVXY1_SP=COVXY1_SP/NN; COVXY1_CZ=COVXY1_CZ/NN; COVXY1_DJX=COVXY1_DJX/NN; %水平、垂直、對角線的相關性 RXY1_SP=COVXY1_SP/sqrt(DX1DY1_SP); RXY1_CZ=COVXY1_CZ/sqrt(DX1DY1_CZ); RXY1_DJX=COVXY1_DJX/sqrt(DX1DY1_DJX);
%% 1.補零 %將影象的行列數都補成可以被t整除的數,t為分塊的大小。 M1=mod(M,t); N1=mod(N,t); if M1~=0 I(M+1:M+t-M1,:)=0; end if N1~=0 I(:,N+1:N+t-N1)=0; end [M,N]=size(I); %補零後的行數和列數 SUM=M*N;
%% 2.產生Logistic混沌序列 u=3.99; %Logistic引數μ,自定為3.99 x0=sum(I(:))/(255SUM); %計算得出Logistic初值x0 x0=floor(x010^4)/10^4; %保留4位小數 p=zeros(1,SUM+1000); %預分配記憶體 p(1)=x0; for i=1:SUM+999 %進行SUM+999次迴圈,共得到SUM+1000點(包括初值) p(i+1)=up(i)(1-p(i)); end p=p(1001:length(p)); %去除前1000點,獲得更好的隨機性
%% 3.將p序列變換到0~255範圍內整數,轉換成MN的二維矩陣R p=mod(ceil(p10^3),256); R=reshape(p,N,M)'; %轉成M行N列的隨機矩陣R
%% 4.求解Chen氏超混沌系統
%求四個初值X0,Y0,Z0,H0
r=(M/t)(N/t); %r為分塊個數
%求出四個初值
X0=sum(sum(bitand(I,3)))/(3SUM);
Y0=sum(sum(bitand(I,12)/4))/(3SUM);
Z0=sum(sum(bitand(I,48)/16))/(3SUM);
H0=sum(sum(bitand(I,192)/64))/(3SUM);
%保留四位小數
X0=floor(X010^4)/10^4;
Y0=floor(Y010^4)/10^4;
Z0=floor(Z010^4)/10^4;
H0=floor(H0*10^4)/10^4;
%根據初值,求解Chen氏超混沌系統,得到四個混沌序列
A=chen_output(X0,Y0,Z0,H0,r);
X=A(:,1);
X=X(1502:length(X)); %去除前1501項,獲得更好的隨機性(求解陳氏系統的子函式多計算了1500點)
Y=A(:,2);
Y=Y(1502:length(Y));
Z=A(:,3);
Z=Z(1502:length(Z));
H=A(:,4);
H=H(1502:length(H));
%% 5.DNA編碼
%X,Y分別決定I和R的DNA編碼方式,有8種,1~8
%Z決定運算方式,有3種,0~2,0表示加,1表示減,2表示異或
%H表示DNA解碼方式,有8種,1~8
X=mod(floor(X10^4),8)+1;
Y=mod(floor(Y10^4),8)+1;
Z=mod(floor(Z10^4),3);
H=mod(floor(H10^4),8)+1;
e=N/t; %e表示每一行可以分為多少塊
Q1=DNA_bian(fenkuai(t,I,1),X(1));
Q2=DNA_bian(fenkuai(t,R,1),Y(1));
Q_last=DNA_yunsuan(Q1,Q2,Z(1));
Q(1:t,1:t)=DNA_jie(Q_last,H(1));
for i=2:r
Q1=DNA_bian(fenkuai(t,I,i),X(i)); %對原始影象每一個分塊按X對應的序號進行DNA編碼
Q2=DNA_bian(fenkuai(t,R,i),Y(i)); %對R的每一個分塊按Y對應的序號進行DNA編碼
Q3=DNA_yunsuan(Q1,Q2,Z(i)); %對上面兩個編碼好的塊按Z對應的序號進行DNA運算
Q4=DNA_yunsuan(Q3,Q_last,Z(i)); %運算結果在和前一塊按Z對應的序號再一次進行運算,稱為擴散
Q_last=Q4;
xx=floor(i/e)+1;
yy=mod(i,e);
if yy==0
xx=xx-1;
yy=e;
end
Q((xx-1)t+1:xxt,(yy-1)t+1:yyt)=DNA_jie(Q4,H(i)); %將每一塊合併成完整的圖Q
end
Q=uint8(Q);
imwrite(Q,'加密後的lena.bmp','bmp');
figure;imshow(Q);title('加密後圖片');
figure;imhist(Q);title('加密後直方圖');
axis([0 255 0 2000]);
%% 加密後資訊熵 T2=imhist(Q); S2=sum(T2); xxs2=0; for i=1:256 pp2=T2(i)/S2; if pp2~=0 xxs2=xxs2-pp2*log2(pp2); end end
%% 加密影象相鄰影象相關性分析 %{ 先隨機在0~M-1行和0~N-1列選中1000個畫素點, 計算水平相關性時,選擇每個點的相鄰的右邊的點; 計算垂直相關性時,選擇每個點的相鄰的下方的點; 計算對角線相關性時,選擇每個點的相鄰的右下方的點。 %} Q=double(Q); EX2=0;EY2_SP=0;DX2=0;DY2_SP=0;COVXY2_SP=0; %水平 EY2_CZ=0;DY2_CZ=0;COVXY2_CZ=0; %垂直 EY2_DJX=0;DY2_DJX=0;COVXY2_DJX=0; %對角線 for i=1:NN %第一個畫素點的E,水平、垂直、對角線時計算得出的第一個畫素點的E相同,統一用EX2表示 EX2=EX2+Q(x1(i),y1(i)); %第二個畫素點的E,水平、垂直、對角線的E分別對應EY2_SP、EY2_CZ、EY2_DJX EY2_SP=EY2_SP+Q(x1(i),y1(i)+1); EY2_CZ=EY2_CZ+Q(x1(i)+1,y1(i)); EY2_DJX=EY2_DJX+Q(x1(i)+1,y1(i)+1); end %統一在迴圈外除以畫素點對數1000,可減少運算次數 EX2=EX2/NN; EY2_SP=EY2_SP/NN; EY2_CZ=EY2_CZ/NN; EY2_DJX=EY2_DJX/NN; for i=1:NN %第一個畫素點的D,水平、垂直、對角線時計算得出第一個畫素點的D相同,統一用DX2表示 DX2=DX2+(Q(x1(i),y1(i))-EX2)^2; %第二個畫素點的D,水平、垂直、對角線的E分別對應DY2_SP、DY2_CZ、DY2_DJX DY2_SP=DY2_SP+(Q(x1(i),y1(i)+1)-EY2_SP)^2; DY2_CZ=DY2_CZ+(Q(x1(i)+1,y1(i))-EY2_CZ)^2; DY2_DJX=DY2_DJX+(Q(x1(i)+1,y1(i)+1)-EY2_DJX)^2; %兩個相鄰畫素點相關函式的計算,水平、垂直、對角線 COVXY2_SP=COVXY2_SP+(Q(x1(i),y1(i))-EX2)(Q(x1(i),y1(i)+1)-EY2_SP); COVXY2_CZ=COVXY2_CZ+(Q(x1(i),y1(i))-EX2)(Q(x1(i)+1,y1(i))-EY2_CZ); COVXY2_DJX=COVXY2_DJX+(Q(x1(i),y1(i))-EX2)(Q(x1(i)+1,y1(i)+1)-EY2_DJX); end %統一在迴圈外除以畫素點對數1000,可減少運算次數 DX2=DX2/NN; DY2_SP=DY2_SP/NN; DY2_CZ=DY2_CZ/NN; DY2_DJX=DY2_DJX/NN; COVXY2_SP=COVXY2_SP/NN; COVXY2_CZ=COVXY2_CZ/NN; COVXY2_DJX=COVXY2_DJX/NN; %水平、垂直、對角線的相關性 RXY2_SP=COVXY2_SP/sqrt(DX2DY2_SP); RXY2_CZ=COVXY2_CZ/sqrt(DX2DY2_CZ); RXY2_DJX=COVXY2_DJX/sqrt(DX2DY2_DJX);
%% 輸出資料資訊
disp('加密成功');
disp(['金鑰1:μ=',num2str(u),' 金鑰2:x0=',num2str(x0),' 金鑰3:x(0)=',num2str(X0)]);
disp(['金鑰4:y(0)=',num2str(Y0),' 金鑰2:z(0)=',num2str(Z0),' 金鑰3:h(0)=',num2str(H0)]);
disp(['原始圖片資訊熵=',num2str(xxs1),' 加密後圖片資訊熵=',num2str(xxs2)]);
disp(['原始圖片相關性:',' 水平相關性=',num2str(RXY1_SP),' 垂直相關性=',num2str(RXY1_CZ),' 對角線相關性=',num2str(RXY1_DJX)]);
disp(['加密圖片相關性:',' 水平相關性=',num2str(RXY2_SP),' 垂直相關性=',num2str(RXY2_CZ),' 對角線相關性=',num2str(RXY2_DJX)]);
```
三、執行結果
四、備註
版本:2014a
- 【路徑規劃】基於matlab GUI改進的DWA演算法機器人靜態避障路徑規劃【含Matlab原始碼 678期】
- 【目標檢測】基於matlab GUI差分法運動目標檢測【含Matlab原始碼 1284期】
- 【交通預測】基於matlab GUI交通預測四階段法交通分配【含Matlab原始碼 1140期】
- 【路徑規劃】基於matalb遺傳演算法機器人柵格地圖路徑規劃【含Matlab原始碼 022期】
- 【路徑規劃】基於matlab改進的人工勢場演算法機器人避障路徑規劃【含Matlab原始碼 1151期】
- 【飛行器】基於matlab多源資訊融合演算法多旋翼無人機組合導航系統【含Matlab原始碼 1267期】
- 【無人機】基於matlab無人機追蹤軌跡【含Matlab原始碼 1152期】
- 【影象加密】基於matlab混沌演算法影象加密解密【含Matlab原始碼 1218期】
- 【影象檢測】基於matlab GUI比值 歸一化 相關係數遙感影象【含Matlab原始碼 737期】
- 【影象加密】基於matlab混沌系統圖像加密【含Matlab原始碼 1190期】
- 【影象分類】基於matlab極限學習分類器對遙感影象分類【含Matlab原始碼 150期】
- 【影象增強】基於matlab GUI暗通道影象去霧【含Matlab原始碼 740期】
- 【優化求解】基於matlab差分進化演算法求解函式極值問題【含Matlab原始碼 1199期】
- 【身份證識別】基於matlab GUI身份證號碼識別【含Matlab原始碼 014期】
- 【三維路徑規劃】基於matlab RRT演算法無人機路徑規劃【含Matlab原始碼 155期】
- 【優化求解】基於matlab GUI模擬退火演算法求解全域性最大值最小值問題【含Matlab原始碼 1242期】
- 【優化充電】基於matlab蒙特卡洛演算法求解電動汽車充電優化問題【含Matlab原始碼 1164期】
- 【定位問題】基於matlab GUI SLAM模擬地圖構建和定位【含Matlab原始碼 1120期】
- 【水果識別分類】基於matlab形態學水果識別分類【含Matlab原始碼 1132期】
- 【數學建模】基於matlab UKF腳踏車狀態估計【含Matlab原始碼 1111期】