算法思想来自《彩色数字水印技术研究》一文

数字水印技术就是将特定的信息嵌入到数字信息的内容中,以保护所有者的权益。一个有效的数字水印应至少满足下面三个特性:不可觉察性:水印的存在不应明显干扰被保护的数据;安全性:水印的存在应该是安全的、可靠的,水印图像必须唯一标志原始图像的相关信息,任何第三者都不能伪造他人的水印图像;鲁棒性:给定一个水印文档,非授权的个人或团体在使文档可用的情况下无法剔除水印。可能看出水印的鲁棒性和不可觉察性是相互矛盾。对于一个特定的水印算法,必须折衷考虑这两个属性。

用的数字水印算法包含两个基本方面:水印的嵌入和水印的提取或检测。水印可由多种模型构成,如随机数字序列、数字标识、文本以及图像等。从鲁棒性和安全性考虑,常常要对水印进行随机化以及加密处理。

水印的嵌入过程:设有算法E,原始图像I和水印 W~,那么水印图像可表示如下:

数字水印的一般原理也可应用于彩色水印的嵌入和提取。但由于彩色水印含有比较多的信息,它比起一般水印信息来又有自己的特点。有文献利用静态图像的压缩编码技术,基于原始图像的DCT系数之间的关系,将彩色数字水印编码为一系列二值ID数字序列,直接作为掩码信息实现水印的嵌入。虽然水印的提取不需要原始图像,但水印只能抵抗JPEG有损压缩操作,对其它的图像操作的抵抗性很弱。基于这种情况,这篇文章提出了一种基于小波变换(DWT)的双彩色图印方案。实验证明,此方案不仅能抵抗JPEG有损压缩,还能抵抗剪切、放缩和平滑等操作。

彩色水印图像的详细嵌入过程如图3所示。基本步骤如下:

具体实践上有几点细节:

1.水印图像由[0 255]归一化到[-1 1],这应该是为了达到零均值,实际叠加时会乘以一个系数,文章认为α=4是不可察觉性和鲁棒性的一个很好的平衡

2.小波变换在YUV空间进行,文章说这是因为YUV是符合人视觉系统的一套颜色空间,而本人试了一下其他的色彩空间,确实YUV是效果最好的

3.加入水印分量是尽量往大的中频系数上加,大的系数意味着较强的能量,加一个小的扰动不会在视觉上变化太明显。

提取水印图像则是加水印的逆过程,基本步骤如图4所示

下面是MATLAB上的实现,与文章所述有一些变化:

1.只使用了二级小波变换,而不是四级,鲁棒性会有所下降,但水印尺寸得以提升

2.文章认为应向中频系数上添加水印,但低频分量能量和抗干扰性能比中频更强,所以优先向低频分量添加水印,如果低频分量系数个数不够再向中频分量添加

3.颜色空间使用的是YCbCr,跟YUV没有本质区别

function [Imgout] = Hide_3(OriImg,Print)
%  功能   将Print中的携带的信息通过图像处理技术隐藏在OriImg中
% OriImg  输入参数,RGB彩色图像,uint8格式,大小为512*512*3,作为隐
% 藏信息的载体
% Print   输入参数,RGB彩色图像,uint8格式,大小为140*200*3,信息本
% 身所在
% MarkedImg  输出参数,RGB彩色图像,uint8格式,大小为512*512*3,经过
% 信息隐藏处理后的图像 OriImg = rgb2ycbcr(OriImg);MarkedImg = zeros(size(OriImg));alpha = 4;
for i=1:3Orilayer = OriImg(:,:,i);Printlayer = Print(:,:,i);Print_ori = Printlayer;Printlayer = (double(Printlayer)-128)/128;  %归一到-1~1[C,S] = wavedec2(Orilayer,2,'db2');[rows, cols] = size(Printlayer);totallength = rows*cols;cA2 = appcoef2(C,S,'db2',2);cH2 = detcoef2('h',C,S,2);[cA2_r, cA2_c] = size(cA2);[cH2_r, cH2_c] = size(cH2);part1length = cA2_r*cA2_c;part2length = cH2_r*cH2_c;flattenpri = reshape(Printlayer, 1, []);C(1:part1length) = C(1:part1length)+alpha*flattenpri(1:part1length);leftlength = totallength-part1length;cH2 = C(part1length+1:part1length+part2length);[~, IH] = sort(abs(cH2),'descend');IH = IH(1:leftlength);cH2(IH) = cH2(IH)+alpha*flattenpri(part1length+1:totallength);C(part1length+1:part1length+part2length) = cH2;Outlayer = waverec2(C,S,'db2');MarkedImg(:,:,i) = uint8(Outlayer);
endImgout = ycbcr2rgb(uint8(MarkedImg));end
function Print = Recover_3(MarkedImg, OriImg) %  功能   将含有隐藏信息的图像MarkedImg中的信息标记(图像)分离到
%Print图像之中
% MarkedImg  输入参数,RGB彩色图像,uint8格式,大小为512*512*3,可能
%含有隐藏信息的图像
% OriImg  输入参数,RGB彩色图像,uint8格式,大小为512*512*3,不含隐
%藏信息的原始图像载体
% Print   输出参数,RGB彩色图像,uint8格式,大小为140*200*3,信息本
%身所在 rec_row = 140; %此处为水印图片的高度和宽度
rec_col = 200;OriImg = rgb2ycbcr(OriImg);MarkedImg = rgb2ycbcr(MarkedImg);outImg = zeros(rec_row, rec_col, 3);
alpha = 4;
for i=1:3Orilayer = OriImg(:,:,i);Marklayer = MarkedImg(:,:,i);[Co,So] = wavedec2(Orilayer,2,'db2');coA2 = appcoef2(Co,So,'db2',2);[cA2_r, cA2_c] = size(coA2);part1length = cA2_r*cA2_c;coA2 = Co(1:part1length);coH2 = detcoef2('h',Co,So,2);[cH2_r, cH2_c] = size(coH2);part2length = cH2_r*cH2_c;coH2 = Co(part1length+1:part1length+part2length);[~, IHo] = sort(abs(coH2),'descend');%IHo = 1:length(IHo);leftlength = rec_row*rec_col-part1length;IHo = IHo(1:leftlength);[Cm,Sm] = wavedec2(Marklayer,2,'db2');cmA2 = Cm(1:part1length);cmH2 = Cm(part1length+1:part1length+part2length);flat_print = zeros(1,rec_row*rec_col);flat_print(1:part1length) = cmA2-coA2;flat_print(part1length+1:rec_row*rec_col) = cmH2(IHo)-coH2(IHo);Print = reshape(flat_print, rec_row, rec_col)/alpha;Print = (Print*128)+128;outImg(:,:,i) = Print;
endPrint = uint8(outImg);
end

实验效果

原图

水印

加水印后

恢复结果

对加水印图进行JPEG压缩攻击后的恢复结果

进行白色条形污损后的恢复结果

应该说,效果还是不错的

MATLAB实现的彩色数字水印算法相关推荐

  1. MATLAB基于LSB的数字水印算法

    摘要-LSB是一种简单传统的信息隐藏算法,属于数字水印技术中的一种.本文首先介绍了LSB技术的原理和特点,然后讨论了基于LSB的数字水印算法.最后利用MATLAB 2010 b2对这一算法的加密过程进 ...

  2. 用matlab做文字水印,3 一个用MATLAB编写的数字水印算法实例

    3 一个用MATLAB编写的数字水印算法实例 为证明MATLAB的高效性与实现简便性,给出在Windows98环境下MATLAB5.3中调试通过的完整源程序. l 嵌入水印 %定义常量size=256 ...

  3. 基于MATLAB的数字水印算法研究实现

    基于MATLAB的数字水印算法研究实现 一.课题背景 随着图像.音频.视频等多媒体信息以及Internet的迅速发展,多媒体信息在互联 网上的广泛传播变得及其便利,数据的交换和传输过程变得相对简单.多 ...

  4. 用matlab实现数字水印,应用MATLAB实现数字水印算法(1)

    应用MATLAB实现数字水印算法 序跟上述提取水印的程序类似,不再赘述. % 计算并比较相关系数uncorrect_r.correct_r,其中uncorrect_r是未采用差错控制的,而correc ...

  5. MATLAB数字水印算法设计

    MATLAB数字水印算法设计 一.课题背景 数字水印技术是目前信息安全技术领域的一个新方向,是一种可以在开放的网络环境下保护版权和认证来源及完整性的新型技术.它是信息隐藏学的一个重要分支,它用信号处理 ...

  6. 数字水印算法matlab源程序 matlab版数字水印算法 /DCT/DWT/LSB/HVS/W-SVD数字水印源码 数字水印的嵌入和提取 W-SVD数字水印实现

    发以下多套系统源码: 1.matlab版数字水印算法 2.MATLAB数字水印 源代码+文档 3.数字水印技术matlab代码 4.数字水印 JPEG压缩 matlab代码 5.数字水印 添加噪声 m ...

  7. matlab dwt实现原理,基于DWT的数字水印算法的MatLab实现.pdf

    信息安全 信息技术与信息化 基于!"# 的数字水印算法的$%&'%( 实现 !)*)&%+ "%&,-.%-/)0* 1%2,3 40 !"# ( ...

  8. 基于DCT的图像数字水印算法

    一.背景意义 信息革命使人类的社会与生活产生了深刻的变化.数字产品知识产权保护问题尤为突出,使用加密.数字签名等技术已经不能够有效的解决这一问题.本文结合隐蔽通信和数字水印两个主要的应用背景,对图像压 ...

  9. 改进的Patchwork数字水印算法——C++实现

    Patchwork数字水印算法基础原理 Patchwork原意为一种用各种颜色和形状拼接成的布料. Patchwork算法最早由麻省理工学院研发,在空间域上通过大量的模式冗余来实现鲁棒的数字水印技术, ...

最新文章

  1. JAVA各种并发锁从synchronized 到CAS 到 AQS
  2. MySQL中的执行计划
  3. 关于更改当前公司(一)--ChangeCompany
  4. python xlrd安装_详解python中xlrd包的安装与处理Excel表格
  5. ES6新语法 变量 、 服务器端js和浏览器端js的区别
  6. 企业号开发php,微信企业号-开发笔记-1
  7. javascript进阶——Ajax
  8. CentOS6.8下MySQL数据库忘记root密码解决方法
  9. Activity端详
  10. meteor 检测运行环境,手机或者桌面
  11. 现代密码法学算法分类
  12. 《Spring Boot极简教程》第9章 Spring Boot集成Scala混合Java开发
  13. VBA编程_常用函数总结1
  14. linux系统pdf文件转word文档,PDF如何转换为Word文件?用它,就是这么简单!
  15. qq空间日志总显示服务器升级,QQ空间里加不上日志是怎么回事?
  16. HQChart使用教程60-新版k线训练使用教程
  17. python3的下载和安装
  18. Enhancement(5)--Field Exits {转载}
  19. Python更新PIP至最新版本
  20. Avformat_open_input函数的分析 结合HTTP协议

热门文章

  1. 米联客FDMA_V3详细解读,单摄像头图像传输模板-降采样进阶版
  2. linux mint 卸载compiz,Ubuntu12.04和linux mint 13的3D桌面效果的实现及compiz conf...
  3. 北京邮电大学计算机导师与学生关系,【推荐给考北邮的同学】——选导师那些事儿...
  4. 理发预约小程序实战教程
  5. 软件性能测试 响应时间,软件性能测试(连载2)
  6. 为什么学了编程语言还是不会做软件?
  7. matlab中无法解析名称,无法解析名称 audiovideo.internal.FilePath。
  8. adb_adb file transfer文件传输(adb push/pull)
  9. twine上传的坑:pkg_resources.DistributionNotFound: The ‘docutils>=0.13.1‘ distribution was not found
  10. 石砸天——寒门再难出贵子