Arnold置乱变换的代码实现与置乱度分析
1. 传统Arnold置乱变换算法简介
Arnold置乱变换(又称为cat映射)是一种基于古典密码体制的图像加密算法,本质上是对长宽相等的图像进行拉伸与折叠操作以改变空间中像素点的位置,从而破坏图像相邻像素点之间的相关性,它的安全性较低,易利用像素值统计特性攻击,常用作其它加密算法的预处理。
传统的Arnold置乱变换可表示为:
[xn+1yn+1]=[1112][xnyn]mod(N)\begin{bmatrix} x_{n+1} \\ y_{n+1} \end{bmatrix}= \begin{bmatrix} 1&1\\ 1&2 \end{bmatrix} \begin{bmatrix} x_n \\ y_n \end{bmatrix} mod(N)[xn+1yn+1]=[1112][xnyn]mod(N)
图像的恢复可表示为:
[xnyn]=[1112]−1[xn+1yn+1]mod(N)\begin{bmatrix} x_n \\ y_n \end{bmatrix}= \begin{bmatrix} 1&1\\ 1&2 \end{bmatrix}^{-1} \begin{bmatrix} x_{n+1} \\ y_{n+1} \end{bmatrix} mod(N)[xnyn]=[1112]−1[xn+1yn+1]mod(N)
2. 传统Arnold置乱变换的代码实现与置乱度分析
2.1 编程环境
- 编程语言:Python
- 包:cv2, matplotlib, numpy, math, time
2.2 代码实现
2.2.1 传统Arnold置乱变换
"""
function: 对图像进行r轮Arnold置乱变换,并录入每一轮变换后的图像数据信息
params: img: 输入的图片r: 置乱轮数length: 图像尺寸信息
return:data: 置乱变换后的图像数据信息(snr/time)
"""
def arnold(img, r, length):cnt = 0ori_img = np.copy(img)new_img = np.copy(img)snr = {}snr[0] = 100.0t = {}t[0] = 0data = {}start = time.time()while cnt <= r:for i in range(img.shape[0]):for j in range(img.shape[1]):new_i = (i + j) % lengthnew_j = (i + 2 * j) % lengthnew_img[new_i][new_j] = img[i][j] # 第cnt轮置乱变换的时间信息end = time.time()t[cnt] = end - startcnt = cnt + 1# 第cnt轮置乱变换的SNR值计算signal = np.sum(new_img) ** 2# print(signal)noise = (ori_img - new_img) ** 2noise = np.sum(noise)if noise != 0:snr[cnt] = 10 * math.log10(signal * 1.0 / noise)else:snr[cnt] = 100.0# print(snr[cnt])# cv2.imshow("image", new_img)# cv2.waitKey(50)print(cnt)img = np.copy(new_img)#置乱变换的相关信息录入data[0] = snrdata[1] = treturn data
2.2.2 传统Arnold置乱变换的置乱度分析
基于距离
设置乱前像素点坐标为(xn,yn)(x_n, y_n)(xn,yn),置乱后像素点坐标为(xn+1,yn+1)(x_{n+1}, y_{n+1})(xn+1,yn+1),则:像素点移动的距离为:
delta(x,y)=(xn+1−xn)2+(yn+1−yn)2delta(x,y)=\sqrt{(x_{n+1}-x_n)^2+(y_{n+1}-y_n)^2}delta(x,y)=(xn+1−xn)2+(yn+1−yn)2全体像素点移动距离的期望为:
E=1M∗N∑x=1M∑y=1Ndelta(x,y)E=\frac 1 {M*N}\sum_{x=1}^M\sum_{y=1}^Ndelta(x,y)E=M∗N1x=1∑My=1∑Ndelta(x,y)""" function: 计算基于距离的置乱度 params: r: 置乱轮数length: 图像尺寸信息 return:delta: 0~r次Arnold置乱变换后的置乱度 """ def calc_scrambling(r, length):cnt = 0delta = {}delta[0] = 0pos = np.ones((length, length))pos = init(pos, length)pos_r = np.copy(pos)while cnt <= r:s = 0.0# Arnold置乱变换for i in range(0, length):for j in range(0, length):new_i = (i + j) % lengthnew_j = (i + 2 * j) % lengthpos_r[new_i][new_j] = pos[i][j]cnt = cnt + 1# print(cnt)# 置乱度计算for i in range(1, length + 1):x = math.ceil(i / length * 1.0)y = i - length * math.floor(i / length * 1.0) - 1seq = np.where(pos == i)[0][0]xx = math.ceil(seq / length * 1.0)yy = seq - length * math.floor(seq / length * 1.0) - 1s += math.sqrt((x-xx) ** 2 + (y - yy) ** 2)# 置乱度信息录入delta[cnt] = s / (length * length)# print(delta)pos = np.copy(pos_r)return delta""" function: 初始化矩阵 params: matrix: 输入矩阵length: 矩阵尺寸 return:matrix: 初始化后的矩阵 """ def init(matrix, length):n = 1for i in range(0, length):for j in range(0, length):matrix[i][j] = nn = n + 1return matrix""" function: 绘制基于距离的置乱度折线图 params: d: 0~r次Arnold置乱变换后的置乱度 """ def paint_curve(d):plt.title("Scrambling")plt.ylabel("Average scrambling")plt.xlabel("Round")plt.grid(True)keys = d.keys()values = d.values()plt.plot(tuple(keys), tuple(values))plt.savefig("scrambling.png")plt.show()
基于均方信噪比
信噪比(SNR)表示的是信号与噪声之比,若设原始图像为I,经Arnold置乱后的图像为I’,则均方信噪比可表示为:
SNR=∑x=1M∑y=1NI′2(x,y)∑x=1M∑y=1N(I(x,y)−I′(x,y))2SNR=\cfrac {\sum_{x=1}^M\sum_{y=1}^NI'^2(x,y)}{\sum_{x=1}^M\sum_{y=1}^N(I(x,y)-I'(x,y))^2}SNR=∑x=1M∑y=1N(I(x,y)−I′(x,y))2∑x=1M∑y=1NI′2(x,y)""" function: 绘制图像信噪比折线图 params: snr: 0~r次Arnold置乱变换后的信噪比 """ def curve2(snr):plt.title("SNR")plt.ylabel("SNR/dB")plt.xlabel("Round")plt.grid(True)keys = snr.keys()values = snr.values()plt.plot(tuple(keys), tuple(values))plt.savefig("SNR.png")plt.show()
3. 参考文献
- 方毅,Arnold置乱变换图像加密算法研究[学位论文],2018
Arnold置乱变换的代码实现与置乱度分析相关推荐
- 素数判断的几种方法代码实现及其复杂度分析
素数判断的几种方法代码实现及其复杂度分析 原文链接:http://blog.csdn.net/infinitezhen/article/details/8961964 一. 朴素判断素数 根据素数 ...
- arnold函数 matlab_接再厉,发个Arnold置乱变换的matlab代码
再接再厉,发个Arnold置乱变换的matlab代码2008-05-05 21:30以下是代码,自已看吧..希望对于初学者有所帮助 function Arnold(Image,Frequency,cr ...
- 图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)
原文:图像滤镜艺术--编码基础(Photoshop基础变换的代码实现) 自从上一篇博客写完之后,到现在已经有段时间了,这段时间不是不想接着写,只是想做的更好了在写出来给大家看呵呵. 今天,我将给大家介 ...
- 文字color颜色渐变(可一直变换) - 代码篇
文字color颜色渐变(可一直变换) - 代码篇 一.应用场景 · 举例: https://www.iconfont.cn/ 站内的 [字体图标][如下图1所示] 某些客户要求的 "炫酷拽& ...
- x264 代码重点详解 详细分析
eg mplayer x264 代码重点详解 详细分析 分类: ffmpeg 2012-02-06 09:19 4229人阅读 评论(1) 收藏 举报 h.264codecflv优化initializ ...
- 2016年大数据Spark“蘑菇云”行动代码学习之AdClickedStreamingStats模块分析
2016年大数据Spark"蘑菇云"行动代码学习之AdClickedStreamingStats模块分析 系统背景:用户使用终端设备(IPAD.手机.浏览器)等登录系统,系 ...
- 使用工具Source Monitor测量您Java代码的环复杂度
代码的环复杂度(Cyclomatic complexity,有时也翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 来看看计算公式. 代码环 ...
- 如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity
代码的环复杂度(Cyclomatic complexity,有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 在软件测试的概念里, ...
- 动态分区分配算法代码_【代码】巩敦卫等TEVC论文:基于区间相似度分析的协同动态区间多目标进化优化算法...
分享代码:巩敦卫等TEVC论文:基于区间相似度分析的协同动态区间多目标进化优化算法. 说明:该代码基于Matlab2012a及Intlab5.5编写,对应文献:"Dunwei Gong, B ...
- 代码复杂度分析——时间、空间复杂度
最近练习算法题,又看了极客时间中的<数据结构与算法之美>写的真不错,于是总结一下关于复杂度的知识,代码和图片都是课程里面的.虽然是按课程写的,但是自己写一遍最好,否则看过就忘了. 数据结构 ...
最新文章
- 南通市交巡警支队同城异地容灾备份系统项目中标结果公告
- jdk版本 linux更改was_如何在 Linux 上安装 Java
- 性能php 教程,提高PHP性能效率的几个技巧
- [html] 如何在IOS下启用WebApp全屏模式?
- XCode8 App上传AppStore更新
- python 方向键控制代码_Python控制鼠标键盘代码实例
- 服务机器人占领智能安防哪些领域?
- webRTC之智能指针std::unique_ptr::reset()使用(十四)
- JavaScript项目中锁定npm依赖包版本
- 激光雷达(LiDAR)简介-森林资源调查应用
- SublimeText集成印象笔记插件简略步骤
- windows 10 ltsc 安装微软商店
- 自媒体/新媒体写作技巧
- 凌恩客户文章:16S全长鉴定癌症细胞组织特异性微生物谱
- SEO人员,为什么要做流量过滤,如何操作?
- win7 efi安装(个人心得)
- 发布3天获推荐10w+,视频号内容出现新玩法?
- nubia/努比亚Z5Sn(32GB) root教程_方法
- gohbase的使用
- 2020年美亚杯电子数据取证大赛-个人赛