如何通过选择封面图像中的随机像素将图像嵌入到封面图像中?

How to embed an image to a cover image by selecting random pixels in cover image?

def embedding(hideImagePath,coverImagePath):
    img1 = cv2.imread(coverImagePath, 0)
    img2 = cv2.imread(hideImagePath, 0)
    for i in range (img2.shape[0]):
        for j in range(img2.shape[1]):
                #convert pixel to binary 
                pixels_cover = format(img1[i][j], '08b')
                pixels_hide = format(img2[i][j], '08b')
                #replace the last 2 LSB from cover image with 2 MSB from hide image
                stegoImage = pixels_cover[:6] + pixels_hide[:2]
                img1[i][j] = int(stegoImage, 2)
    cv2.imwrite('StegoImage.png', img1)

以上是我到目前为止完成的代码。它按顺序隐藏封面图像中的像素,但我需要它通过从封面图像中选择随机像素来将图像隐藏到封面图像。

从概念上讲,您希望生成所有像素坐标并以确定的方式对它们进行混洗,以便提取知道要查找的位置。

import itertools as it
import random

def permute_indices(shape, password):
    indices = list(it.product(*map(range, shape)))
    random.seed(password)
    random.shuffle(indices)
    return iter(indices)

例如

>>> idx = permute_indices((600, 800), 'hunter2')
>>> for _ in range(5):
    print(next(idx))

    
(411, 359)
(379, 680)
(110, 612)
(246, 388)
(232, 605)

对您的代码进行调整

def embedding(hideImagePath, coverImagePath, password):
    img1 = cv2.imread(coverImagePath, 0)
    img2 = cv2.imread(hideImagePath, 0)
    indices = permute_indices(img1.shape, password)
    for i in range (img2.shape[0]):
        for j in range(img2.shape[1]):
                x, y = next(indices)
                #convert pixel to binary
                pixels_cover = format(img1[x][y], '08b')
                pixels_hide = format(img2[i][j], '08b')
                #replace the last 2 LSB from cover image with 2 MSB from hide image
                stegoImage = pixels_cover[:6] + pixels_hide[:2]
                img1[x][y] = int(stegoImage, 2)
    cv2.imwrite('StegoImage.png', img1)