您的位置:首页 > 其它

混沌系统加密图像(通过行和列上进行循环移位实现)

2012-03-04 20:41 399 查看
function chaoticDemoForRowAndColumnChange
%应用混沌序列对数字图像的行和列置乱
%针对每一行循环若干次次,由混沌序列控制每一行循环的位数
% 同样需要针对每一列循环若干次
%程序设计:李立宗
%2012年3月3日
% http://blog.csdn.net/superdont % 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,[]);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: