数字水印 | Arnold 变换的 Python 代码实现(灰度图版)

效果

在这里插入图片描述

将彩色图转换为灰度图,并进行 A r n o l d \mathsf{Arnold} Arnold 置乱和还原。

代码

import cv2
import numpy as np
from matplotlib import pyplot as pltdef arnold(img, shuffle_times, a, b):r, c, d = img.shapeimg = img[:, :, 0]p = np.zeros((r, c), np.uint8)for s in range(shuffle_times):for i in range(r):for j in range(c):x = (i + b * j) % ry = (a * i + (a * b + 1) * j) % cp[x, y] = img[i, j]img = np.copy(p)return pdef de_arnold(img, shuffle_times, a, b):r, c = img.shapep = np.zeros((r, c), np.uint8)for s in range(shuffle_times):for i in range(r):for j in range(c):x = ((a * b + 1) * i - b * j) % ry = (- a * i + j) % cp[x, y] = img[i, j]img = np.copy(p)return pImg_path = 'white_bear.jpg'
Img = cv2.imread(Img_path)
Img = Img[:, :, [2, 1, 0]]Img_arnold = arnold(Img, 5, 2, 3)
Img_inverse_arnold = de_arnold(Img_arnold, 5, 2, 3)plt.subplot(1, 3, 1)
plt.title("original", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(Img, cmap='gray')plt.subplot(1, 3, 2)
plt.title("arnold", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(Img_arnold, cmap='gray')plt.subplot(1, 3, 3)
plt.title("de_arnold", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(Img_inverse_arnold, cmap='gray')plt.savefig('test.jpg', dpi=400, bbox_inches='tight')
plt.show()


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696945.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于光纤技术的新能源汽车电池安全监测--FOM²系统

为什么要进行动力电池包的温度监测? 新能源电动汽车的动力电池包的工作温度,不仅会影响电池包性能,而且直接关系到车辆安全。时有发生的新能源汽车电池包起火事件,对电池包、冷却系统以及电池管理系统(BMS&#xff09…

从编辑器角度来理解定义和声明

报错,在函数里面(包括int main函数)extern声明会和定义冲突 下面这种写法就很ok 静态变量的反汇编 #include<iostream> using namespace std; extern int c; int ma

C++常见十种排序方式

目录 前言 1、选择排序 介绍 参考代码 2、冒泡排序 介绍 参考代码 3、插入排序 介绍 参考代码 4、希尔排序 介绍 参考代码 5、快速排序 介绍 参考代码 6、并归排序 介绍 参考代码 7、堆排序 介绍 参考代码 8、基数排序 介绍 参考代码 9、计数排序 介绍 参考代…

半个小时搞懂STM32面经知识——DMA

1.DMA 1.1 什么是DMA&#xff1f; DMA传输将数据从一个地址空间复制到另一个地址空间&#xff0c;提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 CPU无时不刻的在处理着大量的事务&#xff0c;但有些事情却没有那么重要&#xff0c;比方说数据的复制和存储数…

5.13号模拟前端面试10问

1.介绍箭头函数和普通函数的区别 箭头函数和普通函数在JavaScript中有一些重要的区别。以下是关于这些区别的详细解释&#xff1a; 语法结构上的差异&#xff1a; 箭头函数使用更简洁的语法&#xff0c;它不需要使用function关键字&#xff0c;而是使用一个箭头&#xff08;…

AI大模型系列之七:Transformer架构讲解

目录 Transformer是什么&#xff1f; 输入模块结构&#xff1a; 编码器模块结构&#xff1a; 解码器模块: 输出模块结构&#xff1a; Transformer核心思想是什么&#xff1f; Transformer的代码架构 自注意力机制是什么&#xff1f; 多头注意力有什么用&#xff1f; 前…

人工智能中的概率魔法:解锁不确定性的智慧之钥

在人工智能&#xff08;AI&#xff09;的广阔天地中&#xff0c;概率论以其独特的魅力&#xff0c;成为了连接现实世界与智能决策的桥梁。从语音识别到图像识别&#xff0c;从自然语言处理到机器翻译&#xff0c;从智能推荐到自动驾驶&#xff0c;概率论知识在这些领域中发挥着…

C++ 派生类的引入与特性

一 继承与派生 从上面的例子可以看出&#xff1a; 继承&#xff1a;一旦指定了某种事物父代的本质特征&#xff0c;那么它的子代将会自动具有哪些性质。这就是一种朴素的可重用的概念。 派生&#xff1a;而且子代可以拥有父代没有的特性&#xff0c;这是可扩充的概念。 1 C 的…

重大升级 | OpenSCA SaaS全面接入供应链安全情报!

结合社区用户反馈及研发小伙伴的积极探索&#xff0c; OpenSCA 项目组再次发力&#xff0c;SaaS版本重大升级啦&#xff01; 用户的需求是OpenSCA前进的动力&#xff0c;欢迎更多感兴趣的朋友们积极试用和反馈~ 更 新 内 容 1.全面接入云脉XSBOM供应链安全情报 2.强大的资产…

【kubernetes】容器编排平台的介绍

目录 前言 一、云原生知识 1、云原生要素 2、SRE&#xff08;Site Reliability Engineering&#xff09; 二、kubernetes 概述 1、kubernetes 概念 2、传统后端部署与k8s 的对比 2.1 传统部署 2.2 k8s的部署 3、为什么要用K8S 4、K8S解决的问题 5、K8S功能与特性 5…

CEETRON SDK 可为您的CAE应用程序提供5大优势!

开发CAE应用程序是一项资源密集型、复杂且耗时的工作。成功的开发人员会尽其所能&#xff0c;确保他们专注于让他们的产品、他们的新想法独一无二的东西。凭借CEETRON系列产品及其集成的工具&#xff0c;Tech Soft 3D提供了唯一支持预处理、求解和后处理工作流程的完整CAE组件技…

【挑战30天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1&#xff1a;下载MobaXterm选择适合你的版本 Stage 2&#xff1a;vagrant ssh 连接&#xff0c;开启ssh访问 Stage 2-1&#xff1a;su获取root账号权限,输入密码&#xff08;默认vagra…