一、Arnold置乱概述

  Arnold变换是俄国数学家弗拉基米尔·阿诺德(Vladimir Igorevich Arnold)提出,Arnold将其应用在遍历理论研究中。由于Arnold本人最初对一张猫的图片进行了此种变换,因此它又被称为猫脸变换(cat映射)。Cat映射可以把图像中各像素点的位置进行置换,使其达到加密的目的,多应用在多媒体混沌加密中。

  Arnold置乱是一种数字图像处理技术,通过改变图像像素的排列顺序来产生视觉上的扭曲和变形效果。该技术主要应用于图像加密和保护,也可以用于生成艺术效果或增加图像的复杂度。

  Arnold置乱的原理基于置换群的概念。对于一个n×n的图像,可以将其视为一个由n²个像素组成的向量。Arnold置乱通过一系列置换操作来改变这些向量的排列顺序,从而产生不同的视觉效果。

  具体来说,Arnold置乱的操作是将每个像素坐标(x, y)进行置换操作,得到新的坐标(x', y')。置换操作的具体方法如下:

    x' = (ax + y) mod n y' = (bx + (a*b+1)*y) mod n

  其中,a和b是两个置乱参数,n是图像大小。上述公式可以理解为将(x, y)映射到了一个新的坐标(x', y')。通过反复进行这样的置换操作,可以将图像像素的排列顺序进行混乱,从而产生视觉上的扭曲和变形效果。

  值得注意的是,Arnold置乱是一种可逆操作,也就是说可以通过相反的操作将图像恢复为原始状态。具体来说,如果知道了置乱参数a和b以及进行置乱的迭代次数n,就可以对图像进行反向置乱操作,从而得到原始的图像。

  在实际应用中,Arnold置乱常常被用于数字水印、图像加密等领域。通过对图像进行多次Arnold置乱操作,可以使得图像的像素排列变得非常复杂和随机,从而增加了图像的安全性和保密性。同时,Arnold置乱也可以用于生成艺术效果,例如在数字艺术中用于产生视觉上的扭曲和变形效果。

二、步骤

  Arnold置乱的具体步骤如下:

  1. 选择置乱参数a和b:Arnold置乱的第一步是选择两个置乱参数a和b,这两个参数是用来控制像素排列顺序的。一般情况下,选择两个互质的正整数作为置乱参数,例如a=3,b=5。

  2. 将图像转换为矩阵:将要加密的图像转换为一个n×n的矩阵,其中n为矩阵的行数和列数。如果图像大小不是n的整数倍,则可以在图像边缘进行填充或截断操作。

  3. 进行置乱操作:对于图像矩阵中的每个像素坐标(x, y),使用下面的公式进行置乱操作:

    x' = (ax + y) mod n y' = (bx + (a*b+1)*y) mod n

    其中,(x', y')就是置乱后的像素坐标。这个过程就是将图像像素的位置进行混乱和扭曲。

  4. 重复置乱操作:对于置乱后的像素坐标(x', y'),再次使用上述公式进行置乱操作,得到新的像素坐标(x'', y'')。重复进行这样的操作,直到达到预设的置乱次数。

  5. 将置乱后的像素矩阵转换回图像:将置乱后的像素矩阵重新转换为图像,并保存加密后的图像文件。如果需要对图像进行解密,则需要进行相反的置乱操作。

三、代码实现

1.MATLAB实现置乱

% 定义置乱参数
a = 3;
b = 5;
t = 512; % 加载要置乱的图像
img = imread('Lena.png'); % 将图像转换为灰度图像
img_gray = rgb2gray(img); % 将灰度图像转换为矩阵
img_matrix = double(img_gray); % 获取矩阵的行数和列数
[n, m] = size(img_matrix); % 对图像进行置乱操作
for k = 1:t % 设置置乱次数为10次
for i = 1:n
for j = 1:m
x = mod(a*i + j, n) + 1;
y = mod(b*i + (a*b+1)*j, n) + 1;
img_matrix(x, y) = img_gray(i, j);
end
end
end % 将置乱后的矩阵转换回图像
img_scrambled = uint8(img_matrix); % 输出Arnold置乱后的图像
imshow(img_scrambled); % 保存置乱后的图像
imwrite(img_scrambled, 'Lena_scrambled.jpg');

Code_01

% 读取原始图像并转换为灰度图像
img = imread('Lena.png');
img = rgb2gray(img); % 定义Arnold置乱的参数
n = 512;
a = 3;
b = 5; % 进行n次Arnold置乱迭代
for k = 1:n
% 将图像分成大小为n×n的块
blocks = mat2cell(img, repmat(n, 1, size(img, 1)/n), repmat(n, 1, size(img, 2)/n));
for i = 1:size(blocks, 1)
for j = 1:size(blocks, 2)
% 对于每个块,进行Arnold置乱操作
block = blocks{i,j};
[x, y] = meshgrid(1:n, 1:n);
x1 = mod(a*x + y, n) + 1;
y1 = mod(b*x + (a*b+1)*y, n) + 1;
idx = sub2ind([n, n], y1(:), x1(:));
block = reshape(block(idx), n, n);
blocks{i,j} = block;
end
end
% 合并所有块并更新图像
img = cell2mat(blocks);
end % 输出Arnold置乱后的图像
imshow(img);

Code_02

2.MATLAB实现逆置乱

clear all;
clc; % 读取图片,根据Arnold变换的条件,图像必须是正方形
img=imread('Lena.bmp'); % 当只有一个输出参数时,返回一个行向量,该行向量的第一个元素时矩阵的行数,第二个元素是矩阵的列数。
mysize=size(img); if numel(mysize)>2%如果输入是彩色图像
img=rgb2gray(img); %将彩色到灰度图像的转换
fprintf("图像为彩色图\n");
else
fprintf("图像为灰度图\n");
end imshow(img,[])
title('彩色原图的灰度图'); figure(2)
imhist(img) %原图的直方图统计 %如果输入的不是正方形图像,则打印如下
[h,w]=size(img);
if h>w
img = imresize(img, [w w]);
fprintf("图像长宽不一样,图像可能失真\r");
end
if h<w
img = imresize(img, [h h]);
fprintf("图像长宽不一样,图像可能失真");
end
[h,w]=size(img); % 置乱与逆置乱必须采用共同参数的时候,就相当于密码,才能解密,让图像复原
% 迭代次数
n=10;
a=1;b=1;
N=h;%N代表图像宽高,宽高要一样 %% 置乱操作
imgnnn=zeros(h,w);
for i=1:n
for y=1:h
for x=1:w
xx=mod((x-1)+b*(y-1),N)+1; %mod取余操作,(a,b)就是a除以b的余数
yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1;
imgnnn(yy,xx)=img(y,x);
end
end
img=imgnnn;
end
imgnnn = uint8(imgnnn); figure(3)
imshow(img,[])%置乱后的图片
title('置乱后的图片 a=1;b=1,n=10');
imwrite (imgnnn,'置乱后的图片.bmp'); %生成图像保存功能 %% 逆置乱复原
img2=imread('置乱后的图片.bmp');%读取置乱图片
for i=1:n
for y=1:h
for x=1:w
xx=mod((a*b+1)*(x-1)-b*(y-1),N)+1;%matlab索引中不能是0,要从1开始
yy=mod(-a*(x-1)+(y-1),N)+1 ;
imgnnn(yy,xx)=img2(y,x);
end
end
img2=imgnnn;
end
imgnnn = uint8(imgnnn);
figure(4)
imshow(imgnnn,[])
title('逆置乱的复原图片');
imwrite(imgnnn,'逆置乱的复原图片.bmp');%生成图像保存功能

Code_03

  在上面的代码中,我们首先定义了置乱参数a和b,然后加载了一张名为lena.jpg的图像,并将其转换为灰度图像。接下来,我们将灰度图像转换为一个n×n的矩阵,然后使用两重循环对每个像素进行置乱操作。在置乱操作中,我们使用了上面描述的公式进行像素坐标的计算和调换。最后,我们将置乱后的矩阵再次转换为图像,并保存到名为lena_scrambled.jpg的文件中。

四、二维Arnold置乱

二维Arnold置乱是一种将二维图像进行混沌置乱的方法,与一维Arnold置乱类似,它也是通过改变像素坐标的排列顺序来实现图像混沌化的。

二维Arnold置乱的具体步骤如下:

  1. 选择置乱参数a和b:同样,二维Arnold置乱的第一步是选择两个置乱参数a和b,这两个参数是用来控制像素排列顺序的。一般情况下,选择两个互质的正整数作为置乱参数,例如a=3,b=5。

  2. 将图像转换为矩阵:同样地,将要加密的图像转换为一个n×n的矩阵,其中n为矩阵的行数和列数。

  3. 进行置乱操作:对于图像矩阵中的每个像素坐标(x, y),使用下面的公式进行置乱操作:

    x' = (ax + y) mod n y' = (bx + (a*b+1)*y) mod n

    其中,(x', y')就是置乱后的像素坐标。这个过程就是将图像像素的位置进行混乱和扭曲。

  4. 重复置乱操作:对于置乱后的像素坐标(x', y'),再次使用上述公式进行置乱操作,得到新的像素坐标(x'', y'')。重复进行这样的操作,直到达到预设的置乱次数。

  5. 将置乱后的像素矩阵转换回图像:将置乱后的像素矩阵重新转换为图像,并保存加密后的图像文件。如果需要对图像进行解密,则需要进行相反的置乱操作。

总之,二维Arnold置乱是一种可靠的图像混沌化方法,它可以增强图像的安全性和保密性。

Arnold置乱的更多相关文章

  1. matlab练习程序(Arnold图像置乱)

    自从上次写了Hilbert图像置乱之后,就对图像置乱研究了一下,发现这里面也是有很多置乱算法的. Arnold也算一种比较主要的置乱算法,算法由以下变换公式产生: 这里a和b是参数,n是迭代次数,N是 ...

  2. 混沌数学之Arnold模型

    相关软件混沌数学之离散点集图形DEMO 相关代码: class ArnoldEquation : public DiscreteEquation { public: ArnoldEquation() ...

  3. Arnold变换(猫脸变换)

    Arnold变换是Arnold在遍历理论研究中提出的一种变换.由于Arnold本人最初对一张猫的图片进行了此种变换,因此它又被称为猫脸变换.Arnold变换可以对图像进行置乱,使得原本有意义的图像变成 ...

  4. jcFeather For Arnold

    jcFeather 现在可以支持Arnold了,可以用Arnold来贴图方式渲染jcFeather的刷出的多边形羽毛. jcFeather 自带笔刷刷羽毛多边形,再配上一个Arnold shader ...

  5. Arnold AtArray API Test

    #include <ai.h> #include <iostream> #include <stdio.h> #include <vector> #in ...

  6. renderman、arnold及全局光照

    走马观花看了一些实现全局光(global illumination)的文章,都是非实时电影级的.的确可以分为两个阵营,一是pixar的renderman中常用的reyes+点云,感觉pixar一路走来 ...

  7. 转载-V.I.Arnold, beyond a mathematician

    转自-http://blog.renren.com/blog/248100754/471276636 在AMS的首页上找到了三条讣告,依次是V.I.Arnold(1937-2010),W.Rudin( ...

  8. Arnold+Shave 渲染毛发

    Arnold是一款基于真实物理光照算法和光线追踪算法的照片级渲染器,参与过多部好莱坞大片的制作,公司官网是:www.solidangle.com,官网上有很多效果图: 这里自己用一个球体测试了一下效果 ...

  9. FisherYates费雪耶兹随机置乱算法

    public class FisherYates { public static void main(String[] args) { int[] arr = new int[10]; // 初始有序 ...

  10. matlab练习程序(Hilbert图像置乱)

    正好刚写了Hibert生成曲线,不如再加一篇应用的程序. 关于Hilbert图像置乱,我在网上搜的应用领域主要集中在数字水印和图像加密上,而这两个领域我都没怎么接触过. 大部分的图像置乱都是如下图的置 ...

随机推荐

  1. Linux子系统之【内存管理】

    1.内存管理的意义? 内存是进程运行的地方,相当于是战场.完善的机制能让进程多快好省地运行. 2.原始内存管理是怎么样的? 简陋(直接运行在物理内存上).不安全(无隔离,无权限) 缺点:容易出错,进程 ...

  2. springboot后端接收不到前端传来的表单值

    为啥接收不到 因为传来的字段值太大了,springboot默认启动依赖tomcat,tomcat默认接收表单值最大为2MB,将server.tomcat.max-http-form-post-size ...

  3. element-ui el-tree 内容过多出现横向滚动条

    /deep/ .el-tree>.el-tree-node { display: inline-block; min-width: 100%;}

  4. K8S 性能优化 - OS sysctl 调优

    前言 K8S 性能优化系列文章,本文为第一篇:OS sysctl 性能优化参数最佳实践. 参数一览 sysctl 调优参数一览 # Kubernetes Settings vm.max_map_cou ...

  5. Java笔记第十弹

    网络编程三要素 1.IP地址--设备的标识 2.端口--应用程序的标识 3.协议--常见的协议有UDP协议和TCP协议 IP地址 1.IPv4(二进制数据) 2.IPv6 常用命令: ipconfig ...

  6. Python学习笔记--图像的进一步学习

    演示地图的可视化的实现 示例: 设置全局选项 可以设置出不同的颜色,不会显得很干巴: 国内地图: 那么,我们应当如何找到相对应的颜色的编号呢? 基本步骤: 前往ab173.com网站 然后在,前端那里 ...

  7. 【LeetCode贪心#11】单调递增的数字(详解)

    单调递增的数字 力扣题目链接(opens new window) 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. (当且仅当每个相邻位数上的 ...

  8. C#实现的网易云音频下载器(白嫖)

    链接 下载点这里 主要是想白嫖音乐,但是java gui写的很复杂,python不会写,c#学的也是半吊子,大大佬们勿喷 经测试大部分音乐可以下载,部分会出现路径非法 form.cs的代码 using ...

  9. HDFS 组织架构

    一.HDFS 概述 HDFS 产生背景:随着数据量越来越多,一个系统存储不下所有的数据,那么就需要分配到多个操作系统的磁盘中进行存储,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就 ...

  10. 白嫖一个月的ES,完成了与MySQL的联动

    前言 <腾讯云 x Elasticsearch三周年>活动来了.文章写之前的思路是:在腾讯云服务器使用docker搭建ES.但是理想很丰满,显示很骨感,在操作过程中一波三折,最后还是含着泪 ...