第四章-图像加密与解密

2023-11-13

加密与加密原理

使用异或运算实现图像加密及解密功能。

异或运算规则(相同为0,不同为1)

  • 运算数相同,结果为0;运算数不同,结果为1
  • 任何数(0/1)与0异或,结果仍为自身
  • 任何数(0/1)与1异或,结果为另外一个数,即0变1, 1变0
  • 任何数和自身异或,结果为0

同理到图像加密解密

  • 加密过程:明文a与密钥b进行异或运算得到密文c
  • 解密过程:密文c与密钥b进行异或运算得到明文a

跑个代码

import cv2 as cv
import numpy as np

lena = cv.imread("lena.jpg")
row, colm,count = lena.shape
print(row)
print(colm)
key = np.random.randint(0, 256, size=[row, colm,count], dtype=np.uint8)
encryption = cv.bitwise_xor(lena, key)
decryption = cv.bitwise_xor(encryption, key)
cv.imshow("lena", lena)
cv.imshow("key", key)
cv.imshow("encryption",encryption)
cv.imshow("decryption",decryption)

cv.waitKey()
cv.destroyAllWindows()

运行如下:

脸部加密及解密

脸部加密及解密其实就是图像部分区域的加解密的过程。

人脸打码的功能更像是掩模+np异或运算的结合,脸部打码有2种方式,一种是通过掩模方式实现,另一种是通过ROI方式实现。

掩模方式

加密过程:

解密过程:

具体代码实现如下:

import cv2 as cv
import numpy as np

# 读取原始图
lena = cv.imread("lena.png", 0)
cv.imshow("lena", lena)
r, c = lena.shape
# 得到掩码模板
mask = np.zeros((r, c), dtype=np.uint8)
mask[220:400, 250:350] = 1

# 得到加密解密的密钥图像
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)

# ========================获取加密的脸===================
# step1 使用密钥key对原始图片lena进行加密
lenaXorKey = cv.bitwise_xor(lena, key)

# step2 获取已经加密的脸部位置信息(整个加密图像与mask做与运算)
encryptFace = cv.bitwise_and(lenaXorKey, mask * 255)

# step3 另外再对lena图像进行处理 通过使用 反mask,得到没有人脸信息的lena图像
noFace = cv.bitwise_and(lena, (1 - mask) * 255)

# step4 把获取的已经加密的只有人脸的图像加到被扣掉人脸信息的lena图像上,得到人脸加密的lena图像
maskFace = encryptFace + noFace

cv.imshow("maskFace", maskFace)
# ========================开始人脸解密===================
# step5 将脸部加密的lena与密钥key进行异或,这样人脸区域会解密,其他区域会被加密(不重要)
extractOriginal = cv.bitwise_xor(maskFace, key)

# step6 提取解密后的人脸,其他区域是0
extractFace = cv.bitwise_and(extractOriginal, mask * 255)

# step7 从打码的lena图像中提取没有人脸信息的lena图像(人脸区域为0)
noface2 = cv.bitwise_and(maskFace, (1 - mask) * 255)
cv.imshow("nofaceee", noface2)
# step8 在扣掉人脸的lena图像中加入已经解密后的人脸

extractLena = noface2 + extractFace
cv.imshow("extractLena", extractLena)

cv.waitKey()
cv.destroyAllWindows()

程序运行如下:

ROI方式

ROI方式更多的是对人脸区域进行处理。

人脸加密过程如下:

人脸解密过程如下:

ROI方式给脸部加密解密的过程感觉就是个作弊的过程。

代码如下:

import cv2 as cv
import numpy as np

# 读取原始图
lena = cv.imread("lena.png", 0)
cv.imshow("lena", lena)
r, c = lena.shape
# 得到掩码模板
mask = np.zeros((r, c), dtype=np.uint8)
mask[220:400, 250:350] = 1

# 得到加密解密的密钥图像
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)

# ========================获取加密的脸===================
# step1 使用密钥key对原始图片lena进行加密
lenaXorKey = cv.bitwise_xor(lena, key)

# step2 得到加密的人脸区域
secretFace = lenaXorKey[220:400, 250:350]

# step3 把加密的人脸区域贴到lena原始图上
lena[220:400, 250:350] = secretFace
cv.imshow("lena_secretface", lena)
# ========================开始人脸解密===================
# step4 将脸部加密的lena与密钥key进行异或,这样人脸区域会解密,其他区域会被加密(不重要)
extractOriginal = cv.bitwise_xor(lena, key)

# step5 扣下已经解密的人脸图像
face = extractOriginal[220:400, 250:350]

# step6 把扣下的人脸贴到加密的lena上,这样,解密后的脸就把加密的人的区域覆盖了
lena[220:400, 250:350] = face

cv.imshow("enFace", lena)

cv.waitKey()
cv.destroyAllWindows()

程序运行如下:

总结:图像的加解密更像是异或运算和掩模,ROI的综合使用,整体难度不大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第四章-图像加密与解密 的相关文章

随机推荐

  • Java 关于时间、日历类

    一 相互转换 1 Calendar 转化 String 获取当前时间的具体情况 如年 月 日 week date 分 秒等 Calendar calendat Calendar getInstance SimpleDateFormat sd
  • 打印金字塔

    首先我们分解这个问题 由简到难循序渐进 先打印4层半个金字塔如图 public class demo1 打印半个金字塔 public static void main String args TODO Auto generated meth
  • 深度解析开源IDE的领头羊—【Eclipse 】--认识Eclipse

    认识Eclipse 阅读本文前 相信读者已经对Eclipse略知一二了 起码已经知道它是一个Java的集成开发环境 IDE 并且还是一个应用程序框架 可以通过开发插件 把Eclipse打造成各种应用软件 而且还打算通过学习本书的内容 在具体
  • vue2 webpack版批量注册全局组件

    使用背景 用vue开发的所有项目 都是采用组件化的思想开发的 分为公共组件和功能组件 又可以分为全局自定义组件和局部自定义组件 全局自定义组件在main js文件直接引入 这种是最简单的方式 使用缺点 如果我们需要注册的全局组件非常多 那么
  • 移动端 - 搜索组件(search-list篇)

    移动端 搜索组件 search input篇 移动端 搜索组件 suggest篇 这里我们需要去封装搜索历史组件 这一个组件还是很简单的 但是逻辑部分需要根据实际的需求来进行书写 所以这里我不太好去写实际的代码 不过可以提供我的思路 主要的
  • Spring的事务

    目录 一 Spring的事务 二 Spring事务如何实现 三 Spring事务的失效 一 Spring的事务 当我们在某个方法上添加了 Transactional注解后 就表示该方法在调用时会开启Spring事务 而这个方法所在的类所对应
  • 第九课,OpenGL光照之材质

    物体材质 在冯氏模型中 一个物体的材质由 全局光照系数 漫反射光照系数 反射光照系数 反射高光半径系数决定 分别由 ambient diffuse specular shininess表示 材质系数 The numbers Name Amb
  • 【博客管理】博客目录导航【置顶】

    一 OpenCV学习 OpenCV学习笔记 函数学习 OpenCV学习笔记 函数学习 一 MFC OpenCV2 4 7读取摄像头之cvCaptureFromCAM 的索引问题 OpenCV学习笔记 函数学习 二 MFC OpenCV2 4
  • 【华为OD机试2023】字符串解密 java python c++

    字符串解密 题目 题目描述 给定两个字符串string1和string2 string1是一个被加扰的宇符串 string1由小写英文字母 a z 和数字字符 0 9 组成 而加扰字符串由 0 9 a z 组成 string1里面可能包含0
  • 使用js控制浏览器开启全屏,判断浏览器是否处于全屏状态

    引入lodash import from lodash 切换全屏方法 export function fullScreen isOpen target let dom target void 0 let open list requestF
  • 什么是.Net?

    NET 是一个开发平台 或者叫开发者平台 使用 NET 你可以创建不同类型的应用程序 使用多种开发语言 编辑器和工具库创建网页 手机 桌面以及游戏等应用 其核心特点是 免费 开源和跨平台 1 语言和平台 我们先来理解一下什么是 NET 开发
  • URL 转为QR code(二维码)

    总结几种把网页url转为二维码的方法 1 Chrome浏览器 最快的一种方法就是用chrome自带的QR code分享 这种方法的缺点就是不能自定义二维码的格式 颜色 logo之类的 都是默认的小恐龙图标 2 chrome插件 可以在chr
  • 关于非同一局域网下两台设备之间的网络通信(服务器的作用)

    看过很多关于局域网下的两台设备之间的通信方式 最多的就是通过socket进行tcp ip通信 建立一个服务端 再建立一个客户端 客户端向服务端发起请求连接 然后再进行两端的通信 但发现其实这却存在着很多的问题与不足 如果是不在同一局域网下的
  • 新手搭建 react antd 环境笔记

    安裝依赖 npm install g create react app npm install antd mobile save npm install less loader less save dev npm install react
  • LeetCode【345】反转字符串中的元音字母

    题目 编写一个函数 以字符串作为输入 反转该字符串中的元音字母 示例 1 输入 hello 输出 holle 示例 2 输入 leetcode 输出 leotcede 说明 元音字母不包含字母 y public class LeetCode
  • linux system call

    1 SYSCALL DEFINE4 reboot 2 int magic1 3 int magic2 4 unsigned int cmd 5 void user ang 6 7 if capable CAP SYS BOOT 8 retu
  • python数据分析练习题

    本次作业尝试使用ipython和jupyter的notebook功能来实现py代码 首先是要配置环境 通过命令 pip install ipython pip install jypyter ipython notebook 配置并打开no
  • [机器学习]1.2虚拟环境&基础包安装初始化

    机器学习 第一章 Centos环境安装初始化 第二章 virtualenv及基础包环境安装初始化 机器学习 1 2虚拟环境 基础包安装初始化 机器学习 前言 一 python安装 二 pip3 virtualenv安装及环境变量配置 1 配
  • 08 FPGA—计数器与分频器的应用

    1 理论 时序逻辑电路中最基本的单元 寄存器 我们可以使用寄存器来做计数器 基本上关于时间的设计都离不开计数器 计数器在数字系统中主要是对脉冲的个数进行计数 以实现测量 计数和控制的功能 同时兼有分频功能 计数器一般都是从 0 开始计数 计
  • 第四章-图像加密与解密

    加密与加密原理 使用异或运算实现图像加密及解密功能 异或运算规则 相同为0 不同为1 运算数相同 结果为0 运算数不同 结果为1 任何数 0 1 与0异或 结果仍为自身 任何数 0 1 与1异或 结果为另外一个数 即0变1 1变0 任何数和