混沌系统加密图像(通过行和列上进行循环移位实现)
function chaoticDemoForRowAndColumnChange%应用混沌序列对数字图像的行和列置乱
%针对每一行循环若干次次,由混沌序列控制每一行循环的位数
% 同样需要针对每一列循环若干次
%程序设计:李立宗
%2012年3月3日
% lilizong【at】Gmail
clear;
clc;
[filename pathname]=uigetfile('*.bmp;*.tiff;*.tif', '读入图像');
os=[pathname filename];
%os原始图像的路径
o=imread(os);
% figure,imshow(o);
%计算原始图像的大小
[m n]=size(o);
% 建立两个数组一个控制行上的循环移位,另外一个控制列上的循环移位
%%%%%%%%%%%%11111111行循环移位代码1111111111111111%%%%%%%%%%%%%%%%%%
% 首先建立控制行方向上循环移位的数组
keyRow=5; %列方向上循环的周期
rowChaotic=zeros(keyRow,m); %注意,行上的循环需要的次数是每行一次,因此需要m次
bitRowChaotic=zeros(keyRow,m);
rowChaotic(1)=0.539;
for i=2:keyRow*m
rowChaotic(i)=1-2*rowChaotic(i-1)*rowChaotic(i-1);
bitRowChaotic(i)=rem(round(rowChaotic(i)*100000),n);
%bl内元素具体控制循环的位数,不会大于列数n,故次数选择n即可
end
%首先,在行方向上加密图像
oRowSec=o;
for rtimes=1:keyRow %控制整体要对所有行进行位循环的次数
for i=1:m %控制位循环的行号,具体对哪一行进行位循环
% i
oRowSec(i,:)=circshift(oRowSec(i,:),[0 bitRowChaotic(rtimes,i)]);
% circshift函数中第二个参数中,有两个参数,一个控制行,一个控制列
% 现在只要对列操作,故将其设置为[0 bl(i)].
end
end
%%%%%%%%%%%%11111111行循环移位代码1111111111111111%%%%%%%%%%%%%%%%%%
% %%%%%%%%2222222测试代码,看看能不能通过单独的行测试2222222222%%%%%%%%%%%%%%%%%%
% oResultForRow=oRowSec;
% for rtimes=1:keyRow %控制整体要对所有行进行位循环的次数
% for i=1:m
% oResultForRow(i,:)=circshift(oResultForRow(i,:),[0 n-bitRowChaotic(rtimes,i)]);
% end
% end
% figure,imshow(o);
% figure,imshow(oRowSec,[]);
% figure,imshow(oResultForRow,[]);
% %%%%%%%%2222222测试代码,看看能不能通过单独的行测试2222222222%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%3333333333333列上的循环移位代码33333333333%%%%%%%%%%%%%%%%%%
% 其次,建立控制列方向上循环移位的数组
keyColumn=5; %列方向上循环的周期
columnChaotic=zeros(keyColumn,n);
%注意,列上的移位需要的次数是每列一次,共有n列,因此需要n次
bitColumnChaotic=zeros(keyColumn,n); %用于存储量化后的数列
columnChaotic(1)=0.5399;
for i=2:keyColumn*n
columnChaotic(i)=1-2*columnChaotic(i-1)*columnChaotic(i-1);
bitColumnChaotic(i)=rem(round(columnChaotic(i)*100000),m);
%bl内元素具体控制循环的位数,不会大于行数m,故次数选择m即可
end
%在列方向上加密图像
% oRowSec=o;
oRowAndColumnSec=oRowSec;
for rtimes=1:keyColumn %控制整体要对所有列进行位循环的次数
for i=1:n %控制位循环的列号,具体对哪一列进行位循环
% i
oRowAndColumnSec(:,i)=circshift(oRowAndColumnSec(:,i),bitColumnChaotic(rtimes,i));
% circshift函数中第二个参数中,有两个参数,一个控制行,一个控制列
% 现在只要对列操作,故将其设置为[0 bl(i)].
end
end
%%%%%%%%%%%%%%%%%3333333333333列上的循环移位代码33333333333%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%444444列上的恢复代码,看看能不能通过单独的列测试4444444444%%%%%%%%%%%
% oResultForColumn=oRowAndColumnSec;
% for rtimes=1:keyColumn %控制整体要对所有行进行位循环的次数
% for i=1:n
% oResultForColumn(:,i)=circshift(oResultForColumn(:,i),m-bitColumnChaotic(rtimes,i));
% end
% end
% figure,imshow(o);
% figure,imshow(oRowAndColumnSec,[]);
% figure,imshow(oResultForColumn,[]);
%%%%%%%%%%%%%%%%444444列上的恢复代码,看看能不能通过单独的列测试4444444444%%%%%%%%%%%
%开始解密图像
% 首先在列上解密
oResultForColumn=oRowAndColumnSec;
for rtimes=1:keyColumn %控制整体要对所有行进行位循环的次数
for i=1:n
oResultForColumn(:,i)=circshift(oResultForColumn(:,i),m-bitColumnChaotic(rtimes,i));
end
end
%其次,解密行加密的图像,在行上解密
oResultForRow=oResultForColumn;
for rtimes=1:keyRow %控制整体要对所有行进行位循环的次数
for i=1:m
oResultForRow(i,:)=circshift(oResultForRow(i,:),[0 n-bitRowChaotic(rtimes,i)]);
end
end
figure,
subplot(1,3,1),imshow(o),title('原始图像');
subplot(1,3,2),imshow(oRowAndColumnSec,[]),title('加密图像');
subplot(1,3,3),imshow(oResultForRow,[]),title('解密图像');
%因为放在一个窗口内图像比较小,不便于测试,如下代码用于测试。
%figure,imshow(o);
%figure,imshow(oRowAndColumnSec,[]);
%figure,imshow(oResultForRow,[]);
补充:综合编程 , 安全编程 ,