点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

隐秘术是在任何文件中隐藏秘密数据的艺术。秘密数据可以是任何格式的数据,例如文本,甚至是文件。简而言之,隐写术的主要目的是在任何文件(通常是图像,音频或视频)中隐藏预期的信息,而无需实际更改文件的外观,即,其外观应与以前相同。

本期我们将一起学习基于图像的隐写术,即在图像中隐藏秘密数据。

但是在深入研究之前,让我们先看看图像的组成。

1. 像素是图像的基础。

2. 每个像素包含三个值:(红色,绿色,蓝色)也称为RGB值。

3. 每个RGB值的范围是0到255。

现在,让我们看看如何将数据编码和解码为图像形式。

01.编码方式

有很多算法可将数据编码到图像中,实际上,大家也可以自己制作。我们将使用的一个简单易于理解和实施的算法。具体步骤如下:

1. 对于数据中的每个字符,均采用其ASCII值并将其转换为8位二进制[1]。

2. 一次读取三个像素,总共具有3 * 3 = 9 RGB值。前八个RGB值用于存储一个字符,该字符将转换为8位二进制数。

3. 比较相应的RGB值和二进制数据。如果二进制数字为1,则RGB值将转换为奇数,否则将转换为偶数。

4. 第九个值确定是否应读取更多像素。如果还有更多数据要读取(即编码或解码),则第九个像素变为偶数。否则,如果我们想停止进一步读取像素,则将其设为奇数。

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

02.应用实例

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

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

[(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)]

第一步

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

第二步

读取前三个像素。

(27,64,164),(248,244,194),(174,246,250)

第三步

现在,将像素值更改为1的奇数,甚至更改为0的奇数,如数据的二进制等价形式。

例如,第一个二进制数为0,第一个RGB值为27,则需要将其转换为偶数26。

类似地,由于下一个二进制数是,因此64被转换63为,1因此RGB值应设为奇数。

因此,修改后的像素为:

(26,63,164),(248,243,194),(174,246,250)

第四步

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

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

新图像将如下所示:

[(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)]

03.解码

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

1. 同样,一次读取三个像素。前8个RGB值向我们提供有关机密数据的信息,第9个值告诉我们是否继续前进。

2. 对于前八个值,如果该值为奇数,则二进制位为1,否则为0。

3. 这些位被连接成一个字符串,每三个像素,我们得到一个字节的秘密数据,这意味着一个字符。

4. 现在,如果第九个值是偶数,那么我们将一次读取三个像素,否则我们将停止。

让我们开始一次读取三个像素。考虑我们以前编码的图像。

[(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步

我们首先阅读三个像素:

[(26,63,164),(248,243,194),(174,246,250)

第2步

读取第一个值:26,它是偶数,因此二进制位是0。同样,对63,二进制位1和164它0。该过程一直持续到八个RGB值为止。

第三步

我们最终得到二进制值:01001000将所有单个二进制值连接在一起之后。最终的二进制数据对应于十进制值72,并以ASCII表示字符H。

第4步

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

结果,我们得到的原始消息是Hii。

用于上述算法的Python程序如下:

# 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 datanewd = []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 timepix = [value for value in imdata.__next__()[:3] +imdata.__next__()[:3] +imdata.__next__()[:3]]# Pixel value should be made# odd for 1 and even for 0for j in range(0, 8):if (datalist[i][j] == '0' and pix[j]% 2 != 0):pix[j] -= 1elif (datalist[i][j] == '1' and pix[j] % 2 == 0):if(pix[j] != 0):pix[j] -= 1else: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] -= 1else:pix[-1] += 1else:if (pix[-1] % 2 != 0):pix[-1] -= 1pix = 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 imagenewimg.putpixel((x, y), pixel)if (x == w - 1):x = 0y += 1else: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 databinstr = ''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 functionmain()

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

04.程序示例

数据编码

数据解码

输入图像

medium.png

输出图像

newImage.png

05.局限性

对于JPEG 图像,此程序可能无法正常工作,因为JPEG使用有损压缩,这意味着修改了像素以压缩图像并降低质量,因此发生数据丢失。

参考文献

https://www.geeksforgeeks.org/program-decimal-binary-conversion/

https://www.geeksforgeeks.org/working-images-python/

https://dev.to/erikwhiting88/let-s-hide-a-secret-message-in-an-image-with-python-and-opencv-1jf5

A GUI version of the program can be found here: https://github.com/goelashwin36/image-steganography

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

基于Pyhton的图像隐写术--如何隐藏图像中的数据相关推荐

  1. 基于R语言或Matlab直接读取压缩包中的数据

    写在前面 以gosif网站上的tiff数据为例. 该数据是地学上常用的一种数据,希望读取该网站上的gosif数据:http://data.globalecology.unh.edu/data/GOSI ...

  2. JPG图像exif和XPM信息中GPS数据姿态数据航向角数据的提取

    JPG图像的编码相关内容太多不在多说了大家随手能查很多资料. 今天重点说说图像数据中的GPS信息以及飞机.相机姿态角度数据提取. JPG作为复杂的图像数据很多人都知道存在一个叫做EXIF的数据规范,在 ...

  3. Hiding Images in Plain Sight: Deep Steganography 于众目睽睽之下隐藏图像:深度隐写术

    Hiding Images in Plain Sight: Deep Steganography 于众目睽睽之下隐藏图像:深度隐写术 1.摘要 隐写术是将秘密信息隐藏在另一条普通信息中的一种实践.通常 ...

  4. (5.1)【苹果系统中的数据隐藏】Spy Pix原理、使用方法、分析

    目录 一.简介: 1.1.概述: 1.2.隐藏程序 二.Spy Pix 2.1.简介: 2.2.原理: 2.3.使用方法: 第一步:确定图像 第二步:隐藏图像 2.4.数据隐藏方法分析 分析: 过程: ...

  5. 独辟蹊径,Python打造新型基于图像隐写术的C2通道

    0x00 前言 在11月下旬,我决定启动一个既有趣又有实际意义的项目,尝试提出了一种具有独特性的C2通道概念证明,其中涉及到隐写术和某种可信域名,而不再使用定制的基础结构.在我的研究过程中,广泛参考了 ...

  6. 于众目睽睽之下隐藏图像:深度隐写术

    博客首发至Marcovaldo's blog (http://marcovaldong.github.io/) 今天要介绍的是Google Research在NIPS 2017上发表的一篇论文,它的主 ...

  7. 在图像中隐藏数据:用 Python 来实现图像隐写术

    什么是"隐写术"? 隐写术是将机密信息隐藏在更大的信息中,使别人无法知道隐藏信息的存在以及隐藏信息内容的过程.隐写术的目的是保证双方之间的机密交流.与隐藏机密信息内容的密码学不同, ...

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

    作者 | 小白 来源 | 小白学视觉 隐写术是在任何文件中隐藏秘密数据的艺术. 秘密数据可以是任何格式的数据,如文本甚至文件.简而言之,隐写术的主要目的是隐藏任何文件(通常是图像.音频或视频)中的预期 ...

  9. 使用 Python 的图像隐写术

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天,世界正在见证前所未有的数据爆炸,我们每天产生的数据量确实令人 ...

最新文章

  1. django+mysql 配置一系列问题
  2. 04.search_template
  3. one microblog from 任志强
  4. 如何解决secureCRT里面的The remote system refused the connection.
  5. hdu-2844 Coins (混合背包+二进制优化)
  6. sqlmap 注入方式、使用总结
  7. python生成指定长度的列表_如何在python中创建固定大小列表?
  8. 【agc006f】Blackout(神仙题)
  9. Unity让物体以弧线的形式运动到规定的坐标
  10. Atiitt 使用java语言编写sql函数或存储过程
  11. vue获取子组件元素
  12. cjson读取json文件_JSON格式介绍和使用cJSON解析 | 学步园
  13. 配置urlrewrite不生效
  14. JetBrains PyCharm免费版
  15. 模糊神经网络应用实例,神经网络与模糊控制
  16. 为什么创造 Charj 语言?从十年以后的编程说起
  17. NAS信令学习笔记 ——GUTI
  18. 头条小程序,小游戏头像授权报错
  19. 不止Docker:8款容器管理开源方案
  20. 从PCB的结构与工艺理解阻焊(Solder mask)与助焊(Paster Mask)

热门文章

  1. Java 11 正式发布!
  2. 翻译们又要失业?Facebook最新无监督机器翻译成果,BLEU提升10个点!
  3. 阿里2018营收2502亿元,云计算业务增幅超100%
  4. 苹果曝光无人车新进展,这名华人工程师是主要贡献者
  5. 我要狠狠的反驳“公司禁止使用Lombok”的观点
  6. 漫画 | Bug是如何产生的?
  7. 短短的 RESTful API 设计规范
  8. SpringBoot+Mybatis+Swagger2环境搭建
  9. 分布式RPC框架性能大比拼
  10. IDEA中用好Lombok,撸码效率至少提升5倍