资源下载地址:https://download.csdn.net/download/sheziqiong/85676481
资源下载地址:https://download.csdn.net/download/sheziqiong/85676481

二值图像数字水印技术的实现

一 实验概述:

1.1 课程设计题目:

题目要求对给定的一种简单的二值图像的数字水印算法编程实现。

1.2 课程设计目的:

对数字水印技术建立一定的认识,能建立位矩阵、位向量等 ADT,并能用这些 ADT 完成给定二值图像数字水印的嵌入和抽取。

1.3 系统主要内容与功能:

1.3.1 设计内容:

具体包括以下内容:

(1)图像的读取与保存,及相应的矩阵和向量的运算;

(2)二值图像水印算法的实现;

(3)软件的界面和接口设计,信号发送和槽位的设计;

(4)软件鲁棒性分析、算法鲁棒性分析和相关总结。

1.3.2 设计功能:

(1)设计合理的数据结构,编程实现算法;

(2)给定测试图片,按照指定的 bmp 格式,保存于外存中。

1.3.3 系统类图:

表 1 系统类图

1.3.4 属性和方法定义:

类名 成员类型 类型 成员名 描述
watermark 属性 BITMAPINFODEADER BMIH BMP 图像信息头
BITMAPFILEHEADER BMFH BMP 图像文件头
int biWidth BMP 图像宽
int biHeight BMP 图像高
int biBitCount 图像类型,每像素位数
int lineByte 图像数据每行字节数
RGBQUAD* pColorTable BMP 图像调色板信息
方法 QString array2byte 秘钥序列转换为二进制信息
QString array2str 秘钥序列转换为字符串
byteArray byte2Array 二进制信息转秘钥序列
byteArray decodeImg 使用水印秘钥编码原图
uchar* edgeExtract 获得从 buffer 提取到的边缘图像,用作添加水印位置的参考
byteArray encode 使用秘钥序列加密二进制
byteArray generateKey 生成秘钥序列
uchar* readBmp 读取 BMP 图片
byteArray str2Array 字符串转换为秘钥序列
uchar* substract 获得 buffer1 和 buffer2 相减得到的结果
uchar* translation 获得原 buffer 图像右移 x_off 个单位,下移 y_off 个单位后得到的图像
uchar* watermarkImg 由边缘图像和原图获得水印编码后的图像
bool savebmp 保存编码水印信息的图像
MainWindow 属性 Ui::MainWindow* ui 维护图形界面
QPixmap image 维护读入的 BMP 图像
byteArray key 秘钥序列
uchar* dst’ 维护编码水印的目标图像
方法 MainWindow(QWidget *parent = 0) 构造函数,初始化界面
~MainWindow() 析构函数,释放内存(Ui)
槽位 void on_pushButtonBrowse_clicked() 浏览、选择图像
void on_lineEdit_textChanged(const QString &arg1) 修改水印信息
void on_pushButtonEncode_clicked() 水印信息编码 BMP 图像
void on_pushButtonDecode_clicked() 解码水印 BMP 图像,获取水印信息

表 2 程序的属性和方法定义

1.3.5 实验环境与工具:

(1)操作系统:Ubuntu 16.04 LTS;

(2)开发工具:Qt、Qt Creator;

(3)实现语言:C++。

二 实验原理:

2.1 图像水印技术简述:

随着互联网和信息技术的快速发展,近年来数字内容的未授权获取,传输,操纵和分发的问题变得越来越严重。信息安全研究引起了人们的广泛关注。除了一般采用的数字加密算法之外,近年来用于信息安全的影像视觉算法包括光学图像加密、认证和水印算法被广泛地研究和应用起来。影像视觉信息安全算法通常拥有并行高速处理和多维能力的优势。信息隐藏技术,即图像水印技术,也称隐写技术是一种隐蔽性地改变载波信号以嵌入隐藏消息,即水印信号的技术。可以对各种各样类别的信号执行信息隐藏,其中包括但不限于:音频信号、图像信号和视频信号。信息隐藏技术(图像水印技术)允许将特定的信息加入到需要保护的媒体信息中,加入的信息一般为具有特定意义的内容,如版权所有者信息、发行标志、特定代码等。

而图像水印技术也因而成为了数字图像处理专业当下或未来重要的研究领域,在知识产权的保护等方面有着广泛的应用前景。为了确保大规模在线分发的多媒体内容的版权和知识产权,我们需要通过有效的保护来控制分发和传播,控制来自盗版用户或未经授权普通用户的恶意操纵和恶意拷贝传播。

为了提高效率,水印需要良好的隐蔽性,并且拥有嵌入高容量和有效载荷,能够在确保有效载荷的安全传输的同时,对最常见的图像处理(恶意或非恶意)进行鲁棒性处理。此外水印技术还有以下的特点:

(1)水印后的主图像不应存在显著地信息损坏和分辨率降低;

(2)水印应具有在主图像中良好的隐蔽性;

(3)水印应具有良好的鲁棒性,不易从主图像中被损坏。水印应可以承受不同类型的信息损坏打击,例如 JPEG 压缩、裁剪、旋转、缩放、噪声、滤波运算和模糊运算。应该特别指出,该特点仅适用于一部分鲁棒性极好的水印算法中;

(4)未经授权的用户/盗版用户应很难非法访问到该水印信息。

2.2 图像处理技术简述:

在图像水印技术实现时,需要大量运用到图像处理知识和技术。数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展;二是数学的发展(特别是离散数学理论的创立和完善);三是广泛的农牧业、林业、环境、军事、工业和医学等方面的应用需求的增长。

在图像水印技术中,本着不损坏原有图像质量的原则,该算法需要对图像快速的读写能力、对分块图像稳定和鲁棒的运算能力,以及优秀的边缘提取能力。

2.3 Qt 及 Qt Creator:

Qt 是一个跨平台的 C++ 图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形用户界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。

作为一个优秀的 C++ 框架,由于其优秀的信号与槽机制,Qt 被广泛地应用于软件编写中。本次课程设计将采用 Qt 和 Qt Creator 作为程序界面的编写工具。

2.4 相关算法简介:

数字图像水印算法是将一段信息附加在图像上的算法,其中被附加信息的图像被称为主机图像(host image),简称主图像。根据水印算法的鲁棒性,水印算法可以分为鲁棒/稳健的水印算法(robust watermarking)和脆弱的水印算法(fragile watermarking),其中绝大多数的数字水印算法都属于前者。如上文所提到,鲁棒的水印在主图像受到攻击和扭曲时,仍能保持完整。由于鲁棒的水印很难从主机图像中移除,因此常常用于保护版权;另一方面,脆弱的水印一般仅用于验证,即主机图像的完整性检查。完整的脆弱水印表示主机图像处于其原始形式,并没有收到编辑、损坏或更改。在本次课程设计中,为了简洁起见,我们采用脆弱的水印算法。

经典的数字图像水印算法构建的系统包括双随机相位编码(DRPE)系统,离轴全息系统,相移全息系统,优化的仅相位掩模结构,联合变换相关器(JTC),重影成像系统和 ptychography 系统,等等。它们在各自的领域都具有相当不错的效果。在本次课程设计中,为了兼顾效率和效果,我们采用一种简单的二值图像数字水印算法,其基本思路如下:

由于水印算法需要改变主机图像的像素值,从而一定程度上改变主机图像的信息。而被改变像素值,因而保存着水印信息的像素点被称为隐藏点,它决定了隐藏了怎样的信息。而简单的处理方法容易导致图像质量的下降,例如,在全白的图像块中插入一个黑色的噪声点。另一方面,隐藏点也应避免选取在图像中的细线区域、直线边的中间像素、孤立像素等图像信息熵较大的点。由此,二值图像的数字水印嵌入算法的关键是隐藏点的选取,以下是隐藏点的选取规则:

二值图像数据应隐藏域图像中黑/白色区域的边界上,但上述诸如细线区域等仍不适于隐藏数据的边界。因此隐藏点应具有以下的特点:它是边界像素,并且不同时是左边界和右边界/上边界和下边界,以确保避免将信息隐藏在细线区域等。这需要一个优秀的边界提取算法。

在隐藏点被确定后,水印信息应转换为二进制序列,并保存在隐藏点中。同理,因此所有可被转换为二进制序列的诸如文字信号、音频信号、图像信号和视频信号,并可进行反转换的信号都可以作为该算法的水印信息。在本次课程设计中,我们简单地以字符串信息和二进制序列信息为例,来保存相关的水印。

值得一提的是,为了保证水印信息更好地隐蔽,水印信息被加入前,需要用一段密钥进行加密,并在提取时,使用该密钥进行解密。

2.5 技术流程:

本次课程设计采用的主要框架包括 C++ 与 Qt 等,其中 C++ 作为程序实现语言,Qt 作为软件实现框架,使用 C++ 中的指针工具作为图像处理工具,BMP 图像的读写采用文件头信息解析模式。

本次编程是在 Ubuntu 16.04 LTS 上进行的,在该环境下,常用的图像解码工具包括 Qt 的 QPixMap 模块以及 OpenCV 库。其中使用 C++ 进行 bmp 文件解码过程较为复杂,需要鲁棒的文件读写设计以及接口设计,同时,对于不同类型的文件需要不同的解码方式,不广泛适用于.png,.img,.jpg,.giff 等等图像格式的使用,但减少了第三方库的利用。而 QPixMap 框架的引入对于文件数据对象的空间开辟和释放过于频繁,降低了程序的效率,并需要引入标准模板库框架。作为对比,OpenCV 库拥有极高的鲁棒性、延展性和高效性,但需要引入第三方库,软件打包较为复杂。在“尽量引入较少的第三方库”的原则下,我们采用了纯 C++ 语言,根据 BMP 图像的特点设计合理的数据结构进行编码、存储图像,以提高本软件的实用性。

本次课程设计的技术流程如下:首先设计并实现边缘信息提取的算法 edgeExtract()函数,以确定隐藏点,再设计数字隐藏的算法 encodeImage()函数。在软件流程中,首先点击“浏览”按钮,选取二值图像,再输入需要加入的水印,最后点击“编码”按钮,则生成并显示了附有水印信息的图像。该图像被保存在.pro 的 Qt 项目文件同名文件夹下,被命名为 encode.bmp。此外,对于已编码的 encode.bmp,点击“解码”按钮,会以对话框形式弹出被解码出的水印信息。

三 实验结果:

本次课程设计生成的软件结果如下:

软件打开后的界面如下,为避免用户每次打开软件后都需要输入水印,过于麻烦,本软件内置了水印二进制序列,如图 1 所示。

图 1 软件开启界面

 输入二值图像后,会被展示在软件中,如图2所示。

在这里插入图片描述

图 2 显示所输入二值图像

 点击“编码”按钮后,生成编码图像,如图3所示。

图 3 生成编码图像

 点击“解码”按钮,弹出水印信息,如图4所示。

在这里插入图片描述

图 4 显示水印信息

 本程序也支持字符串的水印编码,将水印附带的comboBox选取为“QString”,然后编码并解码后的结果,如图5所示。

在这里插入图片描述

图 5 字符串水印编码图像

四 算法分析:

本程序经过第三方测试发现并无 bug 存在,鲁棒性优秀,可以完整的实现简单的二进制序列的二值数字图像水印算法功能。

在第二章节中提到,优秀的水印算法拥有上述的四个特点:a.不改变原图信息;b.隐蔽性;c.鲁棒性;d.不可访问性。本报告将从这四个角度评判该算法的性能。由第三章节的内容易见,该算法具有从肉眼中几乎无法分辨与原图像的区别,因而完美地符合了不改变原图信息和隐蔽性的原则。该算法经过轻微地噪声扰动后就无法保存水印信息,因此鲁棒性极低,然而这符合脆弱的水印算法的特点,可以用于验证图像的完整性。从 encode.bmp 和原图之间的差分影像可以轻易地获得加密后的二进制序列。但是由于有密钥的存在,无密钥的非授权用户和盗版用户无法访问到原始水印的信息,具有不可访问性。关于不可访问性,在附录中有所展示。综上所述,本算法在效率极高的同时,完美地满足了优秀的脆弱水印算法的四个特点,同时保证了效果和效率。

五 总结:

在本次课程设计中,按照题目要求与提示,针对给定的二值图像数字水印算法完成了编程实现、算法分析与相关内容的简单介绍。先将水印信息转换为二进制序列,然后,算法利用密钥对序列进行转换,从而降低了第三方获取水印的可能性。通过查阅有关资料,对数字水印建立了一定的认识,并构建了位矩阵、位相量等 ADT。综述,本次课程设计完成了既定的各个要求。

实验结论:

综合上述判定方法与结果,原报告中设计的算法编码的二值图像数字水印具有安全性与稳健性。显然被水印编码图像与原图像,无法产生人类视觉明显的差别,因此符合隐蔽性。
,然后,算法利用密钥对序列进行转换,从而降低了第三方获取水印的可能性。通过查阅有关资料,对数字水印建立了一定的认识,并构建了位矩阵、位相量等 ADT。综述,本次课程设计完成了既定的各个要求。

实验结论:

综合上述判定方法与结果,原报告中设计的算法编码的二值图像数字水印具有安全性与稳健性。显然被水印编码图像与原图像,无法产生人类视觉明显的差别,因此符合隐蔽性。

资源下载地址:https://download.csdn.net/download/sheziqiong/85676481
资源下载地址:https://download.csdn.net/download/sheziqiong/85676481

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐