一,前置知识
在本部分,我们将学习用按位与运算(cv2.bitwise_and)观察灰度图像的各个位平面,以及通过图像按位异或(cv2.bitwise_xor)实现加密和解密过程,故最好先了解图像算术运算。
二,位平面分解
将灰度图像中处于同一比特位上的二进制像素值进行组合,得到一幅二进制值图像,该图像被称为灰度图像的一个位平面,这个过程被称为位平面分解。下面以灰度图像为例,介绍位平面分解的具体步骤:
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