python图像处理–隐写

二、图像隐写

2.1介绍

隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做 Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作 Steganographia,该书书名源于希腊语,意为”隐秘书写”。利用图像文件的特性,我们可以把一些想要刻意隐藏的信息或者证明身份、版权的信息隐藏在图像文件中。图像是由像素组成的,但图像文件除了保存像素信息之外,还可以存储一些额外的描述信息。

2.2思路

创建一个相同大小相同像素的图片副本,获取原图片像素
·使像素最低位变为偶数(使最低有效位为0)
·将需要隐藏的信息转换为固定长度的二进制字符串,并且对于单字节字符,当位数不够8时,在最高位补0
·将二进制的待隐藏信息依次与图片中每个像素的 r、g、b进行相加,将其编码到图片中

2.3实验步骤

2.3.1 先导入Pillow库。

python图像处理--隐写

Python用于数字图像处理时,常用的一个第三方库是PIL,全称为:Python Imaging Library,是Python平台一个功能较强而简单易用的图像处理库。在图像处理方面,Pillow包含了基本的功能,包括点操作、用卷积核进行过滤、色彩空间转换等。该库也支持图像的大小调整、旋转和任意仿射变换,还可以通过直方图方法从图像中提取一些统计信息,用于自动对比度增强和全局统计分析。
PIL中最重要的类是Image类,在一个同名的模块中定义。可以通过多种方式创建此类的实例,例如从图像文件加载图像,处理其他图像,或创建新图像。

; 2.3.2编码

函数encodedataInImage(),将隐藏信息编码到此函数中,其有两个参数,分别是用作载体的图片对象和需要被隐藏的字符串。

python图像处理--隐写

函数makeImageEven()的功能是得到一个PIL图像,并且更改所有值为偶数,即使最低有效位为0.

python图像处理--隐写

函数constLenBin()将十进制数值序列转换为二进制字符串序列。

python图像处理--隐写

函数解释:
image.getdata()函数的返回值是一个sequence(连续)对象,sequence(连续)对象的每一个元素对应一个像素点R,G,B值,getdata ()函数的返回值取决于图像的模式,虽然这个函数返回的是图像的每个像素点的颜色值,但是由于图像的模式不同,颜色值的形式也不同。比如说如果图像的模式是” RGB “等模式,则颜色值如同上面代码所示,一个像素点的颜色值由( R , G , B )组成。如果图像的模式是”1″,” L “,” P “等模式,因为这些模式是8bit表示一个像素,所以这些模式的颜色值的范围是在0255,所以 getdata ()的返回值的元素就不是上述的( R , G , B )的形式了,而是0~255中的任意一个数。
list()函数将sequence(连续)对象转为普通的sequence(连续)对象,得到一个[(r,g,b,t)]列表。
移位:使像素最低位变为偶数。将每个像素值先向右移1位再向左移1位,这样如果是奇数则去1补0变成偶数,如果是偶数则去0补0仍为偶数。
Image.new()函数给定的模式和大小创建一个新图像,返回的是Image对象。尺寸以(width, height)-tuple,以像素为单位,还有一个color参数。主要用于图像中粘贴或绘制东西。参数mode:用于新图像的模式(可能是RGB,RGBA);参数size:包含(宽度,高度)以像素为单位的2元组;参数color:图像使用什么颜色。默认为黑色。如果给出的话,对于单波段图像,颜色作为单个值给出,对于多波段图像,颜色作为一个元组给出(每个波段一个值)。
Image.putdata()将像素数据复制到该图像,返回的是一个图像。此方法将数据从序列对象复制到图像中,从左上角(0,0)开始,一直进行到图像或序列结束为止。标度和偏移值用于调整序列值:像素=值标度+偏移。
join()将序列中的元素以指定的字符连接生成一个新的字符串。
map(constLenBin,Bytearray(data, ‘utf-8’))对数值序列中的每一个值应用constLenBin()函数,将十进制数值学列转换为二进制自字符转序列。utf-8编码的中文字符一个就占了3个字节,那么四个字符共占3×4=12个字节,于是共有12个数字。
bin(x)将整数转换为前缀为”0b”的二进制字符串。结果是一个有效的 Python 表达式。如果x不是int对象,则必须定义一个返回整数的方法。
if len(binary)>len(image.getdata())
4 :一个 index 对应的是 (r, g, b, t) 四个像素值,所以 index * 4。又由于要用匿名函数 binary进行编码,所以需要判断index * 4的长度是否小于len(binary)。
raise()抛出异常,当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。异常/错误对象必须有⼀个名字,且它们应是Error或Exception类的⼦类。

Original: https://blog.csdn.net/weixin_52969711/article/details/127078258
Author: 贮贮
Title: python图像处理–隐写

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/633581/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球