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

发布于:2022-11-29 ⋅ 阅读:(314) ⋅ 点赞:(0)

目 录
摘 要 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 sleep


class 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 = path1
        self.output_path = path2
        self.data_path = path3

    def set_method(self, method):
        self.method = method

    def 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_())

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

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到