📜  在Python中使用 OpenCV 进行图像隐写术

📅  最后修改于: 2022-05-13 01:54:31.664000             🧑  作者: Mango

在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

图像隐写术-python

图 2

图像隐写术-python

我们想在 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()

输出:

加密后:

图像隐写术-python

解密后:

图 1

图像隐写术-python

图 2

图像隐写术-python