基于混沌的变换域图像数字水印算法及其测试

2023-12-03 11:40

本文主要是介绍基于混沌的变换域图像数字水印算法及其测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、项目需求分析

1.1项目介绍

本算法是将数字水印置乱加密后微小的扰动原始彩色图像经离散余弦变换后的对应系数,从而达到数字水印嵌入的目的。 实验表明算法简单高效,原图像与嵌入水印后图像差异小,水印提取准确,能较好的保证数字水印不可感知性,在对嵌入水印图像进行各种加噪、裁剪、旋转、压缩等处理后,水印仍有较强的鲁棒性。

1.2功能需求

  1. 实现混沌随机数的生成
  2. 实现图像加解密
  3. 实现数字水印置乱

  4、实现变换域图像数字水印的嵌入与提取

5、对含水印图像进行鲁棒性测试和相关性分析

  • 项目分析与设计

2.1项目需解决的关键技术问题

  1. 各种图像格式之间的相互转换,各种值类型间的转换
  2. DCT水印嵌入和提取
  3. 混沌随机数的生成和图像加解密

4、对生成的水印图像进行攻击测试

2.2项目流程

  1. 混沌序列的生成和图像加解密

 

  1. 水印和嵌入与提取

 

  1. 鲁棒性检测

   对含水印的图像进行加噪、加噪、裁剪、旋转、压缩等攻击,再提取出的水印与未受攻击的图像提取出的水印进行比较。

 

2.3功能模块

项目主要分为三部分:

一、水印图像的生成:

   采用改进型logistic混沌序列生成算法,生成一维的混沌序列,再转为二维的二值矩阵与原始二值图片进行异或加密,加密后的图像再进行置乱,消除水印像素间的相关性,故能提高水印抗图像剪裁等操作的鲁棒性,因为有置乱操作,剪切攻击后恢复的水印也是完整的。置乱后的图片为水印图片。

二、数字水印嵌入和提取:

Step1: 将原始彩色载体图像进行 8伊8 的分块,得到(M*M2)/(8*8)个子块Block。

Step2: 对每个子块进行 DCT 变换,各自得到 8*8 的系数矩阵。

Step3: 对水印图像进行 Arnold 置乱。

Step4: 依据 Arnold 置乱后的水印图像W(i,j) 来扰动对应的Block(i,j)系数矩阵,采用乘性扰动方式,微调系数矩阵各元素的值,即

式中,a为扰动因子,通常琢 取很小的正数。 本算法的a 取值为0. 04。

Step5: 对 扰 动 后 的 图 像 块 进 行 反 余 弦 变 换(IDCT,Inverse Discrete Cosine Transform) ,合并图像块,视其为嵌入水印的图像。

水印提取只需采用与水印嵌入的逆操作即可实现。

 

三、对含水印的图像进行攻击和测试

 对含水印的图片分别进行噪声攻击、压缩攻击、剪切攻击、旋转攻击,测试与不受攻击提取的水印间的相关性,改变攻击参数测试水印的鲁棒性强弱。

 

三、项目设计与实现

3.1项目设计

3.3.1数字水印基本框架

一个数字水印系统一般包括三个基本方面:水印的生成、水印的嵌入和水印的提取或检测。数字水印的嵌入和提取的一般过程基本框架如图3.1,图3.2所示。

图3.1 水印嵌入的一般过程基本框架

图3.2 水印检测的一般过程基本框架

 

 

3.2项目实现

3.2.1 水印图片的生成

  1. 混沌随机数的生成

   采用了改进型logistic映射,且为满映射状态,生成一维的混沌随机数序列再将其归一化,初始值为0.学号。

 

混沌序列(double):

归一化后(uint8):

对归一化后的序列进行二值化(logical):im2bw(B)默认是0.5,换算成255就是127.5,小于127.5为0,所以7和9是0

 

二维的混沌序列

 

  1.  二维混沌序列和图片进行异或操作加密

      

  1. 对加密后图像进行解密

  1.  对加密后的图像进行置乱

图像置乱是一种图像加密技术,通过某种算法仅将一幅图像像素的次序打乱,而像素个数及图像的直方图不变。 由于对水印进行置乱可以消除水印像素间的相关性,故能提高水印抗图像剪裁等操作的鲁棒性。目前用的较多的置乱方法有 Fass 曲线,Gray 代码、Arnold 变换和幻方方式等。Arnold 变换直观且具有周期性,是 Arnold 在遍历理论中提出的一种变换,也称猫脸变换 ( Arnold忆s Cat Map)。

 

3.2.2 DCT数字水印嵌入和提取

 

1、 DCT水印嵌入

DCT 变换的基本原理是将图像f(x,y) 分块后的每一子块单独进行二维 DCT 变换,将每个数据单元的值转化为 M伊N 个系数,构成系数矩阵。 将系数按Zig-Zag 顺序排列,左上角第一个元素是直流分量(DC,Direct Current),称为直流系数,表示该数据块的灰度平均值。本实验对直流层进行嵌入。

 

2、 DCT对水印的提取

3、 对提取出的水印进行置乱还原,再对还原的图像进行解密

 

 

 

置乱还原:

 

解密:置乱还原后的水印与混沌二值矩阵进行异或。

    

 

 

3.2.3 对水印图像进行攻击和测试

1、 对含水印的图像进行攻击和测试,主要用了高斯噪声攻击和椒盐噪声攻击、旋转攻击、压缩攻击、剪切攻击,除了旋转攻击之外抵抗攻击性挺强的,基本上能看出来原图形,旋转攻击只有是1度的时候效果还可以。

 

2、相关性分析

 

 

3、 剪切攻击测试

剪切宽64像素长128像素时:

  

剪切宽128 128时:

      

 

剪切256 128时:已经不是很清楚了

   

4、旋转攻击测试

旋转1度

  

相关性:

 

 

 

旋转2度:图片已经很模糊了,相关性是还可以的

 

相关性:

旋转3度就完全看不清了

 

相关性也降到了0.76

  1. 噪声攻击测试

高斯噪声:

  

相关性:

 

椒盐噪声:

   

相关性:

 

  1. 压缩攻击测试

压缩比:75

 

   

相关性:

 

压缩比:60

  

相关性:

 

压缩比 40

   

 

压缩比 30

 

 

 

压缩比 15时图片已经看不怎么清楚了

  

传图不易,如需完整代码请下载!

https://download.csdn.net/download/qq_39980334/11258396

这篇关于基于混沌的变换域图像数字水印算法及其测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_39980334/article/details/93636062
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/449321

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接