基于Python的图片隐写算法设计与实现

news/2024/2/22 17:50:08

目 录
摘 要 1
第一章 绪论 2
1.1 研究背景 2
1.1.1 信息隐藏技术 2
1.1.2 图像格式 2
1.1.3 信息隐写的国内外发展 3
1.2 研究意义 3
1.3 本文研究的主要内容 3
第二章 理论研究与分析 4
2.1 图像隐写术 4
2.1.1 图像隐写术 4
2.1.2 图像隐写的流程 4
2.2图像隐写算法 5
2.2.1 F5隐写算法介绍和分析 5
2.2.2 OutGuess隐写算法介绍和分析 5
2.2.3 LSB隐写算法介绍和分析 5
2.3 总结 6
第三章 LSB算法的实现 7
3.1 LSB隐写算法流程 7
3.2 LSB隐写算法实现 8
3.2.1 界面设计 8
3.2.2 信息隐写过程设计实现及核心代码 8
3.2.3 信息提取过程设计实现及核心代码 12
3.3本章小结 15
第四章 作品测评 16
4.1 LSB算法秘密信息嵌入和提取的功能测试 16
4.1.1 测试目的 16
4.1.2 测试方案 16
4.1.3 测试结果 17
4.2 LSB算法不可见性测试 17
4.2.1 测试目的 17
4.2.2 测试方案 17
4.2.3测试结果 18
4.3 LSB算法嵌入容量测试 18
4.3.1 测试目的 18
4.3.2 测试方案 18
4.3.3 测试结果 21
参考文献 22
本文在研究图像隐写技术背景以及国内外发展前景的基础上,以BMP格式数字图像为载体,实现了LSB隐写算法,具体研究内容有:
(1)分析F5隐写算法、OutGuess隐写算法、LSB隐写算法等隐写算法的原理和优缺点。
(2)使用Python,实现LSB隐写算法,主要包括秘密信息嵌入和秘密信息提取。
(3)采用不同分辨率的BMP格式图像,对LSB算法的不可见性和嵌入容量进行性能测试。
通过Python语言对图像隐写界面进行设计,如图3-3所示,操作图像进行信息隐写和提取的步骤如下:
①首先点击“选择普通照片”选择“1.bmp”,“信息隐写”区域显示“1.bmp”图像;
②然后在输入隐写信息区域输入需要隐写的信息,点击“确认”按钮;
③再确认隐写信息之后点击“开始隐写”按钮,会弹窗显示“隐写成功”,之后在“信息提取”区域显示隐写后的载体图像,本文转载自http://www.biyezuopin.vip/onews.asp?id=14212并且在同一目录下会生成载体图像“2.bmp”;
④点击“选择载体图片”选择“2.bmp”之后点击“开始提取”按钮,会弹窗显示“提取成功”,之后会在原先显示“信息安全大赛作品赛特别制作”字样区域显示隐写的信息。
LSB(Least Significant Bit)隐写算法,中文译名为最低有效位,是指一个二进制数字中的最低位。LSB隐写算法的基本思想是用待嵌入的隐私信息取代载体图像数据的LSB,构成载密图像。又因为LSB对图像的外部特征影响很小,所以人难以用肉眼看出载密图像的变化。然而,人眼不仅对LSB位不可感知,对比LSB位更高的某些位同样不可感知,这就意味着这些更高的位同样可以用嵌入隐秘信息。

# encoding = utf-8
import sys
from widget import Ui_Widget
from dialog import Ui_Dialog
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import steg
from time import sleepclass MyDialog(QDialog, Ui_Dialog):def __init__(self):super(MyDialog, self).__init__()self.setupUi(self)self.progressBar.setMinimum(0)self.progressBar.setMaximum(0)self.okpushButton.pressed.connect(self.on_ok_button_clicked)def on_ok_button_clicked(self):self.hide()class MyWindow(QWidget, Ui_Widget):def __init__(self):super(MyWindow, self).__init__()self.setupUi(self)self.setWindowTitle("steg")self.lsbradioButton.setChecked(True)self.resultTextEdit.setReadOnly(True)self.carrierpushButton.pressed.connect(self.carrier_button_clicked)self.outputpushButton.pressed.connect(self.output_button_clicked)self.datapushButton.pressed.connect(self.data_button_clicked)self.startStegpushButton.pressed.connect(work)def carrier_button_clicked(self):path = QFileDialog.getOpenFileName(self, "打开", "", "IMAGE (*.bmp, *.png)")self.carrierlineEdit.setText(path[0])def output_button_clicked(self):path = QFileDialog.getSaveFileName(self, "保存", "out.bmp", "IMAGE (*.bmp, *.png)")self.outputlineEdit.setText(path[0])def data_button_clicked(self):path = QFileDialog.getOpenFileName(self, "打开", "", "TEXT (*.txt)")self.datalineEdit.setText(path[0])class WorkThread(QThread):trigger = pyqtSignal()def __int__(self):super(WorkThread, self).__init__()self.trigger.connect(work_stop)def set_path(self, path1, path2, path3):self.carrier_path = path1self.output_path = path2self.data_path = path3def set_method(self, method):self.method = methoddef run(self):w.resultTextEdit.append("请稍后...")# steg.mlsb("./data/4_1.bmp", "./data/out.bmp", "./data/data.txt")if self.method == 0:print("lsb")result, ratio = steg.gary_bitmap_lsb(self.carrier_path, self.output_path, self.data_path)if result:w.resultTextEdit.append("隐写成功, 数据量占比:{:.2%}".format(ratio))else:w.resultTextEdit.append("隐写失败, 数据量占比:{:.2%}".format(ratio))print(ratio)if self.method == 1:print("mlsb")result, ratio = steg.mlsb(self.carrier_path, self.output_path, self.data_path)if result:w.resultTextEdit.append("隐写成功, 数据量占比:{:.2%}".format(ratio))else:w.resultTextEdit.append("隐写失败, 数据量占比:{:.2%}".format(ratio))print(ratio)my_dialog.hide()self.trigger.emit()def show_dialog():my_dialog.setWindowTitle("请稍后")my_dialog.setWindowModality(Qt.ApplicationModal)my_dialog.exec_()def work():if w.lsbradioButton.isChecked():thread.set_method(0)elif w.mlsbradioButton.isChecked():thread.set_method(1)thread.set_path(w.carrierlineEdit.text(), w.outputlineEdit.text(), w.datalineEdit.text())thread.start()show_dialog()def work_stop():# my_dialog.destroy()# my_dialog.okpushButton.setCheckable(True)# my_dialog.okpushButton.click()w.resultTextEdit.append("SUCCESS!")if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.show()my_dialog = MyDialog()thread = WorkThread()sys.exit(app.exec_())

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


https://dhexx.cn/news/show-25400.html

相关文章

Linux三剑客grep、awk和sed

grep,sed 和 awk是Linux/Unix 系统中常用的三个文本处理的命令行工具,称为文本处理三剑客。本文将简要介绍这三个命令的基本用法以及它们在Windows系统中的使用方法。 目录管道grep定义选项参数实例1:查找文件内容,显示行号实例2&…

基于html的旅游网站的设计与实现

目 录 第一章 绪论 1 1.1. 选题背景及意义 1 1.2. 国内外研究现状 1 1.3. 研究主要内容 2 第二章 开发工具的选用及介绍 3 2.1. 网页开发技术 3 2.1.1. HTML简介 3 2.1.2. DIVCSS简介 3 2.1.3. bootstrap 3 2.2. 网页制作工具 4 2.2.1. Photoshop 4 2.2.2. Dreamweaver 4 2.2.3…

Appium控件交互

与Web元素操作一样(参考Selenium Web元素操作),定位到APP控件元素后,可以对控件进行一系列的操作,实现与APP交互,比如点击、文本输入、元素属性获取等。 目录元素操作元素常用操作方法Python测试实例元素属…

基于PLC的棒料自动上料车削加工装置设计

目 录 1 绪论 1 1.1自动上下料机现状 1 1.2设计目的 1 1.3 国内外研究方向 2 1.4 设计原则 2 2 棒料自动上料车削加工装置方案设计 3 2.1自动上料车削加工装置的总体设计 3 2.1.1 车削加工装置总体结构的类型 3 2.1.2 设计具体采用方案 4 2.2 车削加工装置腰座结构的设计 4 2.…

Android WebView测试

混合应用中包含 Web 视图的应用,在 Appium 介绍及环境安装 中介绍了appium支持WebView测试,本文将分享Android 混合页面的测试方法。 目录WebView测试环境准备手机端PC端查看手机浏览器版本查看手机webview版本客户端代码WebView元素定位Android混合页面…

人脸识别(四)

源码位置:https://github.com/comhaqs/face_find.git 分支: develop_face_recognition opencv的人脸识别模块现在是放在另外一个库opencv_contrib里,需要编译到opencv里才可以使用,故这里将opencv和opencv_contrib的源码都下下来…

基于RFID的学生一卡通管理系统的设计与实现

目 录 摘 要 I ABSTRACT II 第1章 绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 1 1.3研究主要内容 2 第2章 系统设计 4 2.1需求分析 4 2.1.1可行性分析 4 2.1.2功能需求概述 5 2.1.3 UML用例图 5 2.2学生一卡通的基本组成结构 7 2.2.1天线 7 2.2.2阅读器 7 2.2.3电子标签 11…

自动遍历测试之Monkey工具

某些移动APP业务线多,流程复杂,且产品迭代速度快,在回归测试中涉及到大量用例,工作量大,解决这个问题的一个可行方法是使用自动遍历测试,可以降低用例维护成本,尽可能的自动化覆盖回归业务。 目…

平昌县网上书城系统设计与实现

目 录 第一章 概述 1 1.1 开发背景 1 1.2 开发环境 2 1.3 开发工具 2 1.3.1 MyEclipse 2 1.3.2 Navicat 3 1.3.3 MySQL 3 第二章 需求分析 5 2.1 总体需求 5 2.3 功能需求 6 2.4 性能需求 6 2.5 运行需求 6 2.6 其他需求 7 2.7 可行性分析 7 2.7.1技术可行性 7 2.7.2 经济可行性…

Linux系统介绍:内核、shell及软件包管理

目录Linux内核版本查看系统版本shell常见 shell运行 shell查看Linux系统信息查看系统位数查看内存信息查看CPU信息Linux软件包管理源码编译安装RPMRPM包安装rpm命令其它用法yumDPKGDPKG 命令安装apt查看历史命令historyLinux 文件句柄Linux系统主要包括3层, 硬件&am…