如何使用 Python 隐藏图像中的数据
作者 | 小白
来源 | 小白学视觉
隐写术是在任何文件中隐藏秘密数据的艺术。
秘密数据可以是任何格式的数据,如文本甚至文件。简而言之,隐写术的主要目的是隐藏任何文件(通常是图像、音频或视频)中的预期信息,而不实际改变文件的外观,即文件外观看起来和以前一样。
在这篇文章中,我们将重点学习基于图像的隐写术,即在图像中隐藏秘密数据。
但在深入研究之前,让我们先看看图像由什么组成:
像素是图像的组成部分。
每个像素包含三个值:(红色、绿色、蓝色)也称为 RGB 值。
每个 RGB 值的范围从 0 到 255。
现在,让我们看看如何将数据编码和解码到我们的图像中。
编码
有很多算法可以用来将数据编码到图像中,实际上我们也可以自己制作一个。在这篇文章中使用的一个很容易理解和实现的算法。
算法如下:
对于数据中的每个字符,将其 ASCII 值转换为 8 位二进制 [1]。
一次读取三个像素,其总 RGB 值为 3*3=9 个。前八个 RGB 值用于存储一个转换为 8 位二进制的字符。
比较相应的RGB值和二进制数据。如果二进制数字为 1,则 RGB 值将转换为奇数,否则为偶数。
第 9 个值确定是否应该读取更多像素。如果有更多数据要读取,即编码或解码,则第 9 个像素变为偶数;否则,如果我们想停止进一步读取像素,那就让它变得奇数。
重复这个过程,直到所有数据都被编码到图像中。
例子
假设要隐藏的消息是‘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)]
第 1 步
H 的 ASCII 值为 72 ,其二进制等效值为 01001000 。
第 2 步
读取前三个像素。
(27, 64, 164), (248, 244, 194), (174, 246, 250)
第 3 步
现在,将像素值更改为奇数为 1,偶数为 0,就像在二进制等效数据中一样。
例如,第一个二进制数字是0,第一个 RGB 值是 27 ,它需要转换为偶数,这意味着 26 。类似地,64 被转换为 63 因为下一个二进制数字是1 所以 RGB 值应该是奇数。
因此,修改后的像素为:
(26, 63, 164), (248, 243, 194), (174, 246, 250)
第4步
由于我们必须对更多数据进行编码,因此最后一个值应该是偶数。同样,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)]
解码
对于解码,我们将尝试找到如何逆转之前我们用于数据编码的算法。
同样,一次读取三个像素。前 8 个 RGB 值为我们提供了有关机密数据的信息,第 9 个值告诉我们是否继续前进。
对于前八个值,如果值为奇数,则二进制位为 1 ,否则为 0 。
这些位连接成一个字符串,每三个像素,我们得到一个字节的秘密数据,这意味着一个字符。
现在,如果第 9 个值是偶数,那么我们继续一次读取三个像素,否则,我们停止。
例如
让我们开始一次读取三个像素。
考虑我们之前编码的图像。
[(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 。这个过程一直持续到 8 个 RGB 值。
第 3 步
将所有二进制值连接后,我们最终得到二进制值:01001000。最终的二进制数据对应于十进制值 72,在 ASCII 中,它代表字符 H 。
第 4 步
由于第 9 个值是偶数,我们重复上述步骤。当遇到的第 9 个值是奇数时,我们停止。
结果,我们得到了原始信息,即 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 图像库,它使我们能够在 Python 中对图像执行操作。
程序执行
数据编码
数据解码
输入图像
输出图像
局限性
该程序可能无法对 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 code along with the dependencies can be found here: https://github.com/goelashwin36/image-steganography
往
期
回
顾
资讯
谷歌使出禁用2G大招
技术
干货满满的python实战项目!
技术
25个Python文本处理案例
技术
11款可替代top命令的工具!
分享
点收藏
点点赞
点在看
相关文章:

php 的 危 险 参 数
hpinfo() 功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec()。 危险等级:高 exec() 功能描述:允许执行一个外部…

开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系
小蚂蚁说: 数据、消息、微服务是蚂蚁金服自主研发的金融级分布式中间件 SOFA (Scalable Open Financial Architecture)的三大方向。 一个多月前,蚂蚁金服开源了 SOFABoot 和 SOFARPC 两个组件,受到了社区的热烈欢迎&am…

System.Web.Caching.Cache类 缓存 各种缓存依赖
原文:System.Web.Caching.Cache类 缓存 各种缓存依赖Cache类,是一个用于缓存常用信息的类。HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例。 一、属性 属性说明Count获取存储在缓存中的项数。EffectivePercentagePhysicalMemoryLimit获取在 ASP.NE…

Python 可视化近 90 天的百度搜索指数 + 词云图
作者 | 叶庭云来源 | AI庭云君一、简介 在实际业务中我们可能会使用爬虫根据关键词获取百度搜索指数历史数据,然后进行对应的数据分析。百度指数,体验大数据之美。但要获取百度指数相关的数据,困难如下:不是静态网页,并…

php常用比较函数区别表
php常用比较函数区别表 表达式 empty() is_null() isset() if($x) $x "" TRUE FALSE TRUE FALSE $x null TRUE TRUE FALSE FALSE $x is undefined TRUE TRUE FALSE FALSE(报E_NOTICE错) $x array() TRUE FALSE TRUE FALSE $x false TRUE FALSE TRUE FALSE $x 0 …

实战分享:淘宝Web 3D应用与游戏开发
大家下午好!我们今天讲个比较有意思的话题,这个话题在业界被谈及得比较少。大家在座有做过移动端开发的同学吗?请举个手,人还挺多的。那做过3D应用的同学请举个手,有用过Threejs的请举个手,做过游戏的呢..人…

常见NoSQL系统使用场景分析
•Cassandra •特性:分布式与复制的权衡\根据列和键范围进行查询\BigTable类似的功能:列,列族\写比读快很多 •最佳适用:写操作较多,读比较少的时候。如果你的系统都是基于Java的时候。 •应用场景:银行&am…

再一次输给了AI,弯道急速超车、登上 Nature 封面
作者 | 学术头条来源 | 学术头条人工智能(AI)的很多潜在应用,涉及与人类交互时做出更优化的实时决策,而竞技或者博弈类游戏,便是最佳的展示舞台。近日,发表在《自然》杂志上的封面文章报告称,AI…

maven 多环境打包
2019独角兽企业重金招聘Python工程师标准>>> 1.在项目的pom中添加 <build><resources><!-- Resource Filter --><resource><directory>src/main/resources</directory><filtering>true</filtering></resource&g…

Sass函数:Sass Maps的函数-map-has-key($map,$key)
map-has-key($map,$key) 函数将返回一个布尔值。当 $map 中有这个 $key,则函数返回 true,否则返回 false。 前面的示例,当 $key 不在 $map 中时,使用 map-get($map,$key) 函数将返回一个 null 值。但对于开发人员,并看…
Memcache内存分配策略
转自:http://tank.blogs.tkiicpp.com/2010/12/14/memcache%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e7%ad%96%e7%95%a5/ 一、Memcache内存分配机制关于这个机制网上有很多解释的,我个人的总结如下。 Page为内存分配的最小单位。 Memcached的内存分配以page…

论排列组合,持续更新
今天刚好碰到了一个排列组合问题,因为之前对这方面的学习比较少,所以用的非常蠢的方法做了四位数中取三位的排列,写的程序太有局限性,源码如下#define _CRT_SECURE_NO_WORNINGS 1#include<stdio.h>#include<stdlib.h>…

Python 中少为人知的 10 个安全陷阱
作者:Dennis Brinkrolf译者:豌豆花下猫Python猫原题:10 Unknown Security Pitfalls for Python英文:https://blog.sonarsource.com/10-unknown-security-pitfalls-for-pythonPython 开发者们在使用标准库和通用框架时,…
JS+CSS3 360度全景图插件 - Watch3D.js
日常闲扯 从上一篇文章到这篇中间快过了一年了,时间真滴过得快。不是在下中间没想过写新的文章,而是自己确实变懒了(体重1 1 1 1....) 。。OTL。。。不过到最后觉得还是需要写点东西,不然人就真废了,于是便有了这样一个插件&#…

CQRS学习——最小单元的Cqrs(CommandEvent)[其一]
【说明:博主采用边写边思考的方式完成这一系列的博客,所以代码以附件为准,文中代码仅为了说明。】 结构 在学习和实现CQRS的过程中,首要参考的项目是这个【http://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html】。所以Dpfb…

PHP APC安装与使用
最简单的方法,找到php安装目录的pecl 自动安装: # /usr/local/php/bin/pecl install apc 下面按提示一步步完成即可 配置/etc/php.ini 末尾加入extensionapc.so 手动安装: 官网 http://cn2.php.net/manual/zh/book.apc.php 下载http://p…

AIphaCode 并不能取代程序员,而是开发者的工具
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) DeepMind 是 AI 研究实验室,它引入了一种深度学习模型,可以生成具有显著效果的软件源代码。该模型名为 AIphaCode,是基于 Transformers,OpenAI 在其代码生…

源码阅读:SDWebImage(六)——SDWebImageCoderHelper
该文章阅读的SDWebImage的版本为4.3.3。 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理。 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算两个整数a和b的最大公约数*/ static NSUInteger gcd(N…

基于 OpenCV 的网络实时视频流传输
作者 | 努比来源 | 小白学视觉大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它们具有更高的分辨率并降低了布线成本。在本文中,我们将重点介绍IP摄像机。IP摄像机是一种数字 摄…

【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程...
下周就是十一了,无论是学生党还是工作党,大家的大概都会有点心不在焉,为了让大家更好的心不在焉,更好的在十一前最后一周愉快的摸鱼,今天就写一个如何让Chrome(google浏览器)运行安卓APK应用的教…

PHP安装parsekit扩展查看opcode
也可以通过VLD查看,具体请看本人写的http://blog.csdn.net/21aspnet/article/details/7002644安装parsekit扩展 http://pecl.php.net/package/parsekit 下载最新的 #wget http://pecl.php.net/get/parsekit-1.3.0.tgz 安装过程省略 可以参考 本人写的http://blog.c…

group by 查找订单的最新状态 join
Order:snProcedures:sn,status1、 有订单表和流程表。订单表含有订单的详细信息【假设没有订单状态哈】,每个订单有好多种状态:已付款、处理中、待收货等等。现在的需求可能是查询订单状态是待收货的所有订单的信息。【答】先找到…

Xcache安装与使用
官网:http://xcache.lighttpd.net 最新版本下载地址:http://xcache.lighttpd.net/wiki/Release-1.3.2 安装: # wget http://xcache.lighttpd.net/pub/Releases/1.3.2/xcache-1.3.2.tar.gz # tar zvxf xcache-1.3.2.tar.gz # cd xcache-1.3…

安装mysql_python的适合遇到mysql_config not found解决方案(mac)
为什么80%的码农都做不了架构师?>>> 安装mysql_python的适合遇到mysql_config not found解决方案(mac) 用pip安装MySQL-python时候遇到报错: ------我是分割线------ Complete output from command python setup.py e…

推荐 6 个好用到爆的 Pycharm 插件
作者 | 小欣来源 | Python爱好者集中营相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的,今天小编来分享几个好用到爆的Pycharm插件,在安装上之后,你的编程效率、工作效率都能够得到极大地提升。安装方法插件的安装方法一…
Kibana 用户指南(使用Flight仪表盘探索Kibana)
使用Flight仪表盘探索Kibana 你是Kibana的新手并希望尝试一下,只需单击一下,你就可以安装Flights样本数据并开始与Kibana交互。 Flight数据集包含四家航空公司的数据,你可以从Kibana主页加载数据和预配置的仪表盘。 在主页上,单击…

php扩展xdebug安装以及用kcachegrind系统分析
一:安装 安装方法一:编译安装1、下载PHP的XDebug扩展,网址:http://xdebug.org/# wget http://pecl.php.net/get/xdebug-2.1.2.tgz# tar -xzf xdebug-2.1.2.tgz# xdebug-2.1.2# cd xdebug-2.1.2# /usr/local/php/bin/phpize# ./con…

Meta AI 新研究,统一模态的自监督新里程碑
作者 | 青苹果来源 | 数据实战派虽然 AI 领域不断涌现出新的突破和进展,却始终难以逃离单一领域的束缚——一种用于个性化语音合成的新颖方法,却并不能用于识别人脸的表情。为了解决这个问题,不少研究人员正在致力于开发功能更强大、应用更广…

细说Debug和Release区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个…

26期20180601目录管理
6月1日任务2.1/2.2 系统目录结构2.3 ls命令2.4 文件类型2.5 alias命令系统目录结构ls - list所有的用户在系统里都有自己的家目录,比如现在登陆的是root用户,登陆进去就是在root的家目录中,可以看到之前创建的公钥文件也是在这。但是如果是其…