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

博客介绍了Python在图片处理方面的两个应用,一是图片的加密解密,涵盖原理、代码和效果展示;二是给图片添加隐藏水印,原理是利用彩色图像通道的最低有效位,其对图像显示影响小,可替换以实现隐藏打码,添加水印后肉眼基本难以察觉。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

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

效果:

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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值