
% 使用混沌映射生成密钥
seed = input('请输入初始种子:');
n = input('请输入生成的随机数个数:');
x = zeros(n,1);
y = zeros(n,1);
z = zeros(n,1);
x(1) = seed(1);
y(1) = seed(2);
z(1) = seed(3);
for i = 2:n
x(i) = 1 - 2*x(i-1)^2 + 0.1*y(i-1);
y(i) = x(i-1);
z(i) = 0.5 - 0.5*z(i-1);
end
% 将生成的密钥分成两部分,一部分用于像素置乱,一部分用于像素替换
key1 = [x y z];
key2 = randperm(n);
% 读入原始图像
img = imread('wpz.jpg');
% 将原始图像分割成多个小块
blockSize = input('请输入每个小块的大小:');
[h,w] = size(img);
hNum = floor(h / blockSize);
wNum = floor(w / blockSize);
blocks = cell(hNum, wNum);
for i = 1:hNum
for j = 1:wNum
blocks{i,j} = img((i-1)*blockSize+1:i*blockSize,(j-1)*blockSize+1:j*blockSize);
end
end
% 遍历每个小块,进行像素置乱和像素替换
for i = 1:hNum
for j = 1:wNum
% 像素置乱
block = blocks{i,j};
[m,n] = size(block);
% 使用初始种子和混沌映射生成随机数,用随机数进行像素位置的置换
r = key1(i*j,:);
r = (r - min(r)) / (max(r) - min(r));
r = floor((n^2-1)*r) + 1;
r = [1 r];
for k = n:-1:2
r(k) = r(k) + mod(r(k-1)-1,n-k+1);
temp = r(k);
r(k) = r(k-1);
r(k-1) = temp;
end
% 进行像素位置的置换
block = block(:,r);
% 像素替换
% 将每个小块的像素值进行替换,替换规则由密钥生成
block = mod(block + key2(i*j), 256);
% 将处理后的小块更新到blocks中
blocks{i,j} = block;
end
end