当前位置:编程学习 > 网站相关 >>

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

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,[]); 
 
 \
补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,