[opencv 从零开始 5 ] python 将图片加密解密,图片加隐藏水印,提取水印。

 

目录

python 将图片加密解密

原理

代码

效果

python 给图片添加隐藏水印

原理:

代码:

效果:

 


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()

效果:

我们看第三张,肉眼基本看不出来加过水印

 

 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用OpenCV实现视觉密码加密和解密的Python示例代码: ```python import cv2 import numpy as np import random def encrypt(img_path, key): # 读入图片并转换为灰度图 img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 获取图片的高度和宽度 height, width = img.shape # 生成一个随机的加密矩阵 encrypt_matrix = np.zeros((height, width), dtype=np.uint8) for i in range(height): for j in range(width): encrypt_matrix[i][j] = random.randint(0, 255) # 将加密矩阵与密钥进行异或运算 key_matrix = np.zeros((height, width), dtype=np.uint8) key_matrix[:, :] = key encrypt_matrix = cv2.bitwise_xor(encrypt_matrix, key_matrix) # 将原始图片加密矩阵进行异或运算 encrypted_img = cv2.bitwise_xor(img, encrypt_matrix) # 返回加密后的图片加密矩阵 return encrypted_img, encrypt_matrix def decrypt(encrypted_img, encrypt_matrix, key): # 将加密矩阵与密钥进行异或运算 key_matrix = np.zeros(encrypt_matrix.shape, dtype=np.uint8) key_matrix[:, :] = key encrypt_matrix = cv2.bitwise_xor(encrypt_matrix, key_matrix) # 将加密后的图片加密矩阵进行异或运算,得到原始图片 img = cv2.bitwise_xor(encrypted_img, encrypt_matrix) # 返回解密后的图片 return img # 测试代码 img_path = 'test.jpg' key = 123 encrypted_img, encrypt_matrix = encrypt(img_path, key) decrypted_img = decrypt(encrypted_img, encrypt_matrix, key) cv2.imshow('Original Image', cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)) cv2.imshow('Encrypted Image', encrypted_img) cv2.imshow('Decrypted Image', decrypted_img) cv2.waitKey(0) ``` 首先定义了一个 `encrypt` 函数和一个 `decrypt` 函数,分别用于加密和解密一张图片。在加密过程中,首先读入图片并转换为灰度图,然后生成一个随机的加密矩阵,将加密矩阵与密钥进行异或运算,再将原始图片加密矩阵进行异或运算,得到加密后的图片加密矩阵。在解密过程中,将加密矩阵与密钥进行异或运算,然后将加密后的图片加密矩阵进行异或运算,得到原始图片。 接着,在测试代码中,定义了一个图片路径和一个密钥,并调用 `encrypt` 函数进行加密,再调用 `decrypt` 函数进行解密,并将原始图片加密后的图片和解密后的图片分别显示出来,以便比较。 需要注意的是,由于这种加密方式只是将原始图片加密矩阵进行异或运算,因此加密后的图片可能会有一些噪点,解密后的图片可能会有一些模糊。如果需要更高的加密强度和解密质量,可以考虑使用其他更复杂的加密算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值