当前位置: 首页 > article >正文

基于基于DCT的数字水印算法

数字水印技术近年来得到了较大的发展,基于变换域的水印技术是目前研究的热点。数字水印是利用数字作品中普遍存在的冗余数据和随机性,把标识版权的水印信息嵌入到数字作品中,从而可以起到保护数字作品的版权或其完整性的一种技术。

一个有效的数字水印系统至少具备以下三个最基本的特性:1.安全性:数据信息隐藏于数据图像中,不是文件头中,文件格式的变换不应导致水印信息的丢失。2.隐蔽性:在数字图像作品中嵌入数字水印不会引起图像明显的降质,即含水印的图像与原始图像对人的感觉器官的刺激应该是无差别或差别很小,主观感觉变化很小。3.鲁棒性:是指在经历有意或无意的信号处理过程后,水印信息仍能保持完整性或仍能被准确鉴别。另外还有通用性、惟一性等特性。数字水印的基本应用领域是版权保护、隐藏标识、认证和安全不可见通信等。                                                 

本文提出了一种基于dct域的Matlab水印算法,实验结果表 明这种算法具有较好的性能,实现的水印具有不可见性,而且具有较好的鲁棒性。

1.4各种数字水印算法

近几年来数字水印技术研究取得了很大的进步,见诸于文献的水印算法很多,这里对一些典型的算法进行了分析。

1. 空间域算法

数字水印直接加载在原始数据上,还可以细分为如下几种方法:

(1) 最低有效位方法(LSB)

这是一种典型的空间域数据隐藏算法,L.F.Tumer与R.G.VanSchyadel等先后利用此方法将特定的标记隐藏于数字音频和数字图像内。该方法是利用原始数据的最低几位来隐藏信息(具体取多少位,以人的听觉或视觉系统无法察觉为原则)。LSB方法的优点是有较大的信息隐藏量,但采用此方法实现的数字水印是很脆弱的,无法经受一些无损和有损的信息处理,而且如果确切地知道水印隐藏在几位LSB中,数字水印很容易被擦除或绕过。

(2) Patchwork方法及纹理块映射编码方法

这两种方法都是Bender等提出的。Patchwork是一种基于统计的数字水印,其嵌入方法是任意选择N对图像点,在增加一点亮度的同时,降低另一点的亮度值。该算法的隐藏性较好,并且对有损的JPEG和滤波!压缩和扭转等操作具有抵抗能力,但仅适用于具有大量任意纹理区域的图像,而且不能完全自动完成。

2.变换域算法

基于变换域的技术可以嵌入大量比特数据而不会导致可察觉的缺陷,往往采用类似扩频图像的技术来隐藏数字水印信息。这类技术一般基于常用的图像变换,基于局部或是全部的变换,这些变换包括离散余弦变换(DCT)、小波变换(WT)、傅氏变换(FT或FFT)以及哈达马变换(Hadamardtransform)等等。其中基于分块的DCT是最常用的变换之一,现在所采用的静止图像压缩标准JPEG也是基于分块DCT的。最早的基于分块DCT的一种数字水印技术方案是由一个密钥随机地选择图像的一些分块,在频域的中频上稍稍改变一个三元组以隐藏二进制序列信息。选择在中频分量编码是因为在高频编码易于被各种信号处理方法所破坏,而在低频编码则由于人的视觉对低频分量很敏感,对低频分量的改变易于被察觉。该数字水印算法对有损压缩和低通滤波是稳健的。另一种DCT数字水印算法是首先把图像分成8×8的不重叠像素块,在经过分块DCT变换后,即得到由DCT系数组成的频率块,然后随机选取一些频率块,将水印信号嵌入到由密钥控制选择的一些DCT系数中。该算法是通过对选定的DCT系数进行微小变换以满足特定的关系,以此来表示一个比特的信息。在水印信息提取时,则选取相同的DCT系数,并根据系数之间的关系抽取比特信息。除了上述有代表性的变换域算法外,还有一些变换域数字水印方法,它们当中有相当一部分都是上述算法的改进及发展,这其中有代表性的算法是I.Podichuk和ZengWenjun提出的算法。他们的方法是基于静止图像的DCT变换或小波变换,研究视觉模型模块返回数字水印应加载在何处及每处可承受的JND(JustNoticeableDifference,恰好可察觉差别)的量值(加载数字水印的强度上限),这种水印算法是自适应的。

3.NEC算法

该算法由NEC实验室的Cox[等人提出,该算法在数字水印算法中占有重要地位,其实现方法是:首先以密钥为种子来产生伪随机序列,该序列具有高斯N(0,1)分布,密钥一般由作者的标识码和图像的哈希值组成,其次对图像做DCT变换,最后用伪随机高斯序列来调制(叠加)该图像除直流分量外的1000个最大的DCT系数。该算法具有较强的鲁棒性、安全性、透明性等。由于采用特殊的密钥,故可防止IBM攻击,而且该算法还提出了增强水印鲁棒性和抗攻击算法的重要原则,即水印信号应该嵌入源数据中对人感觉最重要的部分,这种水印信号由独立同分布随机实数序列构成,且该实数序列应具有高斯分布N(0,1)的特征。随后Podilchuk等利用人类视觉模型又对该算法进行了改进,从而提高了该算法的鲁棒性!透明性等。

4.其他一些水印算法

近年来利用混沌映射模型实现数字水印、保密通信等成为混沌应用研究的热点。特别是自从Cox等借用通信技术中的扩频原理将水印信号嵌入到一些DCT变换系数或者多层分解的小波变换系数以来,人们已经提出了一些混沌数字水印方法。水印的嵌入与检测是基于人类视觉系统(HVS)的亮度掩蔽特性和纹理掩蔽特性,折衷水印的不可见性和鲁棒性之间的矛盾.结果表明:该方法嵌入的水印具有不可见性和鲁棒性,并且这种基于密钥的混沌水印方法更好的抗破译性能。

目前比较流行的还有一种基于盲水印检测的DWT算法,该算法首先对原始图像进行小波变换,根据人类具有的视觉掩蔽特性对低频分量进行一定的量化,同时可不影响视觉效果,并对作为水印的图像进行压缩和二值化处理,形成一维的二值序列,根据二值序列的值对上述量化后的原始信号的低频分量进行视觉阈值范围内允许的修改,从而实现水印的嵌入。水印提取过程是对含有水印的图像进行小波变换,对低频分量同样进行量化处理,为了增大算法的安全性,可以对水印形成的二值0,1序列在嵌入前进一步进行伪随机序列调制,相应的在水印提取过程需要增加用伪随机序列解调的步骤。这样不知道伪随机序列的攻击者即使推测出水印的嵌入规律,也无法提取水印,大大增加了水印系统的透明性和鲁棒性。

 MATLAB程序

1  size=512; N=32;K=8; D=zeros(size);E=0.01;

2  I=imread('f:\lena.bmp');

3  subplot(2,2,1);

4  imshow(I);

5  title('原始图像');

6  I=double(I)/512;

%读入水银

7  J=imread('f:\1234.bmp');

8  subplot(2,2,2);

9  imshow(J);

10 title('水印图像');

11 %对水印缩放

12 J=double(imresize(J,[64,64]));

13 subplot(2,2,3);

41 imshow(J);

15 title('缩放水印图像');

16 %嵌入水印

17 for p=1:size/K

18     for q=1:size/K

19         x=(p-1)*K+1; y=(q-1)*K+1;

20         I_dct=I(x:x+K-1,y:y+K-1);

 21       I_dct1=dct2(I_dct);

 22       if J(p,q)==0

 23           alfa=-1;

 24       else

 25          alfa=1;

 26       end

 27      I_dct2=I_dct1+alfa*E;

 28       I_dct=idct2(I_dct2);

 29       D(x:x+K-1,y:y+K-1)=I_dct;

 30   end

31 end

 32 subplot(1,3,3);

 33 imshow(D,[]);

 34 Title('含水印的图象');

 35 %%%%%%对加入水印的图像进行各种攻击

 36 %%%低通滤波攻击

 37 %hh=fspecial('gaussian',3,0.2);

 38 %hh=fspecial('gaussian',3,0.35);

 39 %hh=fspecial('gaussian',3,0.4);

 40 QQ=filter2(hh,D);

 41%%%旋转攻击

 42 R=imrotate(D,10,'bilinear','crop');

 43 %R=imrotate(D,20,'bilinear','crop');

 44 %R=imrotate(D,45,'bilinear','crop');

 45 %%%%%剪切攻击

  46 %D(1:32,1:32)=0;   Q2=D;

  47 %D(1:64,1:64)=0;   Q2=D;

  48 %D(1:128,1:128)=0;  Q2=D;

  49 % 提取水印

  50 for  p=1:size/K

  51 for  q=1:size/K

  52       x=(p-1)*K+1;

  53       y=(q-1)*K+1;

  54       I1=I(x:x+K-1,y:y+K-1);

  55       I2=QQ(x:x+K-1,y:y+K-1);

  56       I_dct1=dct2(I1);

  57       I_dct2=dct2(I2);

  58       if  I_dct2>I_dct1

  59         W(p,q)=1;

  60       else

  61          W(p,q)=0;

  62       end    

  63  end

  64 end

  65 figure,subplot(1,2,1);imshow(R,[]);title('低通滤波攻击');

  66 subplot(1,2,2);imshow(W,[]);title('图像中提取的水印');

  67  %%%%%%前后水印相似比较

  68 J=double(J);W=double(W);

  69 sumJ=0;sumW=0;

  70 for  j=1:N

   71 for  i=1:N

   72     sumJ=sumJ+J(j,i)*W(j,i);

   73     sumW=sumW+W(j,i)*W(j,i);

   74  end

   75 end

   76 CH=(sumW-sumJ)/sumJ


http://www.kler.cn/a/409713.html

相关文章:

  • python中一些内置的数据类型转换方
  • DICOM图像深入解析:为何部分DR/CR图像默认显示为反色?
  • 计算机网络socket编程(2)_UDP网络编程实现网络字典
  • shell脚本(完)—脚本互调重定向的学习
  • python如何解压缩文件或文件夹
  • Javaweb前端HTML css 整体布局
  • 【离散数学】特殊关系的矩阵表示
  • NLP论文速读(Apple出品)|迈向更好的多模态指令遵循能力评估
  • Vue.js --- Vue3中其他组合式API
  • 语言模型中的多模态链式推理
  • 【Linux】线程ID与互斥、同步(锁、条件变量)
  • 第4章 三个域对象
  • 深度解析:Vue 自定义指令到底是什么?快来了解
  • 鸿蒙面试题-某迈-2024年11月22日
  • 对于某些原型或UI软件的个人看法(2024/11)
  • 【Qt】控件LineEdit
  • MySql:库和表的操作
  • 在Kubernetes使用CronJob实现定时删除指定天数外的文件(我这里使用删除备份mysql数据库文件为例)
  • WPF——ICON按钮制作
  • Apache Spark
  • 【C++11】可变参数模板/新的类功能/lambda/包装器--C++
  • 【网络通信】数据集合集!
  • 函数模板(进阶)
  • PPO算法实践(基于cleanrl)
  • Kubernetes(k8s)入门到实战教程
  • 如何部署开源大模型