因为犯懒,久未更新,抱歉!
接下来会在此篇文章中持续更一些常用的置乱算法,感兴趣的可以关注一下。
主要来源于网络再整理,基本亲测有效。
这部分的原理不明白的同学,可以去搜一下别的博主写的文章或者找相关论文阅读。看不懂代码的同学可以先研究一下注释,跑不通代码的同学可以先检查一下报错的问题是什么。其他问题可在评论区留言!
之前有私信问过我直接复制粘贴到matlab怎么跑不通,注意这里提供的是函数,需要你自己导入相关变量后去引用才能跑通!这部分不懂的同学建议去借一本《MATLAB R2020a 完全自学一本通》或者《数字图像处理(MATLAB版)》,以学习一些matlab基础知识。
1、zigzag置乱
注意:只适用于行列相等的图。
正变换:
function B = Zigzag(A)
% zigzag正变换
[r,c] = size(A);
if r ~= c
error('input array should have equal number of rows and columns')
end
N = r;
len = N*N;
B = zeros(1,len); % zigzag排序后的数组
B(1) = A(1);
k = 1;
i = 1; j = 1; % 起始坐标
d = 1; % 排序的方向标示。值为1表示下一个元素在右上方向;值为-1表示下一个元素在左下方向
flag = 1; % 上下三角标示。值为1表示当前元素在上三角;值为0表示当前元素在下三角
while k < len
if flag == 1 % 当前元素为上三角
if i ~= 1 && j ~= 1 % 非边界元素
if d == 1 % 下一个元素在右上方向
i = i-1; j = j+1;
else % 下一个元素在左下方向
i = i+1; j = j-1;
end
else
if i == 1 % 上边界
if d == 1 % 需要变向
j = j+1; d = -1;
else % 不需要变向
i = i+1; j = j-1;
end
else
if j == 1 % 左边界
if d == 1 % 不需要变向
i = i-1; j = j+1;
else % 需要变向
i = i+1; d = 1;
end
end
end
end
else % 当前元素为下三角的时候
if i ~= N && j ~= N
if d == 1
i = i-1; j = j+1;
else
i = i+1; j = j-1;
end
else
if i == N
if d == 1
i = i-1; j = j+1;
else
j = j+1; d = 1;
end
else
if j == N
if d == 1
i = i+1; d = -1;
else
i = i+1; j = j-1;
end
end
end
end
end
if j == N % 若元素到达了右边界,说明上三角元素已经遍历完,开始遍历下三角元素
flag = 0;
end
k = k+1;
B(k) = A(i,j);
end
逆变换:
function B = iZigzag(A)
% zigzag逆变换
len = length(A);
N = sqrt(len);
if N ~= fix(N)
error('input array should have equal number of rows and columns')
end
B = zeros(N,N); % zigzag排序后的数组
B(1) = A(1);
k = 1;
i = 1; j = 1; % 起始坐标
d = 1; % 排序的方向标示。值为1表示下一个元素在右上方向;值为-1表示下一个元素在左下方向
flag = 1; % 上下三角标示。值为1表示当前元素在上三角;值为0表示当前元素在下三角
while k<len
if flag == 1 % 当前元素为上三角
if i ~= 1 && j ~= 1 % 非边界元素
if d == 1 % 下一个元素在右上方向
i = i-1; j = j+1;
else % 下一个元素在左下方向
i = i+1; j = j-1;
end
else
if i == 1 % 上边界
if d == 1 % 需要变向
j = j+1; d = -1;
else % 不需要变向
i = i+1; j = j-1;
end
else
if j == 1 % 左边界
if d == 1 % 不需要变向
i = i-1; j = j+1;
else % 需要变向
i = i+1; d = 1;
end
end
end
end
else % 当前元素为下三角的时候
if i ~= N && j ~= N
if d == 1
i = i-1; j = j+1;
else
i = i+1; j = j-1;
end
else
if i == N
if d == 1
i = i-1; j = j+1;
else
j = j+1; d = 1;
end
else
if j == N
if d == 1
i = i+1; d = -1;
else
i = i+1; j = j-1;
end
end
end
end
end
if j == N % 若元素到达了右边界,说明上三角元素已经遍历完,开始遍历下三角元素
flag = 0;
end
k = k+1;
B(i,j) = A(k);
end
|