Opencv+Python学习记录10:位平面分解+图像加密和解密(内附详细代码)

一,前置知识

在本部分,我们将学习用按位与运算(cv2.bitwise_and)观察灰度图像的各个位平面,以及通过图像按位异或(cv2.bitwise_xor)实现加密和解密过程,故最好先了解图像算术运算。详情可查看本专栏的学习记录8:Opencv+Python学习记录8:图像算术运算(内附详细代码)_修修修修Hugh的博客-CSDN博客

二,位平面分解

将灰度图像中处于同一比特位上的二进制像素值进行组合,得到一幅二进制值图像,该图像被称为灰度图像的一个位平面,这个过程被称为位平面分解。下面以灰度图像为例,介绍位平面分解的具体步骤:

1.图像预处理

读取原始图像O,获取原始图像O的宽度M和高度N。

2.构造提取矩阵

使用按位与操作能够很方便地将一个数值指定位上的数字提取出来。

3.提取位平面

将灰度图像与提取矩阵进行按位与运算,得到各个位平面。

将像素值与一个值为2n的数值进行按位与运算,能够使像素值的第n位保持不变,而将其余各位均置零。因此,通过像素值与特定值的按位与运算,能够提取像素值的指定二进制位的值。同理,通过按位与运算,能够提取图像的指定位平面。

4.阈值处理

通过计算得到的位平面是一个二值图像,如果直接将上述得到的位平面显示出来,则会得到一张近似黑色的图像。这是因为默认当前显示的图像是8位灰度图,而当其中的像素值较小时,显示的图像就会是近似黑色的。例如,在图像RD中,最大的像素值是8,因此几乎为纯黑色。要想让8显示为白色,必须将8处理为255。

也就是说,每次提取位平面后,要想让二值位平面能够以黑白颜色显示出来,就要将得到的二值位平面进行阈值处理,将其中大于零的值处理为255。

5.显示图像

完成上述处理后,可以将位平面显示出来,直观地观察各个位平面的具体情况。

例:编写程序,观察灰度图像的各个位平面

# 编写程序,观察灰度图像的各个位平面
import cv2
import numpy as np
gray1=cv2.imread("gray1.jpg",0)
cv2.imshow("gray1",gray1)
r,c=gray1.shape
x=np.zeros((r,c,8),dtype=np.uint8)
for i in range(8):
    x[:,:,i]=2**i
r=np.zeros((r,c,8),dtype=np.uint8)
for i in range(8):
    r[:,:,i]=cv2.bitwise_and(gray1,x[:,:,i])
    mask=r[:,:,i]>0
    r[mask]=255
    cv2.imshow(str(i),r[:,:,i])
cv2.waitKey()
cv2.destroyAllWindows()

 输出结果如下:

 三,图像加密和解密

通过按位异或运算可以实现图像的加密和解密。

通过对原始图像与密钥图像进行按位异或,可以实现加密;将加密后的图像与密钥图像再次进行按位异或,可以实现解密。

例:编写程序,通到图像按位异或实现加密和解密过程。

# 编写程序,通过图像按位异或实现加密和解密过程
import cv2
import numpy as np
gray1=cv2.imread("gray1.jpg",0)
r,c=gray1.shape
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8)
encryption=cv2.bitwise_xor(gray1,key)
decryption=cv2.bitwise_xor(encryption,key)
cv2.imshow("gray1",gray1)
cv2.imshow("key",key)
cv2.imshow("encryption",encryption)
cv2.imshow("decryption",decryption)
cv2.waitKey()
cv2.destroyAllWindows()

 输出结果如下:

四,样例图片

gray1.jpg 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值