Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用枕头创建隐写隐藏图像_Python_Image_Pillow - Fatal编程技术网

Python 使用枕头创建隐写隐藏图像

Python 使用枕头创建隐写隐藏图像,python,image,pillow,Python,Image,Pillow,我正在尝试学习如何创建一组这样的图像:。这个想法是有两个看似随机的图像,但当你对它们进行异或运算时,你会发现一条秘密信息。我想使用Python枕头,可能还需要一个简单的图像编辑器,比如paint.net。因此,我的问题由几个部分组成: 我如何在枕头上生成一个充满随机黑白像素的图像 如何确保图像的某些区域不是随机的,而是相同的,确保异或比较将显示它们 创建这些图像的过程非常简单。下面是一个示例,说明如何做到这一点(不是最有效的): 创建两个大小相同的输出图像 创建一个相同大小的模板,其中1(白色)

我正在尝试学习如何创建一组这样的图像:。这个想法是有两个看似随机的图像,但当你对它们进行异或运算时,你会发现一条秘密信息。我想使用Python枕头,可能还需要一个简单的图像编辑器,比如paint.net。因此,我的问题由几个部分组成:

  • 我如何在枕头上生成一个充满随机黑白像素的图像
  • 如何确保图像的某些区域不是随机的,而是相同的,确保异或比较将显示它们

  • 创建这些图像的过程非常简单。下面是一个示例,说明如何做到这一点(不是最有效的):

  • 创建两个大小相同的输出图像
  • 创建一个相同大小的模板,其中1(白色)表示前景(隐藏消息),0(黑色)表示背景(完全随机)
  • 在一个循环中迭代图像和模板:
    • 如果当前位置的模板显示为0,则绘制两个随机数(0或1),并将它们指定给每个输出图像的当前像素
    • 如果模板显示为1,则仅绘制一个随机数并将其分配给两个像素
  • 我不会详细介绍如何阅读模板图像、创建二进制输出图像以及使用Pillow对其进行迭代,因为我从未尝试过Pillow。然而,绘制随机数非常简单:


    x=random.randint(0,1)
    (请参阅)

    要开始,这里有一种生成随机二进制图像的方法:

    from PIL import Image
    import numpy as np
    
    # Make lots of ones and zeros.
    data = np.random.randint(2, size=(100,100))
    
    # Cast as 8-bit ints, 0 and 255.
    data = data.astype(np.uint8) * 255
    
    # Cast as an image. Pillow guesses mode.
    img = Image.fromarray(data)
    
    结果(放大到300×300像素):


    为了未来的子孙后代,我做了以下几点: 首先,我制作了一个面具图像。它是一个白色背景,有一个红色框,框中有黑色文本。看起来像这样:

    以下是我为制作两个模糊图像而编写的脚本:

    from PIL import Image
    import random
    
    WHITE = (255, 255, 255, 255)
    RED = (255, 0, 0, 255)
    BLACK = (0, 0, 0, 255)
    
    wb = [WHITE,BLACK]
    
    rng = random.SystemRandom()
    
    orig = Image.open('mask.png')
    
    origData = list(orig.getdata())
    
    n1 = Image.new(orig.mode, orig.size)
    n2 = Image.new(orig.mode, orig.size)
    
    n1data = []
    n2data = []
    
    
    for x in origData:
        if x == WHITE:
            n1data.append(rng.choice(wb))
            n2data.append(rng.choice(wb))
        elif x == RED:
            y = bool(rng.getrandbits(1))
            if y:
                n1data.append(WHITE)
                n2data.append(BLACK)
            else:
                n1data.append(BLACK)
                n2data.append(WHITE)
        elif x == BLACK:
            y = bool(rng.getrandbits(1))
            if y:
                n1data.append(WHITE)
                n2data.append(WHITE)
            else:
                n1data.append(BLACK)
                n2data.append(BLACK)
    
    n1.putdata(n1data)
    n2.putdata(n2data)
    n1.save('n1.png')
    n2.save('n2.png')
    orig.close()
    n1.close()
    n2.close()
    
    结果是:

    将它们异或在一起,得到以下结果:

    XOR是一个对称过程,因此编码与解码是相同的。