Matlab中图像数字水印算法的原理与实现详解

目录
  • 一、背景意义
  • 二、基本原理
  • 三、算法介绍
    • 3.1 数字水印嵌入
    • 3.2 数字水印提取
  • 四、程序实现

一、背景意义

数字水印技术作为信息隐藏技术的一个重要分支,是将信息(水印)隐藏于数字图像、视频、音频及文本文档等数字媒体中,从而实现隐秘传输、存储、标注、身份识别、版权保护和防篡改等目的。

随着 1996 年第一届信息隐藏国际学术研讨会的召开,数字水印技术的研究得到了迅速的发展,不少政府机构和研究部门加大了对其的研究力度,其中包括美国财政部、美国版权工作组、美国洛斯阿莫斯国家实验室、美国海陆空军研究实验室、欧洲电信联盟、德国国家信息技木研究中心、日本 NTT 信息与通信系研究中心、麻省理工学院、南加利福尼亚大学、普渡大学、剑桥大学、瑞士洛柔联邦工学院、微软公司、CA 公司等研究机构。另外,在 TEEE 和 SPIE 等一些重要国际会议上,也专门开辟了与数字水印相关的专题。欧洲几项较大的工程项目(如 VIVA 和ACTS)中也均有关于图像水印方面的专题研究。我国在这一领域的研究也基本与欧美等科技强国保持同步,目前国内已经有不少科研机构投人到数字水印方面的研究中去。1999年底,第一届全国信息隐藏学术研讨会(CIHW)在北京电子技术应用研究所召开。国家“863 计划”“973项目”(国家重点基础研究发展规划)、国家自然科学基金等也都对图像水印的研究有项目资金支持。

二、基本原理

图像数字水印技术以一定的算法将一些标志性信息嵌人到图像中,而不影响原图像的面质和使用。水印信息可以是序列号或有特殊意义的文本等,通过和载体图像的紧密结合而达到识别图像来源、作者等版权信息的目的。与传统加密技术不同,图像水印技术的目的并不在于直接阻止对图像的盗版,而是着眼于如何将版权信息加入到正版图像,并能够从盗版图像中提取出先期加人的版权方面的证据(水印),在能够证明图像确系盜版之后再以法律的手段对盜版者实施制裁。

图像数字水印处理可分为对水印的嵌人处理和对已嵌人的水印的检测处理两部分。从图像处理的角度看,嵌人水印可以看作是在强背景(原始图像)下叠加一个弱信号(水印),由于人的视觉系统对图像的分辨率有限,因此只要叠加的信号在幅度上低于某个对比度门限,就可以使人眼完全感受不到叠加信号的存在,这个对比度门限主要受系统的空间、时间和频率特征的影响。因此,在不改变视觉效果的前提下,对原始图像做一定的调整,嵌入一些额外信息是完全有可能的。

由于图像数字水印的目的不在于限制其正常的图像复制,而在于保证隐藏其內的水印不被侵犯和发现。因此,在向图像嵌人水印时。必领考虑到正常的信息操作对水印所造成的威胁,以及要求水印能够对通常的图像编辑操作具有一定的抵御、免疫能力。根据图像水印的目的和技术要求,可以总结出图像水印的一些特点。

①鲁棒性 (robustness):图像一旦嵌人了水印后,图像与水印将紧密地融合在一起,而且不因因像的某种处理而导致隐含的水印信息丢失。这里所谓的“处理”,包括了噪声干扰、滤波、平滑、增强、重采样、有损编码压缩、D/A 或 A/D转换等各种常规的图像处理手段。图像水印除了能对无意识的图像处理操作具有抵御能力外,还应具各抵扰恶意删除攻击、逃惑攻击等有意识政击的能力,除非攻击方对加人的水印有足够的先验知识,否则任何破坏和去除水印的企图都将严重损坏因像的面质,使破解后的图像毫无利用价值。

②不可检测性(undetectability):水印和图像应具有一致的特性,如统计噪声分布等,这样可以使非法攻击者无从确认该图像是否含有水印信息。

③透明性 (invisibility):此特性主要应用了人眼的生理特点,经过隐藏处理的图像水印不会对原始图像有视觉可察的画质降低现象。

④低复杂性:水印的嵌人和提取识别算法应简单易行。

⑤自恢复性:嵌入了水印的图像在经过一系列的处理和变换后,可能对原图产生了较大的破坏,这就要求从留下的片段中仍可提取出水印(或水印残片),并根据检验出的结果确认出水印的存在。

三、算法介绍

3.1 数字水印嵌入

以一副512X512大小的lena灰度图像和64X64大小的水印灰度图像为例说明水印嵌入的具体步骤:

第一步,对512X512的原始图像I系数矩阵分成8X8大小的块,则原图一共被分成64X64块。对每个块进行二维离散余弦变换(DCT)。

第二步,原图就变成了64X64个8X8大小的系数矩阵,正好64X64大小的水印图像J中矩阵的每个系数对应于原始图像的每个块,水印的嵌人利用公式:F’ (u,v)=F(u,v)+aw(i) ,其中F(u,v)为原始图像的DCT系数,a为嵌入强度,w(i)(i=1,2,3,…)是每点的水印像素。

第三步,对这64X64块嵌入水印信息的矩阵做二维DCT逆变换,再合并成一个整图,就得到了嵌入水印后的图像。

代码如下:

%读入原始图像和水印图像并显示
I=imread('lena512.jpg');
figure(1);
subplot(2,2,1);
imshow(I);
title('原始图像');
J=imread('xiaohui64.jpg');
subplot(2,2,2);
imshow(J);
title('水印图像');
%对水印图像进行arnold置乱预处理
H=double(J);
tempImg=H; %图像矩阵赋给tempImg
for n=1:5  %置乱次数
for u=1:64
for v=1:64
temp=tempImg(u,v);
ax=mod((u-1)+(v-1),64)+1;%新像素行位置
ay=mod((u-1)+2*(v-1),64)+1;%新像素列位置
outImg(ax,ay)=temp;
end
end
tempImg=outImg;
end
G=uint8(outImg);%得到置乱后的水印图像
%嵌入水印
for p=1:64
for q=1:64 %p、q都是1到64,是因为有64*64个8*8的块,每次循环处理一个块
BLOCK1=I(((p-1)*8+1):p*8,((q-1)*8+1):q*8);%每个8*8的块
BLOCK1=dct2(BLOCK1);%做2维的DCT变换
BLOCK1(4,5)=BLOCK1(4,5)+0.2*G(p,q);%在每块DCT系数的4行5列处嵌入水印,系数可调
W(((p-1)*8+1):p*8,((q-1)*8+1):q*8)=idct2(BLOCK1);%做DCT反变换
end
end
%显示嵌入水印后的图像
imwrite(uint8(W), 'lena_mark.jpg ', 'jpg');
subplot(2,2,3);
imshow('lena_mark.jpg');
title('嵌入水印后的图像');

上图中0.2为可调参数嵌入强度系数,可以发现,随着嵌入强度的增大,嵌入水印后的图像效果越来越差。

3.2 数字水印提取

水印的提取是根据水印的嵌入策略执行相应的逆过程来提取水印。因此,在水印提取过程中,只须将嵌人水印后的图像块经DCT变换后的系数减去相应强度的水印信息就可以提取出嵌人该块的水印信息,再对所有块提取出来的水印信息进行反置乱就得到提取出来的水印图像。

水印提取的具体步骤如下:

第一步,读入嵌入水印后的图像W和原始水印图像I。

第二步,分别对W和I进行分块DCT变换,得到每个块的系数矩阵。

第三步,对每个8X8块的中频系数位置上,利用公式

计算出每一块的水印信息,合并成一个整图,就得到了提取出来的水印图像。

代码如下:

for p=1:64
for q=1:64
BLOCK1=W(((p-1)*8+1):p*8,((q-1)*8+1):q*8);
BLOCK2=I(((p-1)*8+1):p*8,((q-1)*8+1):q*8);
BLOCK1=dct2(BLOCK1);
BLOCK2=dct2(BLOCK2);
Y(p,q)=(BLOCK1(4,5)-BLOCK2(4,5))/0.2;
end
end
% 对水印进行arnold反置乱
for n=1:43 % 循环次数为48-5
for u=1:64
for v=1:64
temp1=Y(u,v);
bx=mod((u-1)+(v-1),64)+1;
by=mod((u-1)+2*(v-1),64)+1;
outImg1(bx,by)=temp1;
end
end
Y=outImg1;
end
%显示提取出来的水印图像
imwrite(uint8(Y), 'watermark.jpg ', 'jpg');
subplot(2,2,4);
imshow('watermark.jpg');
title('提取出来的水印图像');

四、程序实现

程序运行结果如下:

到此这篇关于Matlab中图像数字水印算法的原理与实现详解的文章就介绍到这了,更多相关Matlab图像数字水印算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Matlab实现简单扩频语音水印算法详解

    目录 一.实验背景 1.实验目的 2.实验环境 3.原理简介 二.基础知识 1.PN序列 2.时域到频域变换的原因 3.三种时域到频域变换的区别 三.算法源码 1.PN产生函数 2.隐藏算法 3.提取算法 4.测试脚本 四.运行测试 1.无攻击(误码率0.000976): 2.AU格式转换(误码率0.001921): 3.压缩与解压缩(误码率0.002029): 一.实验背景 1.实验目的 了解扩频通信原理,掌握扩频水印算法的基本原理,设计并实现一种基于音频的扩频水印算法,了解参数对扩频水印算法

  • 基于matlab实现DCT数字水印嵌入与提取

    目录 一.离散小波变换的音频信号数字水印技术简介 0 引言 1 音频数字水印技术分类 2 基于DWT的音频水印算法 二.部分源代码 三.运行结果 一.离散小波变换的音频信号数字水印技术简介 0 引言 近年来, 数字水印技术的作用越来越重要.数字水印技术是将一些标识信息直接嵌入数字载体当中, 或间接表示在信号载体中, 且不影响原载体的使用价值.通过隐藏在载体中的这些信息, 可以判断信息是否被篡改, 具有防伪溯源.保护信息安全.版权保护等作用.对于广播转播台站而言, 是广播音频的中转站, 在广播信号

  • Matlab中图像数字水印算法的原理与实现详解

    目录 一.背景意义 二.基本原理 三.算法介绍 3.1 数字水印嵌入 3.2 数字水印提取 四.程序实现 一.背景意义 数字水印技术作为信息隐藏技术的一个重要分支,是将信息(水印)隐藏于数字图像.视频.音频及文本文档等数字媒体中,从而实现隐秘传输.存储.标注.身份识别.版权保护和防篡改等目的. 随着 1996 年第一届信息隐藏国际学术研讨会的召开,数字水印技术的研究得到了迅速的发展,不少政府机构和研究部门加大了对其的研究力度,其中包括美国财政部.美国版权工作组.美国洛斯阿莫斯国家实验室.美国海陆

  • Java中Prime算法的原理与实现详解

    目录 Prim算法介绍 1.点睛 2.算法介绍 3. 算法步骤 4.图解 Prime 算法实现 1.构建后的图 2.代码 3.测试 Prim算法介绍 1.点睛 在生成树的过程中,把已经在生成树中的节点看作一个集合,把剩下的节点看作另外一个集合,从连接两个集合的边中选择一条权值最小的边即可. 2.算法介绍 首先任选一个节点,例如节点1,把它放在集合 U 中,U={1},那么剩下的节点为 V-U={2,3,4,5,6,7},集合 V 是图的所有节点集合. 现在只需要看看连接两个集合(U 和 V-U)

  • 基数排序算法的原理与实现详解(Java/Go/Python/JS/C)

    目录 说明 实现过程 示意图 性能分析 代码 Java Python Go JS TS C C++ 链接 说明 基数排序(RadixSort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数.基数排序的发明可以追溯到1887年赫尔曼·何乐礼在列表机(Tabulation Machine)上的 基数排序的方式可以采用LSD(Least significant di

  • java中Servlet监听器的工作原理及示例详解

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 监听器原理 监听原理 1.存在事件源 2.提供监听器 3.为事件源注册监听器 4.操作事件源,产生事件对象,将事件对象传递给监听器,并且执行监听器相应监听方法 监听器典型案例:监听window窗口的事件监听器 例如:swing开发首先制造Frame**窗体**,窗体本身也是一个显示空间,对窗体提供监听器,监听窗体方法调用或者属性改变:

  • Java中读写锁ReadWriteLock的原理与应用详解

    目录 什么是读写锁? 为什么需要读写锁? 读写锁的特点 读写锁的使用场景 读写锁的主要成员和结构图 读写锁的实现原理 读写锁总结 Java并发编程提供了读写锁,主要用于读多写少的场景,今天我就重点来讲解读写锁的底层实现原理 什么是读写锁? 读写锁并不是JAVA所特有的读写锁(Readers-Writer Lock)顾名思义是一把锁分为两部分:读锁和写锁,其中读锁允许多个线程同时获得,因为读操作本身是线程安全的,而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的. 所谓的读

  • JavaScript中new操作符的原理与实现详解

    目录 一.new做了哪些事 二.返回不同类型时有哪些表现 三.手写new的实现原理 一.new做了哪些事 先看看new的使用场景: // 1.创建一个构造函数 function Vehicle(name, price) { this.name = name this.price = price } ​ // 2.new一个实例对象 let truck = new Vehicle() console.log(truck); //Vehicle { name: undefined, price: u

  • Java异或技操作给任意的文件加密原理及使用详解

    异或简单介绍:异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1. 简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1. 需求描述 在信息化时代对数据进行加密是一个很重要的主题,在做项目的过程中,我也实现了一个比较复杂的加密算法,但是由于涉及到的技术是保密的,所以在这里我实现一个比较简单的版本,利用文件的输入输出流和异或操作进行任意文件的加密,关于解密算法,很简单,自己思考下就能解决. 数学原理 该加密算法利用的是

  • java中常见的6种线程池示例详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如下 线程池名称 描述 FixedThreadPool 核心线程数与最大线程数相同 SingleThreadExecutor 一个线程的线程池 CachedThreadPool 核心线程为0,最大线程数为Integer. MAX_VALUE ScheduledThreadPool 指定核心线程数的定时

  • JSON Web Token(JWT)原理入门教程详解

    目录 一.跨域认证的问题 二.JWT 的原理 三.JWT 的数据结构 3.1 Header 3.2 Payload 3.3 Signature 3.4 Base64URL 四.JWT 的使用方式 五.JWT 的几个特点 六.参考链接 一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色.登录时间等等. 3.服务器向用户返回一个 session_id,写入用户的 Co

  • python目标检测SSD算法预测部分源码详解

    目录 学习前言 什么是SSD算法 ssd_vgg_300主体的源码 学习前言 ……学习了很多有关目标检测的概念呀,咕噜咕噜,可是要怎么才能进行预测呢,我看了好久的SSD源码,将其中的预测部分提取了出来,训练部分我还没看懂 什么是SSD算法 SSD是一种非常优秀的one-stage方法,one-stage算法就是目标检测和分类是同时完成的,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度

随机推荐