LSB图像隐写的python实现

【 实验目的】

了解信息隐藏中最常用的LSB算法特点,掌握LSB算法原理,设计并实现一种基于图像的LSB隐藏算法;了解如何通过峰值信噪比来对图像质量进行客观评价,并计算峰值信噪比。

【实验环境】

(1) Windows 7 以上操作系统;
(2) Python3.8、Pycharm 2021.2.2集成开发环境;
(3) PNG 彩色无损压缩图像文件。

【原理简介】

任何多媒体信息,在数字化时,都会产生物理随机噪,而人的感观系统对这些随机噪声不敏感。信息隐藏技术就是利用这个原理,通过使用秘密信息比特替换随机噪声,从而完成信息隐藏目标。
BMP 灰度图像的每个像素值为 8bit 二进制值,表示该点亮度。不同位平面对视觉影响不同,图像高位平面对图像感官质量起主要作用,去除图像最低几个位平面并不会造成画面质量的明显下降。利用这个原理可用秘密信息(或称水印信息)替代载体图像低位平面以实现信息嵌入。
本实验中算法选用最低位平面来嵌入秘密信息。最低位平面对图像的视觉效果影响最轻微,但很容易受噪声影响和攻击,解决办法可采用冗余嵌入的方式来增强稳健性。即在一个区域(多个像素)中嵌入相同的信息,提取时根据该区域中的所有像素判断。

【主要代码】

  • 隐藏加密部分
from PIL import Image
def plus(st):return st.zfill(8)
def get_key(strr):  # 实现对文字信息转成二进制tmp = strr  with open(tmp,"r",encoding='utf-8') as f:str = ''s = f.read()for i in s:  # 这里i直接由文本转换成ASCII格式if isinstance(i,int):str = str+plus(bin(i).replace('0b','')) else:str = str+plus(bin(ord(i)).replace('0b',''))return str
def mod(x,y): # 模除运算return x%y
def encry(str1,str2,str3):im = Image.open(str1)width = im.size[0]  # 获取图片的长,宽类似print("length:"+str(width)+"\n")height = im.size[1]print("width:"+str(height)+"\n")count = 0key = get_key(str2)
#     print(len(key))keylen = len(key)test=''test2=''for w in range(0,width):if count == keylen:breakfor h in range(0,height):pixel = im.getpixel((h,w))  # 获取指定长宽坐标像素的RGB值
#             print(pixel)a = pixel[0]  # Rb = pixel[1]  # Gc = pixel[2]  # Bif count == keylen:breaktest=test+str(mod(a,2))a= a-mod(a,2)+int(key[count])test2=test2+str(mod(a,2))count += 1if count == keylen:im.putpixel((h,w),(a,b,c))  # 将指定坐标的像素值用(a,b,c)代替breaktest=test+str(mod(b,2))b = b - mod(b,2) + int(key[count])test2=test2+str(mod(b,2))count += 1if count == keylen:im.putpixel((h,w),(a,b,c))breaktest=test+str(mod(c,2))c = c - mod(c,2) + int(key[count])test2=test2+str(mod(c,2))count += 1if count == keylen:im.putpixel((h,w),(a,b,c))breakif count % 3 == 0:im.putpixel((h,w),(a,b,c))im.save(str3)print('嵌入前:'+test)print('嵌入后:'+test2)

需要注意的是文本信息对应的编码格式要写对(错了好几次,难过)

上图是嵌入前的图片,下图是嵌入后的图片(能看出区别吗,不能。因为我放了两张一样的上去 LSB算法就是利用的视觉冗余原理,能看出来你就是下一个最强大脑啦)

  • 提取部分
def toasc(strr):return int(strr,2)def dest(le,str1,str2):  #le为所要提取的信息的长度,str1为加密载体图片的路径,str2为提取文件的保存路径a = ''b = ''im = Image.open(str1)length = le * 8width = im.size[0]height = im.size[1]print("length:"+str(width)+"\n")print("width:"+str(height)+"\n")count = 0  # 计数,判断信息是否提取完毕for h in range(0,height):if count == length:breakfor w in range(0,width):pixel = im.getpixel((w,h))
#             print('test:',int(str(pixel[0]),2))if count == length:breakif count % 3 == 0:count += 1  # 已经处理过了一位R/G/B上的信息b = b + str(mod(int(pixel[0]),2))  # 由于嵌入时,时按照RGB的顺序对每一位上的三个值进行嵌入,所以第一个要提取R上的信息if count == length:  # 当长度与目标信息的一致时,退出breakif count % 3 == 1:count +=1b = b + str(mod(int(pixel[1]),2))if count == length:breakif count % 3 == 2:count += 1b = b + str(mod(pixel[2],2))if count == length:breakwith open(str2,'w',encoding='utf-8') as f:print('提取:'+b)for i in range(0,len(b),8):
#             stra = ''stra = toasc(b[i:i+8])
#             print('test: ',isinstance(stra,int))
#             print(stra.decode())answera = chr(stra)print(answera)f.write(answera)
le = 30  # 由于未知长度,先设的大一些

结果是这样的:

经过解码得到隐藏信息如下

I am Admiral Hipper class cruiser

  • 计算图像峰值信噪比
import cv2 as cv
import math
import numpy as npdef psnr1(img1,img2):#compute mse# mse = np.mean((img1-img2)**2)mse = np.mean((img1/1.0-img2/1.0)**2)#compute psnrif mse < 1e-10:return 100psnr1 = 20*math.log10(255/math.sqrt(mse))return psnr1def psnr2(img1,img2):mse = np.mean((img1/255.0-img2/255.0)**2)if mse < 1e-10:return 100psnr2 = 20*math.log10(1/math.sqrt(mse))return psnr2imag1 = cv.imread('D://Machine Learning//data set//1234//3.jpg')# 图片路径不能有中文,否则会打不开,报错“ Nonetype……”
print (imag1.shape)
imag2 = cv.imread('D:/Machine Learning/data set/1234/answer.jpg')
#print(imag2.shape)
# imag2 = imag2.reshape(352,352,3)
#print(imag2.shape)
res1 = psnr1(imag1,imag2)
print("res1:",res1)
res2 = psnr2(imag1,imag2)
print("res2:",res2)

关于import cv2报错的问题,主要在库的安装上
opencv-python的安装可以参考这篇文章

如果觉得有用的话,可以点一波关注呀~

LSB图像隐写和峰值信噪比计算的python实现相关推荐

  1. 【图像隐写】基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取含Matlab源码

    1 简介 基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取. 1.1 LSB算法 根据LSB算法简单易实现的特点,结合在图像置乱技术中很好特性的Arnold变换.利用变化产生影子图像.通过 ...

  2. 深度学习之图像隐写去除(DDSP模型 Steganography Removal)

    文章目录 一 前言 二 论文内容 2.1 Abstract 2.2 Introduction 2.3 Background 2.3.1 Prior Work 2.3.2 Super Resolutio ...

  3. Deep Learning Hierarchical Representations for Image Steganalysis【Ye-Net:图像隐写分析的深度学习层次表示】

    Deep Learning Hierarchical Representations for Image Steganalysis [Ye-Net:图像隐写分析的深度学习层次表示] Abstract ...

  4. 基于深度学习的图像隐写分析综述 阅读

    背景 隐写术英文为Steganography. 现有的通信安全保障主要分为加密和信息隐藏:加密主要对秘密信息本身进行操作,但经过特殊处理后的明文更加容易受到第三方的怀疑;而信息隐藏则隐藏秘密数据的存在 ...

  5. Efficient feature learning and multi-size image steganalysis based on CNN【Zhu-Net基于高效特征学习与多尺度图像隐写分析】

    摘要 对于隐写分析,许多研究表明卷积神经网络比传统机器学习方法的两部分结构具有更好的性能.然而,仍然有两个问题需要解决:降低隐写分析特征映射的信噪比和对任意大小的图像进行隐写分析.一些算法需要固定大小 ...

  6. python图像隐写技术_图像隐写技术(Image Steganography)

    withopen( "input.jpg", "rb") asf: f_bytes = f.read print( f_bytes[: 2] ) print( ...

  7. 数字图像 - 图像隐写

    图像隐写(Image Steganography) 引言 空域隐写 频域隐写 调用python包隐写 总结 引言 今天学习了图像隐写,图像隐写就是把信息隐藏写入到数字图像里面,一般情况下看不出有什么, ...

  8. LSB低位隐写(菜鸡理解)

    LSB低位隐写 近期新学会的加密方式(不愧是我) LSB低位隐写原理 基于不可感知的要求,即数据的变化几乎不会引起使用的者的察觉,将水印信息嵌入到数据的最低有效位(Least Significant ...

  9. python图片隐写_CTF 图像隐写Python脚本处理

    CTF中经常会遇到很多图片的隐写题目需要使用脚本来解题,最常用到的就是使用python中的PIL库,所以如果要更好的解出图片隐写相关处理的题目,掌握好这个库的使用是必要的.本期就来给大家介绍下这个库的 ...

  10. 图像隐写分析——生成含密图像 Stego Image

    文章目录 一 图像隐写分析的数据集 二 含密图像展示 三 结语 一 图像隐写分析的数据集   小编本科毕设的题目是<基于深度学习的图像隐写分析>,图像隐写分析问题本质上是一个二分类(bin ...

最新文章

  1. they're hiring
  2. Android Retrofit @Streaming 注解失效
  3. Ribbon客户端负载均衡介绍
  4. HBase不同版本集群之间数据迁移
  5. IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权
  6. 局部变量、全局变量、堆、堆栈、静态和全局
  7. archives_do.php,织梦后台文章管理中增加批量添加tag标签功能
  8. IIS Log的位置
  9. 删库跑路事件发生,SaaS 云服务如何守护数据安全?
  10. DNN Navisuite菜单模块原始XML文件的格式
  11. 20.MySQL 常用命令
  12. 阿里云马涛:云原生时代的开源操作系统长什么样
  13. 浅述SATA接口Raid、AHCI、IDE三种模式
  14. 如何进行网站代备案?
  15. 运维之DNS域名解析服务基础概念与Bind9安装
  16. word表批量处理小技巧(python+宏)
  17. STM32 CRH和CRL设置方向
  18. 程序员副业接单做私活避坑指南
  19. GEE开发之MODIS_NDVI年均值数据分析
  20. [心情故事]一九九九年的年终工作总结——318冒险日志之初心者の道场

热门文章

  1. CS224N 笔记一
  2. python 压力测试
  3. ssm教务排课系统MVC学校专业选修课程安排选课信息jsp源代码数据库mysql
  4. 自然语言处理技术的一些应用
  5. Oracle账户被锁定后如何解锁
  6. 极光java sdk_极光使用服务端使用java sdk 出现异常 日志如下
  7. mysql 字段去除空格
  8. 总结:Postman测试、IP:POST测试、Postman转换到python测试(Linux下的docker应用部署web容器并存储数据到mysql,调用API)
  9. Win10取消开机密码
  10. 将HTML网页存储为图片 区域截图 截长屏 截全屏