目录
python 将图片加密解密
原理
O代表原始图像,key代表密钥图像,c代表加密后图像 加解密原理: 原始图像与key图像进行异或操作 比如B通道的0,0点, D: o为26 key为 67 B: 00011010 01000011 二者进行异或 0101 1001 89 则 C 图 R通道就为 0,0点为 89 解密原理(提取原始O): c图0,0点与 key图0,0点进行异或 89 67 01011001 01000011 还原结果: 00011010 26 解密原理(提取key): c图0,0点与 O图0,0点进行异或 89 26 01011001 00011010 还原结果: 01000011 67
代码
#!usr/bin/env python
#-*- coding:utf-8 -*-
"""
@author:HUAWEI
@file: imglock_11_18.py
@time: 2020/11/18
"""
"""
O代表原始图像,key代表密钥图像,c代表加密后图像
加解密原理:
原始图像与key图像进行异或操作
比如B通道的0,0点,
D: o为26 key为 67
B: 00011010 01000011
二者进行异或 0101 1001 89
则 C 图 R通道就为 0,0点为 89
解密原理(提取原始O):
c图0,0点与 key图0,0点进行异或
89 67
01011001 01000011
还原结果: 00011010 26
解密原理(提取key):
c图0,0点与 O图0,0点进行异或
89 26
01011001 00011010
还原结果: 01000011 67
"""
# 我们开始编码
import cv2
import numpy as np
#读取图像信息
o = cv2.imread("kewayi.jpg")
key = cv2.imread("test.jpg")
osize = o.shape
key = cv2.resize(key,(osize[0],osize[1]))
def encrypt(o,k):
return np.bitwise_xor(o,k)
def zh_ch(string):
return string.encode('gbk').decode(errors='ignore')
#拆分bgr通道
obgr = cv2.split(o)
kbgr = cv2.split(key)
cbgr = []
#加密过程
for i,v in enumerate(obgr):
t=encrypt(v,kbgr[i])
cbgr.append(t)
c = cv2.merge(cbgr)
cv2.imshow(zh_ch("加密:"),c)
col =[]
#解密过程
for i,v in enumerate(cbgr):
t=encrypt(v,kbgr[i])
col.append(t)
co = cv2.merge(col)
cv2.imshow(zh_ch("原始:"),co)
cv2.imshow("key",key)
cv2.waitKey()
cv2.destroyWindow()
效果
python 给图片添加隐藏水印
原理:
我们知道常见彩色图像是右R,G,B三通道合成的,而我们把某个通道拿出来,一个像素点如(0,0) 此时像素点数据为32,
最低有效位概念就是说(lsb),32 转为二进制 00100000,我们取二进制的最低位,依次对每个像素点取值,我们就建立了最低有效位面
最低有效位是影响图像显示最小,我们可以替换最低有效位从尔进行隐藏打码。
代码:
#!usr/bin/env python
#-*- coding:utf-8 -*-
"""
@author:HUAWEI
@file: mark_11_19.py
@time: 2020/11/19
"""
import cv2
import numpy as np
def zh_ch(string):
return string.encode('gbk').decode(errors='ignore')
#为了操作方便我就只加灰度图了
#R,G,B原理一样每个通道加一下
#要加水印照片
a = cv2.imread("kewayi.jpg",0)
#隐藏水印照
mark= cv2.imread("mark.jpg",0)
cv2.imshow(zh_ch("mark"),mark)
#将大于0转为 True
t_mark = mark[::]>0
#标记为1
mark[t_mark] = 1
#提取原始图像大小
size = a.shape
#生成提取矩阵
t254 = np.ones(size,dtype=np.uint8)*254
#获取原始图像高7位
a7 = cv2.bitwise_and(a,t254)
#将水印放入最低位
e=cv2.bitwise_or(a7,mark)
cv2.imshow(zh_ch("原始图像"),a)
cv2.imshow(zh_ch("加水印图像"),e)
##########################
#提取水印过程
t1 = np.ones(size,dtype=np.uint8)*1
wm = cv2.bitwise_and(e,t1)
w = wm[:,:]>0
wm[w]=255
cv2.imshow(zh_ch("提取水印"),wm)
cv2.waitKey()
cv2.destroyWindow()
效果:
我们看第三张,肉眼基本看不出来加过水印