前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何使用 Python 隐藏图像中的数据

如何使用 Python 隐藏图像中的数据

作者头像
小白学视觉
发布于 2022-02-14 03:11:56
发布于 2022-02-14 03:11:56
4.3K00
代码可运行
举报
运行总次数:0
代码可运行

隐写术是在任何文件中隐藏秘密数据的艺术。

秘密数据可以是任何格式的数据,如文本甚至文件。简而言之,隐写术的主要目的是隐藏任何文件(通常是图像、音频或视频)中的预期信息,而不实际改变文件的外观,即文件外观看起来和以前一样。

在这篇文章中,我们将重点学习基于图像的隐写术,即在图像中隐藏秘密数据。

但在深入研究之前,让我们先看看图像由什么组成:

  1. 像素是图像的组成部分。
  2. 每个像素包含三个值:(红色、绿色、蓝色)也称为 RGB 值。
  3. 每个 RGB 值的范围从 0 到 255。

现在,让我们看看如何将数据编码和解码到我们的图像中。

编码

有很多算法可以用来将数据编码到图像中,实际上我们也可以自己制作一个。在这篇文章中使用的一个很容易理解和实现的算法。

算法如下:

  1. 对于数据中的每个字符,将其 ASCII 值转换为 8 位二进制 [1]。
  2. 一次读取三个像素,其总 RGB 值为 3*3=9 个。前八个 RGB 值用于存储一个转换为 8 位二进制的字符。
  3. 比较相应的RGB值和二进制数据。如果二进制数字为 1,则 RGB 值将转换为奇数,否则为偶数。
  4. 第 9 个值确定是否应该读取更多像素。如果有更多数据要读取,即编码或解码,则第 9 个像素变为偶数;否则,如果我们想停止进一步读取像素,那就让它变得奇数。

重复这个过程,直到所有数据都被编码到图像中。

例子

假设要隐藏的消息是‘Hii’。

消息是三个字节,因此,对数据进行编码所需的像素为 3 x 3 = 9。考虑一个 4 x 3 的图像,总共有 12 个像素,这足以对给定的数据进行编码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[(27, 64, 164), (248, 244, 194), (174, 246, 250), (149, 95, 232),
(188, 156, 169), (71, 167, 127), (132, 173, 97), (113, 69, 206),
(255, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]

第 1 步

H 的 ASCII 值为 72 ,其二进制等效值为 01001000 。

第 2 步

读取前三个像素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(27, 64, 164), (248, 244, 194), (174, 246, 250)

第 3 步

现在,将像素值更改为奇数为 1,偶数为 0,就像在二进制等效数据中一样。

例如,第一个二进制数字是0,第一个 RGB 值是 27 ,它需要转换为偶数,这意味着 26 。类似地,64 被转换为 63 因为下一个二进制数字是1 所以 RGB 值应该是奇数。

因此,修改后的像素为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(26, 63, 164), (248, 243, 194), (174, 246, 250)

第4步

由于我们必须对更多数据进行编码,因此最后一个值应该是偶数。同样,i可以在这个图像中进行编码。

通过执行 +1 或 -1 使像素值成为奇数/偶数时,我们应该注意二进制条件。即像素值应大于或等于 0 且小于或等于 255 。

新图像将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[(26, 63, 164), (248, 243, 194), (174, 246, 250), (148, 95, 231),
(188, 155, 168), (70, 167, 126), (132, 173, 97), (112, 69, 206),
(254, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]

解码

对于解码,我们将尝试找到如何逆转之前我们用于数据编码的算法。

  1. 同样,一次读取三个像素。前 8 个 RGB 值为我们提供了有关机密数据的信息,第 9 个值告诉我们是否继续前进。
  2. 对于前八个值,如果值为奇数,则二进制位为 1 ,否则为 0 。
  3. 这些位连接成一个字符串,每三个像素,我们得到一个字节的秘密数据,这意味着一个字符。
  4. 现在,如果第 9 个值是偶数,那么我们继续一次读取三个像素,否则,我们停止。

例如

让我们开始一次读取三个像素。

考虑我们之前编码的图像。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[(26, 63, 164), (248, 243, 194), (174, 246, 250), (148, 95, 231),
(188, 155, 168), (70, 167, 126), (132, 173, 97), (112, 69, 206),
(254, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]

第1步

我们首先读取三个像素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[(26, 63, 164), (248, 243, 194), (174, 246, 250)

第2步

读取第一个值:26,它是偶数,因此二进制位是 0 。类似地,对于 63 ,二进制位是 1 ,对于 164 它是 0 。这个过程一直持续到 8 个 RGB 值。

第 3 步

将所有二进制值连接后,我们最终得到二进制值:01001000。最终的二进制数据对应于十进制值 72,在 ASCII 中,它代表字符 H 。

第 4 步

由于第 9 个值是偶数,我们重复上述步骤。当遇到的第 9 个值是奇数时,我们停止。

结果,我们得到了原始信息,即 Hii 。

上述算法的 Python 程序如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Python program implementing Image Steganography

# PIL module is used to extract
# pixels of image and modify it
from PIL import Image

# Convert encoding data into 8-bit binary
# form using ASCII value of characters
def genData(data):

        # list of binary codes
        # of given data
        newd = []

        for i in data:
            newd.append(format(ord(i), '08b'))
        return newd

# Pixels are modified according to the
# 8-bit binary data and finally returned
def modPix(pix, data):

    datalist = genData(data)
    lendata = len(datalist)
    imdata = iter(pix)

    for i in range(lendata):

        # Extracting 3 pixels at a time
        pix = [value for value in imdata.__next__()[:3] +
                                imdata.__next__()[:3] +
                                imdata.__next__()[:3]]

        # Pixel value should be made
        # odd for 1 and even for 0
        for j in range(0, 8):
            if (datalist[i][j] == '0' and pix[j]% 2 != 0):
                pix[j] -= 1

            elif (datalist[i][j] == '1' and pix[j] % 2 == 0):
                if(pix[j] != 0):
                    pix[j] -= 1
                else:
                    pix[j] += 1
                # pix[j] -= 1

        # Eighth pixel of every set tells
        # whether to stop ot read further.
        # 0 means keep reading; 1 means thec
        # message is over.
        if (i == lendata - 1):
            if (pix[-1] % 2 == 0):
                if(pix[-1] != 0):
                    pix[-1] -= 1
                else:
                    pix[-1] += 1

        else:
            if (pix[-1] % 2 != 0):
                pix[-1] -= 1

        pix = tuple(pix)
        yield pix[0:3]
        yield pix[3:6]
        yield pix[6:9]

def encode_enc(newimg, data):
    w = newimg.size[0]
    (x, y) = (0, 0)

    for pixel in modPix(newimg.getdata(), data):

        # Putting modified pixels in the new image
        newimg.putpixel((x, y), pixel)
        if (x == w - 1):
            x = 0
            y += 1
        else:
            x += 1

# Encode data into image
def encode():
    img = input("Enter image name(with extension) : ")
    image = Image.open(img, 'r')

    data = input("Enter data to be encoded : ")
    if (len(data) == 0):
        raise ValueError('Data is empty')

    newimg = image.copy()
    encode_enc(newimg, data)

    new_img_name = input("Enter the name of new image(with extension) : ")
    newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))

# Decode the data in the image
def decode():
    img = input("Enter image name(with extension) : ")
    image = Image.open(img, 'r')

    data = ''
    imgdata = iter(image.getdata())

    while (True):
        pixels = [value for value in imgdata.__next__()[:3] +
                                imgdata.__next__()[:3] +
                                imgdata.__next__()[:3]]

        # string of binary data
        binstr = ''

        for i in pixels[:8]:
            if (i % 2 == 0):
                binstr += '0'
            else:
                binstr += '1'

        data += chr(int(binstr, 2))
        if (pixels[-1] % 2 != 0):
            return data

# Main Function
def main():
    a = int(input(":: Welcome to Steganography ::\n"
                        "1. Encode\n2. Decode\n"))
    if (a == 1):
        encode()

    elif (a == 2):
        print("Decoded Word :  " + decode())
    else:
        raise Exception("Enter correct input")

# Driver Code
if __name__ == '__main__' :

    # Calling main function
    main()

程序中使用的模块是 PIL ,它代表Python 图像库,它使我们能够在 Python 中对图像执行操作。

程序执行

数据编码

数据解码

输入图像

输出图像

局限性

该程序可能无法对 JPEG 图像按预期处理,因为 JPEG 使用有损压缩,这意味着修改像素以压缩图像并降低质量,因此会发生数据丢失

参考

  1. https://www.geeksforgeeks.org/program-decimal-binary-conversion/
  2. https://www.geeksforgeeks.org/working-images-python/
  3. https://dev.to/erikwhiting88/let-s-hide-a-secret-message-in-an-image-with-python-and-opencv-1jf5
  4. A code along with the dependencies can be found here: https://github.com/goelashwin36/image-steganography
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
揭秘Deepfake换脸视频背后的技术细节
今天聊GAN。这要从一个新闻说起,2020年圣诞流出一段诡异的视频,英国那位超长待机的老婆婆先是在视频里来了一段放飞自我的演讲,把以前绝对不适合在正式场合讲的话统统一吐为快,然后干脆彻底放飞自我,直接跳上桌子上来了一段TikTok热舞,场面一度十分混乱。
IT阅读排行榜
2021/02/05
1.3K0
揭秘Deepfake换脸视频背后的技术细节
深度解密换脸应用 Deepfake
Deepfake 就是前一阵很火的换脸 App,从技术的角度而言,这是深度图像生成模型的一次非常成功的应用,这两年虽然涌现出了很多图像生成模型方面的论文,但大都是能算是 Demo,没有多少的实用价值,除非在特定领域(比如医学上),哪怕是英伟达的神作:渐进生成高清人脸 PGGAN(https://arxiv.org/abs/1710.10196 ) 好像也是学术意义大于实用价值。其实人们一直都在追求更通用的生成技术,我想 Deepfake 算是一例,就让我们由此出发,看看能否从中获取些灵感。 一、基本框架
AI研习社
2018/03/28
3.8K0
深度解密换脸应用 Deepfake
AI换脸终结者问世!美国防部推首款AI侦测工具,“反换脸”精度99%!
【新智元导读】美国防部研发出了全球首款“反AI变脸刑侦检测工具”,专用于检测AI变脸/换脸造假技术。如今,以GAN为代表的AI换脸术盛行,相应的人脸检测识别技术也不得不提升,这仅仅是一场漫长而又精彩的AI军备竞赛的开始。
新智元
2018/08/16
4.4K0
AI换脸终结者问世!美国防部推首款AI侦测工具,“反换脸”精度99%!
秒杀Deepfake!微软北大提出AI换脸工具FaceShifter和假脸检测工具Face X-Ray
最先进的AI和机器学习算法不仅可以生成栩栩如生的位置和物体的图像,还擅长将人脸头像从一个人换成另一个人的。另一方面,研究人员也在不断开发能够检测deepfake假图像的识别工具。这场在机器学习图像识别领域的“矛与盾”之争愈演愈烈。
新智元
2020/02/13
2.5K0
悬赏1000万美元,打假AI换脸!Facebook发起Deepfakes检测挑战赛
Facebook宣布了一项名为Deepfake Detection Challenge(DFDC)的挑战赛,壕掷1000万美元,悬赏能够最好地检测出利用Deepfake技术制造的假视频。
新智元
2019/09/10
9720
悬赏1000万美元,打假AI换脸!Facebook发起Deepfakes检测挑战赛
解密Deepfake(深度换脸)-基于自编码器的(Pytorch代码)换脸技术
还记得在2018月3月份火爆reddit的deepfake吗?将视频中的头换成另一个人的头像,虽然可能有些粗糙和模糊,但是在分辨率不要求很高的情况下可以达到以假乱真的效果。
老潘
2019/01/23
4.3K0
古有照妖镜,今有换脸识别机,微软 CVPR 2020力作,让伪造人脸无处遁形
前些日子,Deepfake技术现身印度选举,被候选人用在了竞选拉票的宣传材料上。虽然此候选人以惨败而收场,但这意味着Deepfake点燃的AI换脸之火有逐渐升温的迹象。
AI科技评论
2020/02/26
1.7K0
打击换脸技术滥用,谷歌发布大型数据集对抗deepfake
deepfake 出现以来引发了大量争议,也带来了诸多伦理和社会问题。最近,Facebook、微软等巨头已开始着手打击 deepfake 滥用,斥资 1000 多万美元举办 deepfake 检测挑战赛。谷歌也不甘落后,近日,这家科技巨头宣布开源大型 deepfake 视频数据集,以支持社区对 deepfake 检测的研究。
机器之心
2019/10/12
6040
打击换脸技术滥用,谷歌发布大型数据集对抗deepfake
搭建深度学习模型实现“换脸检测” Deepfake Detection
Deepfakes 是一种合成视频,通过深度学习技术将原视频中的人脸进行替换,然后输出新的视频。
deephub
2020/05/09
2K1
搭建深度学习模型实现“换脸检测” Deepfake Detection
Nat. Biotechnol. | 蛋白质结构和序列的生成模型
今天为大家介绍的是来自Jennifer Listgarten团队的一篇概述论文。像ChatGPT和DALL-E2这样的模型可以根据文本提示生成文本和图像。尽管它们处理的数据类型和目标不同,但生成模型在蛋白质工程方面同样具有巨大的潜力。
DrugAI
2024/03/18
2750
Nat. Biotechnol. | 蛋白质结构和序列的生成模型
担心自己照片被Deepfake利用?试试波士顿大学这项新研究
近日,来自波士顿大学的研究者在一篇论文中介绍了 deepfake 新研究,看论文标题与效果,似乎只要输入我们的图片,deepfake 换脸模型就不能再拿我们的图片作为素材制作小视频。
机器之心
2020/03/25
4280
一个模型击溃12种AI造假,各种GAN与Deepfake都阵亡 | 伯克利Adobe新研究
连英伟达本月刚上线的StyleGAN2也被攻破了。即使是人眼都分辨看不出来假脸图片,还是可以被AI正确鉴别。
OpenCV学堂
2020/03/10
7700
一个模型击溃12种AI造假,各种GAN与Deepfake都阵亡 | 伯克利Adobe新研究
苹果华人研究员实现无代码深度学习!全自动AI训练平台,只需上传数据集
2021年,低代码和无代码的概念都被炒得热火朝天,各路产品就像下饺子一样蜂拥而至。
新智元
2021/08/25
8490
想用GAN和Deepfake瞒天过海,没那么容易:这是Adobe和加州伯克利的新研究
近来,诸如生成对抗网络(GAN)的深度图像生成技术快速发展,引发了公众的广泛关注和兴趣,但这也使人们担心,我们会逐渐走入一个无法分辨图像真实与否的世界。
机器之心
2020/03/12
5410
想用GAN和Deepfake瞒天过海,没那么容易:这是Adobe和加州伯克利的新研究
DeepFake系列之Easy to Spot
今天给大家介绍的是一篇由Adobe团队做的一份工作,他们通过一些简单的数据增强方法来增强检测模型对不同GAN数据集的鲁棒性
BBuf
2020/06/09
5430
“一网打尽”Deepfake等换脸图像,微软提出升级版鉴别技术Face X-Ray​
虽然研究者们为检测换脸图片提出了多种AI鉴别算法,但随着换脸算法的不断改造升级,鉴别算法很难跟上换脸算法的变化。
AI科技大本营
2020/03/10
2.9K0
“一网打尽”Deepfake等换脸图像,微软提出升级版鉴别技术Face X-Ray​
从FBNetv1到FBNetV3:一文看懂Facebook在NAS领域的轻量级网络探索
FBNet系列是完全基于NAS方法的轻量级网络系列,分析当前搜索方法的缺点,逐步增加创新性改进,FBNet结合了DNAS和资源约束,FBNetV2加入了channel和输入分辨率的搜索,FBNetV3则是使用准确率预测来进行快速的网络结构搜索
Amusi
2020/09/23
2K0
从FBNetv1到FBNetV3:一文看懂Facebook在NAS领域的轻量级网络探索
DeepFake系列之FakeSpotter
今天给大家解读的是最近一篇关于Deepfake检测的论文,出自阿里巴巴,小米AI lab联合出品的FakeSpotter,由于以往的Deepfake检测网络鲁棒性并不高,这篇文章探讨一个更简单的方式,增强网络的鲁棒性。
BBuf
2020/06/11
5970
教程 | 如何使用DeepFake实现视频换脸
机器之心发布 作者:冯沁原 不久之前,AV 视频换脸明星的 DeepFake 火了。这篇文章将一步步教你如何实现换脸。 如果你是第一次听说 DeepFake,一定要点击上面的视频,亲自感受一下尼古拉
机器之心
2018/06/08
10K1
【AI初识境】深度学习中常用的损失函数有哪些?
这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。
用户1508658
2019/07/27
9220
推荐阅读
相关推荐
揭秘Deepfake换脸视频背后的技术细节
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档