在Python中使用 OpenCV 进行图像隐写术
图像隐写术是在某些图像中隐藏秘密数据的过程。在这篇文章中,我们将一个图像隐藏在另一个图像中并将其转换为另一个图像,然后从前一个图像中提取两个图像。
基于图像的隐写术背后的想法非常简单。图像由数字数据(像素)组成,它描述了图片内部的内容,通常是所有像素的颜色。因为我们知道每个图像都是由像素组成的,每个像素都包含 3 个值(红、绿、蓝)。
例如,假设我们必须将 img2 隐藏在 img1 中,其中 img1 和 img2 都是numpy nd
像素值数组。 img2 的大小必须小于 img1 的大小。我们使用的是彩色图像,因此两者都有 3 个值(红色、绿色、蓝色)。每个像素值从 0 到 255 不等,因此每个像素值是 1 字节或 8 位。令img[i][j][l]
是位置(i, j)
和通道 l 的像素值,其中 i 从 0 到宽度变化,j 从 0 到高度变化,l 从 0 到 2 变化。
注意:新图像的质量略低于旧图像。
编码
让img1[i][j][l]
和img2[i][j][l]
是每个图像的某个像素值。令 v1 为img1[i][j][l]
的 8 位二进制表示,v2 为img2[i][j][l]
的 8 位二进制表示。因此, v3=v1[:4]+v2[:4]
,其中,v3 是 v1 和 v2 的前 4 位。然后我们将img1[i][j][l]
分配给 v3。
这里 img1 是编码后生成的最终图像。
解码
令img[i][j][l]
为图像的像素值。令 v1 为img[i][j][l]
的 8 位二进制表示。令v2=v1[:4]+4
随机位和v3=v1[4:]+4
随机位。然后我们将img1[i][j][l]
分配给 v2 并将img2[i][j][l]
分配给 v3。
这里 img1 和 img2 是解码后产生的最终图像。
执行
让我们考虑使用的图像如下:
图 1
图 2
我们想在 image1 中隐藏 image2。下面是实现。
# Python program to demonstrate
# image steganography using OpenCV
import cv2
import numpy as np
import random
# Encryption function
def encrypt():
# img1 and img2 are the
# two input images
img1 = cv2.imread('pic1.jpg')
img2 = cv2.imread('pic2.jpg')
for i in range(img2.shape[0]):
for j in range(img2.shape[1]):
for l in range(3):
# v1 and v2 are 8-bit pixel values
# of img1 and img2 respectively
v1 = format(img1[i][j][l], '08b')
v2 = format(img2[i][j][l], '08b')
# Taking 4 MSBs of each image
v3 = v1[:4] + v2[:4]
img1[i][j][l]= int(v3, 2)
cv2.imwrite('pic3in2.png', img1)
# Decryption function
def decrypt():
# Encrypted image
img = cv2.imread('pic3in2.png')
width = img.shape[0]
height = img.shape[1]
# img1 and img2 are two blank images
img1 = np.zeros((width, height, 3), np.uint8)
img2 = np.zeros((width, height, 3), np.uint8)
for i in range(width):
for j in range(height):
for l in range(3):
v1 = format(img[i][j][l], '08b')
v2 = v1[:4] + chr(random.randint(0, 1)+48) * 4
v3 = v1[4:] + chr(random.randint(0, 1)+48) * 4
# Appending data to img1 and img2
img1[i][j][l]= int(v2, 2)
img2[i][j][l]= int(v3, 2)
# These are two images produced from
# the encrypted image
cv2.imwrite('pic2_re.png', img1)
cv2.imwrite('pic3_re.png', img2)
# Driver's code
encrypt()
decrypt()
输出:
加密后:
解密后:
图 1
图 2