导航:首页 > 源码编译 > 数字水印算法matlab

数字水印算法matlab

发布时间:2023-06-04 09:50:32

Ⅰ 基于Arnold置乱的数字水印图像加密算法的设计,基于Matlab语言编程,完成Arnold置乱算法,并用Matlab GUI工

clc
clear all;
iTimes=10; %置乱次数
% 读入水印图像
file_name='3232水印.bmp';
message=double(imread(file_name));
%水印图像矩阵的行数与列数
Mm=size(message,1);
Nm=size(message,2);
%对水印图像进行arnold置乱
if Mm~=Nm
error('水印矩阵必须为方阵');
end
if Mm~=90
error('必须为90*90大小,或者修改置乱次数');
end
tempImg=message; %图像矩阵赋给tempImg
for n=1:iTimes %置乱次数
for u=1:Mm
for v=1:Nm
temp=tempImg(u,v);
ax=mod((u-1)+(v-1),Mm)+1; %新像素行位置
ay=mod((u-1)+2*(v-1),Nm)+1; %新像素列位置
outImg(ax,ay)=temp;
end
end
tempImg=outImg;
end
% 显示水印,嵌入水印图像与原始图像
figure(1)
subplot(1,3,1);
imshow(message,[]);
title('原始水印');
subplot(1,3,2)
imshow(outImg,[]);
title('置乱水印');
% arnold反置乱
message_arnold=tempImg;
iTimes1=60-iTimes
%置乱后水印图像矩阵的行数与列数
Mo=size(outImg,1);
No=size(outImg,2);
for n=1:iTimes1 % 次数
for u=1:Mo
for v=1:No
temp1=tempImg(u,v);
bx=mod((u-1)+(v-1),Mo)+1;
by=mod((u-1)+2*(v-1),No)+1;
outImg1(bx,by)=temp1;
end
end
tempImg=outImg1;
end
message=outImg1;
% 显示反置乱后水印
%figure(3)
%subplot(1,3,1);
%imshow(message_arnold,[]);
%title('提取的置乱水印');
subplot(1,3,3);
imshow(message,[]);
title('反置乱(恢复)水印');
%subplot(1,3,3);
%imshow(orig_watermark,[])
%title('原始水印')

gui 自己学学吧 matlab中文论坛 gui板块

Ⅱ 关于Matlab数字水印

随着数字技术和计算机网络技术的迅速发展,数字化信息的传播和获取变得空前快捷和方便,促进了多媒体信息交流的发展。但是由于数字媒体易于存储、复制和传播的特点,使大量数字媒体在以合法形式进行传播的同时,经常遭遇非法复制与传播。而一些传统加密技术在数据传输中又不能有效地防止伪造及侵权行为 在这种形势下,作为传统加密技术的有效补充,数字水印技术(Digital Watermarking)应运而生。
在数字媒体应用日益广泛的同时,在相当长的一段时间,大部分的图文信息还将以印刷方式存在和传播。但是日益猖獗的假冒伪劣行为却给印刷品的防伪带来了新的挑战 在这种情况下 将具有高技术含量且制作成本低的数字水印技术用于印刷品的防伪是目前一个新的课题和方向。
数字水印是一种新的数字媒体保护技术,它是将特定的信息(如版权信息、序列号、公司标志、有意义的文本等)嵌入到图像、语音、视频等各种数字媒体中,以达到版权保护等目的。同时,这种信息的嵌入不影响主媒体的使用价值,不容易被人的知觉系统觉察且通过特定的恢复方法,可提取出来原来嵌入的信息。通过提取这些隐藏的信息 可以确认内容的创建者和购买者,检测其真实性、完整性。常见的在图像中嵌入数字水印可以视为在强背景(即原始图像)下叠加一个视觉上看不到的弱信号(水印)。由于人的视觉系统(Human Visual System,HVS)分辨率受到一定的限制 只要叠加信号的幅度低于HVS的对比度门限,HVS就无法感觉到信号的存在。因此 在HVS的对比度门限范围内,对原始图像做一定的改动(加入水印),就可达到在不改变视觉效果的情况下嵌入一些隐藏的信息。一般对数字水印有几个基本要求:①不可感知性;②可证明性:③鲁棒性:④安全性。
通用的数字水印模型包含两个阶段:水印的嵌入和水印的提取或检测。嵌入阶段的设计主要解决两个问题:①数字水印的生成。可以是一串伪随机数、数字标识、文本以及图像等,也可以是与作者有关的字符串、图标等信息经过加密产生:②嵌入算法。嵌入方案的目标是使数字水印在不可感知性和鲁棒性之间找到一个较好的折中。
检测阶段主要是设计一个相应于嵌入过程的检测算法。检测的结果是原水印(如字符串或图标等)或是基于统计原理的检验结果以判断水印存在与否,检测方案的目标是使错判与漏判的概率尽量小。为了增加去除水印的不可预测的难度, 目前大多数水印制作方案都在加入、提取时采用了密钥 只有掌握密钥的人才能读出水印。
数字水印技术有多种方法,根据数字水印加载方法的不同,可将数字水印分为空间域数字水印和变换域数字水印两大类。根据检测水印是否需要原始图像 可将数字水印技术分为私有水印技术、半私有水印技术和公开水印技术三类。
1.特殊要求
由于在印刷中必须对连续调图像进行加网以得到离散的半色调图像 用改变印版上单位面积内着墨量多少即网点数目来表示连续调图像的层次和颜色的变化 所以将数字水印技术应用于印刷品的防伪就必须考虑印刷中加网这一环节,即用于印刷品防伪的数字水印技术是基于半色调技术之上的。
除此之外,与在数字媒体中的应用相比,应用于印刷品防伪的数字水印除了以上提到的几个基本要求外,还要满足一些特殊的要求:
①视觉不可见性和机读性。表现在采用打印或印刷设备时,在各种分辨率下加入的水印,不能因分辨率的高低而使水印显现,同时它不影响原有印刷品的质量 只有通过特定的检测设备和计算机软件才可识别。
②抵抗色彩变换、文件格式变换在A/D和D/A转化过程中,数字水印算法需抵抗伽玛矫正和色彩失真 另外,图像在流通过程中,由于印刷品的老化也会产生色彩失真。同时也要能抵抗经常遇到图像文件格式(如BMP、TIFF、JPEG等)之间转换及常见的操作(旋转、剪切, 缩放等)。
③对印刷设备没有特殊要求.不改变印刷工艺流程.不增加印刷成本。
2.原理及算法
用于印刷品防伪的数字水印技术的原理与用于多媒体的数字水印技术的原理大致相同.只不过在水印的嵌入过程要考虑到加网.在水印的提取及检测过程要对印刷品图文信息进行扫描.在这个过程有一个模/数(A/D)转换过程。这就要求基于半色调的数字水印技术的算法在相应的嵌入和检测过程中必须考虑这些因素。其嵌入和检测过程如图1、2所示。
纵观以往数字水印在印刷品防伪方面的研究工作.可查阅资料并不多。现有的基于半色调图像的数字水印技术大致有以下几种:
①基于半色调图像的数字水印技术是将不可见的数字信息嵌入到一幅半色调图像中.通过扫描该半色调图像并实施一定的提取算法来获得嵌入的水印信息。其中的一种技术是使用两个不同的抖动矩阵来产生顺序抖动半色调图像.由于这两个不同的抖动矩阵所具有的不同统计特性.因此可以检测到水印是否存在。
②第二种技术是利用向量量化将水印嵌入到误差扩散半色调图像的最低有效位(LSB)上。
③第三种技术是在顺序抖动或误差扩散图像中.把水印数据隐藏在随机的位置.通过自套牢或成对套牢技术来改变这些随机位置的像素值来实现信息的隐藏(效果图如图3所示)。
④第四种技术是将水印数据隐藏在误差扩散图像里,使用误差扩散的方法来减轻因隐藏数据而带来的图像失真,以使图像获得良好的视觉效果。在上述方法中.尽管被隐藏的数据本身也是图像,但这些算法并没有提供直接在半色调图像上观察这些被隐藏的图像的方法。
⑤ 另一类技术是将被隐藏的可视图像嵌入两幅或多幅半色调图像中.当把这两幅图像进行叠合时.被隐藏的图像就可直接显现出来。其中的一种技术是运用随机网屏或共轭网屏来将被隐藏的信息嵌入到半色调图像中。因为共轭所具有的性质.当两幅半色调图像被叠合在一起时.被隐藏的信息将会呈现出来(其效果图如图4所示)。
⑥ 另一种技术是考虑噪声平衡误差扩散和交替使用不同的误差扩散核扩散的半色调数字水印技术。
⑦还有人使用一种基于半色调技术的人眼视觉系统模型.提出了直接二进制位搜索(Di rect Bina rySearch. DBS)的方法。DBS用于半色调图像的设计.以实现最优化的视觉效果质量与水印的检测。
3.结果讨论
我们用Matlab 6.5编程模拟实现了256级灰度图像lena (图3一a)的误差扩散加网(使用的是Jarvis—Nike误差扩散核)得到半色调图像(图3 一b),并使用不同的数字水印嵌入算法分别得到了含有水印信息的半色调图像:如图3一c和图4一b。
图3一c中使用的水印嵌入技术是把水印数据隐藏在误差扩散图像中随机的位置(位置由密钥决定).通过自套牢来改变这些随机位置的像素值来实现信息的隐藏。所得到的含有水印的半色调图像与原Iena半色调图像图3一b相比较.可以看到相当于在原图中加入一些噪声.当嵌入的水印信息不大.在HVS的对比度限定范围内时.是不会改变其视觉效果的。图4一b中使用的水印嵌入技术则是根据原半色调图像和水印图像的特征将水印信息嵌入到原半色调图像得到含有水印信息的半色调图像(图4一b).当将所得的图像与原来的半色调图像叠加时.就可以再现水印图像。
在实验条件下.将所得到的图像打印、扫描、预处理后根据对应的水印提取算法.可以分别提取出对应的水印图像。在实验中.水印除了使用图中的二值图片外.我们还使用了文本、武汉大学校徽等都得到了满意的结果。
美国Digimarc公司率先在1995年推出的媒体桥(mediab rldge)技术就以插件形式集成到Phot0 Sh0P和Corel Draw图像处理软件中。随后,又推出了开拓访问Inte rnet的一条新途径—— 通过在杂志广告、产品包装、目录甚至各类票据中隐藏不可见的数字水印。用户将这些传统媒体放在网络摄像机(web came ra)前,就可以直接将用户带到与印刷图像内容相关联的网络站点,并在计算机上显示出产品的相关信息。英国Signum公司推出的VerlData系列软件,用不可见的水印阻止商标的盗版以及重要文档的伪造、盗版和未授权的更改。瑞士AlpVision公司专为打印文档设计的SafePape r软件则可嵌在MicrosoftWord软件中。它将水印信息(如商标 专利 名字 金额等)隐藏到打印纸内.以此来证明该文档的真伪。日本的I BM东京研究实验室提出了用数据隐藏作为解决方案来鉴定数字化照片的来源.证实数字化照片的完整性.判断照片是否被篡改以及定位篡改的地方。
我国的有关部门研究人员正在加紧数字水印印刷防伪技术的研究工作.大连理工大学研究的数字水印防伪印刷技术可以实现在印刷图像中加入数字水印.并且可以通过扫描仪和专用软件完成印刷图像中数字水印的自动检测。上海阿须数码技术有限公司也推出了有自主知识产权的图像数字水印软件A S S u reImageMa rk 2.0:成都宇飞信息工程有限责任公司研究的印刷打印数字水印技术已得到商业化应用.并于2004年4月1日获得”国家科技型中小型企业创新基金”的资助。标志着我国数字水印技术的研究已经进入实质性阶段,其研发与应用水平与国际先进水平的差距逐步缩小。
最为一种较新的技术—— 数字水印在印刷领域中的应用是一个新的方向.我们相信.数字水印技术将在防伪印刷领域发挥越来越大的作用.并会带来可观的经济效益和社会效益。但是我们应同时看到目前市场上用于印刷品防伪的数字水印产品在技术上还不成熟.仍有大量的研究工作要做。

Ⅲ matlab编程实现一种简单的数字水印嵌入与提取方法

DCT嵌入水印图片与DWT是擦不多的。在Matlab上直接用函数的话值是一样的,应该说DWT包含DCT。下面我说一下嵌入过程,程序就不写了。网上很多的。给你一个嵌入思路。

DWT方法。原图大小为(512,512)嵌入图片大小为(64,64)

嵌入:

  1. 读取原图片。

  2. 读取水印图片。

  3. 原图片要处理为灰图。

  4. 水印图片要处理为2值图。

  5. 生成伪随机乱数(记住是怎么生成的,提取时用到)。

  6. 随机乱数做成2值图K与水印图生成密钥WK的2值图(方法有很多种)。

  7. 原图片做3次DWT处理(Matlab里函数是dwt2)得到图片DA,DB,DC,DD。

  8. 取出DB或DC,或者DB,DC都用上,设一个嵌入强度Q,与密钥K一起嵌入到DB,DC中(方法有很多种)。

  9. 将嵌入后的DB,DC与没有嵌入的DA,DD一起(DA,DB,DC,DD顺序不要错了)进行反DWT处理。

  10. 得到嵌入水印后的图片进行保存。

提取:

  1. 读取嵌入水印后的图片。

  2. 嵌入水印后的图片做3次DWT,并得到DA,DB,DC,DD。

  3. 定义Q(嵌入时的强度,比如5)。

  4. 生成嵌入水印时的伪随机乱数并做成2值图K。

  5. 取出,嵌入水印的成分(嵌入到DB的话取出DB,两个都用了就两个都取出,在这里用DB代替)。

  6. 进行嵌入时的反计算。

  7. 提取后的水印图片进行保存。

Ⅳ 如何利用matlab软件实现水印添加和提取

3 视频水印的嵌入和检测方案
3.1水印的预处理
采用二值图像作为待嵌入的水印数据,本文针对的研究对象因为是二维图像故采用的是二维Arnold变换。
二维Arnold变换定义为:
(3-1)
其中,(x,y)是原图像的像素点,(x’,y’)是变换后新图像的像素点,N是图像阶数,即图像的尺寸大小,一般多为正方形图像。由于Arnold变换具有周期性,因此可利用其周期性Period来对图像进行反变换。即在水印嵌入过程中可将水印置乱次数作为密钥times,再进行水印嵌入,当水印提取出来时,再将其继续: (Period-times)次即可使其恢复至原图。这就是利用Arnold的正变换来进行的置乱恢复方案。Arnold变换次数由版权所有者保管。
对水印进行置乱有以下优点:
(1) 采用置乱技术的合法者可以自由控制算法的选择,参数的选择以及使用随机数技术,从而使非法使用者难以破译图像内容,可以提高水印信息的安全性;
(2) 置乱技术可以分散错误比特的分布,提高数字水印的视觉效果,从而增强其鲁棒性。
3.2 视频水印的嵌入
水印嵌入算法关键在于以下三点:
(1) 水印的结构;
(2) 水印的嵌入区域;
(3) 嵌入技巧;
本文选取二值图像作为水印。为了提高水印的鲁棒性,大多数的DCT域水印算法把水印信号嵌入到DCT系数的低频部分。但低频区域是图像的能量集中部分,嵌入到低频会降低透明性。而嵌入在高频虽然透明性比较好,但对大多数的图像处理对高频成分影响较大,从而降低水印的鲁棒性.于是大多数的水印算法将水印信号嵌入在载体图像DCT系数的中频部分,以达到透明性和鲁棒性的最佳折衷。各种嵌入技巧的最终目的还是为了尽量地提高水印的鲁棒性和透明性。
用于版权保护的数字水印在尽量提高鲁棒性的同时还要满足人类的视觉极限,因此必须根据HVS找到嵌入位置。
本文将HVS归纳为运动敏感性、纹理敏感性和亮度敏感性。在接下来的嵌入过程中,充分利用了这些特性。如图3-1中间分支所示。
嵌入过程如图3-1所示。

图3-1 水印嵌入过程
从视频中读取亮度分量Y,因为它是最有效的数据,根据NEC算法,嵌入到它里面的水印才具有最强的鲁棒性。根据式(3-2)所示的运动敏感性阈值计算公式,寻找32帧满足敏感性比较大的视频帧Yi (i=1,2,…32)。
(3-2)
其中 (t代表当前帧的编号)
接下来,将Y32中的数据按照64*64的尺寸切分成20块BYij (j=1,2,…20),于是我们可得到20块尺寸为64*64*32的三维数据块BYk (k=1,2,…20),如图2-3所示。

图3-2 亮度分量的分块
根据式(3-3)、式(3-4)所示的亮度敏感性Lk和纹理敏感性Dk计算公式,通过计算,我们选择计算值都比较高的20块数据中的一块 ( )作为水印的嵌入块。
(3-3)

(3-4)
其中, 是BYk中的亮度数据, 。
最后,折衷考虑复杂度和性能,我们对选定的一块数据块 实施了2阶三维DCT变换。根据NEC算法的思想,且为了抵抗滤波和压缩攻击,我们将置乱后的水印序列嵌入到了第一帧DCT系数c(u,v)中,详见式(3-5)。
(3-5)
其中,w(u,v)是水印序列中的数据,c(u,v)是DCT变换后第一帧中的系数,c’(u,v)是嵌入水印后的系数,S是非负整数(且满足T1=S/4, T2=3*T1)。
嵌入完成后,对c’(u,v)实施反2阶三维DCT变换就得到了嵌入水印后的视频数据,再将它们放回原来的位置即可。
需要说明的是,在整个嵌入过程中,所有用到的参数都应作为密钥保留。
具体方案如下所述:
第一步:抽取32帧视频Y分量数据:
(1) 读取视频文件;
(2) 提取所有的Y分量,把所有的Y分量分为32组;
(3) 每组4帧,从各组中选出一个最运动敏感的,判断每组中最大的Y_deltmax,存入变量m;
(4) 定位最大的Y_deltmax,存入变量w;
Y32是就是所需的视频帧中Y分量满足敏感性的32帧视频 (355*288*32)。
第二步:分块过程:
(1) 对行分块(4块);
(2) 对列分块(5块);
(3) 隔十帧取一帧,共从32帧中取4帧以降低运算量;
(4) 一个数一个数的赋值;
切成20块,每块为64*64*4的数据块BY,维数不同,只能逐个象素赋值。
第三步:根据公式计算数据块BY的亮度敏感性L和纹理敏感性D
第四步:选取L和D都比较大的一块嵌入水印
(1) 判断最大的L,存入变量Lm;
(2) 去掉这个最大的块再比较;
(4) 赋第一块的L的权重为20;
(5) 计算第2块到第20块的L的权重;
(6) 同理对D进行处理;
(7) 计算每块BY的权重;
(8) 对所有的20块BY的权重qz按由小到大的顺序进行排序,并保持原来的位置索引index,则index[20]就是所要选取的块;
第五步:三维DCT变换
由于视频是由图像数据流组成的,所以可以把视频的每一帧看作是一幅静止的图像。对运动图像序列进行3D-DCT,可以视为先对视频的每一帧进行2D-DCT,再对帧间方向进行1D-DCT。
第六步:嵌入水印数据
将置乱的水印序列嵌入所选的DCT系数中,即嵌入经过3D-DCT变换后的数据块中的第一帧数据中。然后把这些数据进行反3D-DCT变换后放回原位置。
第七步:将所选的数据放回原位置
最后一步:写视频文件
3.3视频水印的检测
水印提取是嵌入的逆过程,本算法的一大优势是,水印提取时无需原始视频数据的参与,但依然需要一些参数。它们是:
(1) 嵌入过程第四步产生的块BY的排序结果,由此我们可以得知水印的大致嵌入位置;
(2) 嵌入时指定的参数S;
(3) 需要Arnold变换的次数和周期;
获得了上面的各项参数,水印的提取就十分简单,具体过程如图3-3所示。

图3-3 水印盲提取过程
方案如下:
从待提取水印的视频数据 (可能是被攻击过后的视频)中抽取出亮度分量Y’,根据密钥,抽出32帧中的四帧亮度分量 ,然后分别从这组数据中提取水印。
在图3-3中,首先将 分隔成20块 ,并找到和 对应的 。然后,对 做二阶三维DCT变换,根据式(3-6)提取出水印数据 。
(3-6)
其中, 是DCT系数。
最后,我们将 进行Arnold变换,得到水印图像,作为最终提取出的水印。
具体步骤如下所述:
第一步:抽取32帧视频Y分量数据:
(1) 读取嵌入水印图像的视频文件;
(2) 提取所有的Y分量,把所有的Y分量分为32组;
(3) 每组4帧,从各组中选出一个最运动敏感的,判断每组中最大的Y_deltmax,存入变量m;
(4) 定位最大的Y_deltmax,存入变量w;
Y32是就是所需的视频帧中Y分量满足运动敏感性的32帧视频,Y32是一个355*288*32的三维数组。
第二步:分块过程:
(1) 对行分块(4块);
(2) 对列分块(5块);
(3) 隔十帧取一帧,从32帧中共取4帧以降低运算量;
(4) 一个数一个数的赋值;
切成20块,每块为64*64*4的数据块BY,维数不同,只能逐个象素赋值。
经过计算其亮度敏感性和纹理敏感性并排序,index[20]就是本文算法中嵌入水印的块;
第三步:三维DCT变换
第四步:Arnold变换
由于本算法中水印图像是二值图像,其Arnold变换是二维变换,周期是Period,嵌入水印时变换了times次,所以此处只需变换(Period-times)次就可得到结果。
第五步:写图像文件
提取水印图像数据并写成图像文件
第六步:检测水印图像存在与否,并与原水印图像比较。
最后一步:进行实验,验证本文算法的可见性和鲁棒性。
经过以上步骤就是水印图像信息嵌入视频中的方法,具体实现过程见第四章。

4 用MATLAB实现视频水印的嵌入和检测
Matlab是近年来在国内外广泛流行的一种可视化科学计算软件。它的特点是结构简单、数值计算高效、图形功能完备、图像处理方便,是国际公认的最优秀的科学计算与数学应用软件之一。利用Matlab实现数字水印图像算法便捷、高效,省去了繁琐的程序代码,避免了科研人员在编程上浪费精力。
其内容已涉及矩阵代数、微积分、应用数学、信号与系统、神经网络、小波分析及应用、数字图像处理、计算机图形学、自动控制与通信技术等诸多方面,是科学计算、系统仿真、信号与图像处理的主流软件,受到了各方科研人员的青睐,在数字水印技术中得到了广泛的应用。将Matlab应用于数字水印技术,其优点主要有以下几个方面:
(1) 强大的数值计算功能
视频水印技术是针对图像进行研究的,而图像是由矩阵表达的,将水印嵌入视频中及从视频中将水印提取出来都意味着大量的矩阵运算,而矩阵运算更是Matlab语言的核心,表达自然、直接。因此,利用Matlab强大的矩阵运算功能来实现图像水印技术非常合适。
(2) 方便的图像读取和显示功能
视频水印首先要将数据从视频中读取出来,嵌入水印后还要将嵌入水印后的数据还原为视频。Matlab为用户提供了专门的图像处理函数,用于读写显示图像数据。这种方法不像其他编程语言那样,需要编写复杂的代码,只需要简单地调用Matlab提供的函数即可,相关的函数及其功能主要有下列一些:
imread 将图像读入工作空间;
imwrite 将图像写入磁盘;
image 提供最原始的图像显示函数;
imshow 是最常用的显示各种图像的函数;
load将文件读入工作空间;
(3) 高效的图像变换功能
数字水印嵌入算法一般分空域方法和频域方法。空域方法指通过改变象素的亮度值来加入数字水印:频域方法指图像通过某种变换后再嵌入数字水印。与空域法相比,频域法具有如下优点:在变换域中嵌入的水印信号可以分布到空域的所有象素上,有利于保证水印的不可见性。在变换域中,视觉系统的某些特性(如视频特性)可以更方便地结合到水印编码过程中。变换域的方法可以与国际数据压缩标准兼容,从而实现压缩域内的水印编码。因此,变换域的方法应是水印算法未来趋势的主流。但是变换域的算法一般来讲计算量都比较大,需要复杂的编程运算,Matlab则改变了这种现状。在Matlab图像处理工具箱中,提供了常用的图像变换函数,复杂的变换域算法在Matlab中只需简单地调用函数即可实现,充分体现了使用Matlab的简便性和高效性。
主要图像变换函数如下:
dct是一维离散余弦变换;
idct是一维离散余弦逆变换;
dct2是二维离散余弦变换;
idct2是二维离散余弦逆变换;
(4) 丰富的图像处理函数
水印技术要求嵌入的水印不可见且有较强的鲁棒性。不可见性可通过视觉效果和计算图像的峰值信噪比来比较优劣,而鲁棒性则要对水印后图像进行各种攻击,通过比较攻击后图像提取出的水印情况来说明问题。Matlab有各种图像处理函数,可实现对图像的各种攻击。
综上所述,Matlab具有语言简洁、函数丰富、使用方便、数值计算高效等特点,将功能强大的Matlab软件应用于数字水印技术是有效的选择,因此,本文采用Matlab对图像水印进行研究。
4.1水印的嵌入过程
(1) 基于Arnold变换的图像置乱
Matlab实现如下:
Arnold变换由function r=Arnold(w0,row,colum,times) 实现,其中w0为读取的图像数据,row是行数,colum是列数,times是Arnold变换次数。
function r=Arnold(w0,row,colum,times)
for k=1:times
for i=1:row
for j=1:colum
i1=i+j;
j1=i+2*j;
if i1>row
i1=mod(i1,row);
end
if j1>colum
j1=mod(j1,colum);
end
if i1= =0
i1=row;
end
if j1= =0
j1=colum;
end
w1(i1,j1)=w0(i,j);
end
end
w0=w1;
end
r=w0;
用imwrite(w0,'Arnold.bmp', 'bmp')写置乱后的图像文件;在MATLAB中用imshow('Arnold.bmp')显示此图像。
本文采用二维的二值水印图像watermark.bmp,我们将图像数据(64*64)扫描到二维的矩阵中并实施Arnold变换,从而得到置乱后的二维矩阵。随着迭代次数的增加,图像逐渐趋于混乱,不过到一定次数时,又将回到原图。因为watermark.bmp大小为64*64,故经过试验图像迭代48次后将回到原图,即周期性Period=48。
本算法选择置乱8次,因为8次Arnold变换后原水印图像已经成为无形状的图像。实验结果表明,该方法能较好地刻划图像的置乱程度,与人的视觉基本相符。但需要指出的是不一定图像的置乱次数越多其置乱度就越高。所以,在水印嵌入时,为了提高其鲁棒性而增加置乱次数的方法是不科学的,合理的做法是计算置乱后图像的置乱度,达到较为满意的置乱度后就可停止置乱,避免盲目的提高置乱次数。
置乱次数作为密钥有视频版权所有者保管,如果非法所有者不知道置乱次数就很难恢复出原水印图像。
原水印图像如图4-1所示,本算法实现置乱8次后效果如图4-2所示:

图4-1 水印原图像 图4-2 置乱8次后
(2)Matlab实现嵌入过程:
本文中选取352×288×142的yuv格式视频流进行测试。YUV颜色模型是一种常用的颜色模型,其基本特征是将亮度信号与颜色信号分离,由于人眼对亮度的变化比对颜色的变化敏感,因此,YUV模型中Y分量的值所占带宽大于等于彩色分量所占带宽。YUV色彩空间模型可以在一定程度上避免RGB模型的高分散性和高相关性所带来的闭值划分问题,计算也较为简单。这种色彩空间模型中Y和UV分量是相互独立的,反映了人眼观察彩色的视觉规律,在实际中应用较多。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominan“或Chroma),作用是描述影像色彩及饱和度,用于指定像素颜色。因此选择YUV颜色空间更加稳定,易于分析。
本文选择测试视频中的第39帧如图4-3所示。YUV格式的视频中Y:U:V=4:2:2,但通俗叫“420”格式。

图4-3 未嵌入水印的视频
第一步:读取文件;
读取视频文件由[yuv,Y,u,v,num_f]=loadyuv(filename)实现,filename是所选取得视频文件名称。yuv是一个四维数组,它返回的是视频的yuv分量,Y是亮度分量,u和v是色彩分量,num_f是视频文件中所有帧的数目。
读取一帧数据的YUV分量在Matlab中由以下源代码实现:
function [YUV,Y,U,V] = loadFileYUV(width,heigth,Frame,fileName,format)
[Teil_h,Teil_b]=YUVFormat(format);
fileId = fopen(fileName,'r');
其中width:每一帧的宽度;heigth:每一帧的高度;Frame:当前load的那一帧;filename:视频文件名;Teil_h:垂直比例参数;Teil_b:水平比例参数;YUV:返回值,返回YUV分量,是一个三维变量,本文算法中将U、V分量的宽度和高度设成与Y一样的了,因此U、V分量中有重复的。YUV(:,:,1)存放Y分量;YUV(:,:,2)存放U分量;YUV(:,:,3)存放V分量;Y,U,V是三个分量的实际值,二维矩阵,没有重复,他们的长度可能不一样。
Y_delt(j)=delt(Y(:,:,w(i)),Y(:,:,4*(i-1)+j));
其中Y_delt是当前帧与下一组各帧的Y的差,m(i)=max(Y_delt(j));判断每组中最大的Y_deltmax,存入变量m,以此来得到每组中最运动敏感的视频帧。w(i+1)=4*(i-1)+k定位最大的Y_deltmax,存入变量w。
最后得到Y32=double(Y(:,:,w)), Y32是视频帧中Y分量满足敏感性的32帧视频是一个355*288*32的三维数组。
第二步:分块;
分块时因为需要块标号,由此造成维数不同,所以只能逐个象素赋值,在Matlab中由BY(t1,t2,t3,j*5+k+1)= double(Y32((64*j+t1),(64*k+t2),i))实现,切成20块,每块为64*64*4的数据块BY ,其中t1是块的杭坐标,t2是块的列坐标,t3帧标号,j*5+k+1是快标号。
第三步:三维DCT变换;
运动图像序列的每一帧可以看作是静止图像 对运动图像序列进行3D DCT,可以视为先对每帧进行2D DCT,再对帧间方向进行1D DCT。
%对每一块的帧间方向进行1D DCT变换
for i=1:64
for j=1:64
dcta(i,j,1:4,index(20))=dct(BY(i,j,1:4,index(20)));
end
end
%对每一块的每一帧进行2D DCT
for i=1:4
dct3a(:,:,i,index(20))=dct2(dcta(:,:,i,index(20)));
end
第四步:嵌入水印过程;
读入二值水印图像由message=double(imread('watermark.bmp'))实现 ,message是一个由0和1组成的二维数组。
将置乱的水印序列嵌入所选的dct系数中,源代码如下所示:
其中dct3a是DCT系数,index[20]是纹理敏感性和亮度敏感性都比较好的一块,S作为密钥由版权所有者保管。
S=60;
T1=S/4;
T2=3*T1;
for i=1:64
for j=1:64
if (w2(i,j)==1)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S)+T1;
end
if (dct3a(i,j,1,index(20))<0)
dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T1;
end
end
if (w2(i,j,:)==0)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S)+T2;
end
if (dct3a(i,j,1,index(20))<0)
dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T2;
end
end
end
end
第五步:三维DCT反变换;
先对块的第一帧进行二维DCT反变换,然后在对其它三帧进行二维反变换,最后对帧间方向进行一维DCT反变换。此过程由Matlab实现如下:
二维DCT反变换:
idcta(:,:,1,index(20))=idct2(dipin);
for i=2:4
idcta(:,:,i,index(20))=idct2(dct3a(:,:,i,index(20)));
end
对每一块的帧间方向进行一维DCT反变换
for i=1:64
for j=1:64
idct3a(i,j,1:4,index(20))=idct(idcta(i,j,1:4,index(20)));
end
end
第六步:把这些数据放入原位置;
第七步:写视频文件;
写视频文件由以下程序实现,其中fileId为写入视频文件的位置。
fileId = fopen('vectra_w.yuv','wb')
fwrite(fileId,Y(:,:,i)' , 'uchar');
fwrite(fileId,u(:,:,i)' , 'uchar');
fwrite(fileId,v(:,:,i)' , 'uchar');
效果如图4-4所示:

图4-4 嵌入水印的视频
4.2水印的检测过程
水印的检测过程就是嵌入水印的逆过程,其Matlab实现如下所示:
filename='vectra_w.yuv';此文件是对含有水印的视频(可能是被攻击过后的视频)文件。
[yuv,Y,u,v,num_f]=loadyuv(filename);
读取视频文件和三维DCT正变换其原理和嵌入过程相同,此处不再赘述。
提取水印数据在Matlab中由以下程序实现,其中S、T1、T2等都是嵌入时的密钥,版权所有者拥有它。
for i=1:64
for j=1:64
if (mod(abs(dct3b(i,j,1,index(20))),S)<((T1+T2)/2))
shuiyin(i,j)=1;
end
if (mod(abs(dct3b(i,j,1,index(20))),S)>=((T1+T2)/2))
shuiyin(i,j)=0;
end
end
end
Arnold反变换如下所示:
w0=shuiyin;
w2=Arnold(w0,Hm,Wm,40);
w0是检测到的水印数据,Hm和Wm是水印数据的行和列,变换次数为40。
写水印文件,检测水印图像存在与否,并且和原水印图像有无差异。
imwrite(w2,'恢复.bmp', 'bmp');
imshow('恢复.bmp');
综上,水印的嵌入主要经过将视频和水印分别进行预处理,然后根据嵌入算法选择水印的合适嵌入位置以及合理嵌入策略,从而得到含水印的视频数据。在各个环节中采用HVS特性来提高视频水印的鲁棒性.最后用相应的视频水印检测策略提取出水印从而实现视频的保护。结果显示本文算法能成功提取出水印图像。

Ⅳ matlab数字水印lsb方法

% read image
mat = imread('1.jpg');
mba = imread('2.bmp');
imgread = rgb2gray(mat);
mbt=imresize(mba,size(imgread));
mbt = uint8(mbt);
[maa,mab] = size(imgread);
[mba,mbb] = size(mbt);
md = ones(maa,mab);
ma = zeros(2*maa,2*mab);
ma = im2uint8(ma);

% progress the image
for i=1:1:maa

for j=1:1:mab

imgread(i,j)=imgread(i,j)-mod(imgread(i,j),4);
end
end

%========================
%enlarge image

%=======================
for j=1:1:mab
for i=1:1:maa

ma(2*i-1,2*j-1) = imgread(i,j);
ma(2*i,2*j-1) = imgread(i,j);
ma(2*i-1,2*j) = imgread(i,j);

ma(2*i,2*j) = imgread(i,j);
mb(2*i-1,2*j-1) = mbt(i,j);
mb(2*i,2*j-1) = mbt(i,j);
mb(2*i-1,2*j) = mbt(i,j);

mb(2*i,2*j) = mbt(i,j);
end
end

ma = ma+mb*3;
%ma = ma-mb*3;
%=======================
% attack

%=======================

noise = normrnd(0,0.2,2*maa,2*mab); %Gaussian, uniform,

% laplace,salt-pepper
ma = double(ma);
ma = ma+ noise;
ma = uint8(ma);
figure(1);

subplot(2,2,1);imshow(imgread);
subplot(2,2,2);imshow(mbt,[0,1]);
subplot(2,2,3);imshow(ma);
subplot(2,2,4);imshow(noise)%

%subplot(2,2,1);imshow(mb,[0,1]);subplot(2,2,2);imshow(ma);subplot(2,2,3);imshow(mc);

%=======================
% watermark extraction
%=======================
for i=1:1:maa

for j=1:1:mab

a=mod(ma(2*i-1,2*j-1),2)+mod(ma(2*i,2*j-1),2)+mod(ma(2*i-1,2*j),2)+mod(ma(2*i,2*j),2);

a=(-a+mod(ma(2*i-1,2*j-1),4)+mod(ma(2*i,2*j-1),4)+mod(ma(2*i-1,2*j),4)+mod(ma(2*i,2*j),4))/2;

if a<4

md(i,j)=0;
else
md(i,j)=1;
end
end
end

md = uint8(md);
figure(2);imshow(md,[0,1]);

Ⅵ 遗传算法实现数字水印用MATLAB,程序怎么写啊可以把我的积分都给了你

一、嵌入水印信息的MATLAB程序
首先读入原始图象并设置参数,然后嵌入水印信息,程序代码如下:
clear
%
%读入原图象
trueImage=imread('C:\Documents and Settings\ks001\My Documents\My Pictures\lean.tif');
alfa=.1;
LENGTH=2500;
subplot(2,2,1);
imshow(trueImage);
title('原始图象');
%
%对原图象进行DCT变换
dctF1=dct2('C:\Documents and Settings\ks001\My Documents\My Pictures\lean.tif');
subplot(2,2,2);
imshow(log(abs(dctF1)),[ ]);
title('DCT cofficient matrix');
[m,n]=size(dctF1);
%
%产生水印序列并对其排序
radon('right',10);
watermark1=radon(LENGTH,1);
subplot(2,2,3);
title('watermark seqence')
[Y0,I0]=sort(watermark1);
%
%找出水印嵌入位置(幅值较大的n个频域成分)
A=dctF1(:);
[Y1,I1]=sort(A);
x=m*n;
k=LENGTH;
M=zeros(x,1);
%
%修改幅值较大的n个频域成分的幅值,嵌入水印(因为两个问题不同,所以有两个注释符)
for i=1:x
if k>=1
M(x)=Y1(x)*(1+alfa*Y0(k));
k=k-1;
else
M(x)=Y1(x);
end
x=x-1;
end
N=zeros(x,1);
x=m*n;
for i=1:x
N(I1(i))=M(i);
end
a=1;
for j=1:n
for i=1:m
dctF2(i,j)=N(a);
a=a+1;
end
end
%
%DCT反变换,得到嵌入水印的图象
idctF1=idct2(dctF2);
subplot(2,2,4);
imshow(idctF1,[ ]);
title('嵌入水印后的图象');
end

二、提取恢复水印信息的MATLAB程序
水印提取过程是水印嵌入过程的逆过程,相对嵌入过程来说比较复杂,难度较大,下面是水印提取检测的MATLAB程序代码:
function watermark_detect(image,Y1,I0,waterMark1)
%image:嵌入水印的图象
%Y1:原始图象的序列排序
%I0:原始水印的序列排序
%waterMark1:原始水印序列
%
%对嵌入水印图象进行DCT变化
dctW1=dct2(image);
%
%找出幅值较大的系数
B=dtW1(:);
[Y1,I2]=sort(B);
[m1,n1]=size(dctW1);
y=m1*n1;
k=length(waterMark1);
N0=zeros(k,1);
%
%提取水印序列
while k>=1
N0(k)=(Y2(y)-Y1(y))/alfa/Y1(y);
k=k-1;
y=y-1;
end
k=length(waterMark1);
waterMark2=zeros(k,1);
for i=1:k
waterMark2(I0(i))=N0(i);
end
%
%选取50个测试序列,其中第10个为提取出的水印
figure;
for i=1;50
if i==10;
waterMark=waterMark2;
else
waterMark=rand(k,1);
end
%计算各个序列与原来水印序列的相关值
c=waterMark'*waterMark1/sqrt(waterMark'*waterMark);
stem(i,c);
hold on;
end
%

三、接下来对嵌入水印的图象进行不同的攻击,用以测试水印的鲁棒性。
程序的目的和程序代码如下:
%
%攻击实验
disp('input you choice according to the following
image processing operation:');
disp('0--exit');
disp('1--smoothing patterns');
%添加噪音
disp('2--adding uniorm noise 添加噪音');
%滤波
disp('3--adding filter [10 10] 滤波');
%剪切
disp('4--cutting part of the image 剪切');
%压缩
disp('5--10 quality JPEG compressing 压缩');
%旋转45度
disp('6--rotate 45 旋转');
%
d=input('please input you choice(请输入您的选择):');
while d~=0
switch d
case 1
watermark_detect(idctF1,Y1,I0,waterMark1);
case 2
WImage2=idctF1;
noise0=10*rand(size(WImage2));
WImage2=WImage2+noise0;
figure;
imshow(WImage2,[ ]);
title('adding uniform noise 添加噪音');
watemark_detect(WImage2,Y1,I0,waterMark1);
case 3
WImage3=idctF1;
H=fspcial('gaussian高斯',[10,10],5);
WImage3=imfilter(WImage3,H);
figure;
imshow(WImage3,[ ]);
title(through filter [10,10] 滤波');
watemark_detect(WImage3,Y1,I0,waterMark1);
case 4
WImage4=idctF1; WImage4(1:128,1;128)=256;
figure;
imshow(WImage4);
title('cutting part of the image 剪切');
watemark_detect(WImage4,Y1,I0,waterMark1);
case 5
WImage5=idctF1;
WImage5=im2double(WImage5);
cnum=10;
dctm=dctmtx(8);
p1=dctm;
p2=dctm.';
imageDCT=blkproc(WImage5,[8,8],'p1*p2*x',dctm,dctm.');
DCTvar=im2col(imageDCT,[8,8],'distinct').';
n=size(DCTvar,1);
DCTvar=(sum(DCTvar.*DCTvar)-(sum(DCTvar)/n).^2)/n;
[m,order]=sort(DCTvar);
cnum=64-cnum;
mask=ones(8,8);
mask(order(1:cnum))=zeros(1,cnum);
im88=zeros(9,9);
im88(1:8,1:8)=mask;
im128128=kron(im88(1:8,1:8),ones(16));
dctm=dctmtx(8);
p1=dctm.';
p2=mask(1;8,1:8);
p3=dctm;
Wimage5=bikproc(imageDCT,[8,8],'p1*(x.8p2)*p3',dctm.',mask(1:8,1:8),dctm);
figure;
imshow(Wimage5);
title('JPEG Image 压缩');
watemark_detect(WImage5,Y1,I0,waterMark1);
case 6 WImage6=idctF1;
WImage6=imrotate(WImage6,45,'bilinear','corp');
figure;
imshow(Wimage6);
title('rotate 45 旋转');
watemark_detect(WImage6,Y1,I0,waterMark1);
case 0
break;
otherwise
error('you have a valid value(您的输入错误)');
end
d=input('please input you choice(请输入您的选择):');
end
%结束

Ⅶ 基于DCT数字水印算法的Matlab实现源代码

  1. 读取图片

  2. 读取水印图片(二维码)

  3. 原图片做成灰度

  4. 水印图做成二值图

  5. 原图做8*8DCT处理

  6. 选择DC成分以外的元素(每个8*8块里选择1个元素)

  7. 生成伪随机乱数

  8. 根据乱数做成密钥

  9. 将水印图根据密钥与算法嵌入到第6步骤

  10. 嵌入后将每个元素替换原来的第6步元素

  11. 做反变换

  12. 图片保存,嵌入完毕

提取

  1. 读取嵌入水印后的图片

  2. 生成嵌入时的伪随机乱数(生成乱数之前可以加一些几何攻击)

  3. 根据乱数做成密钥

  4. 嵌入水印后的图片做8*8DCT处理

  5. 选择DC成分以外的元素(选取跟原来嵌入时相同)

  6. 根据算法与密钥提取水印图

  7. 提取的水印图与原水印图做比较

  8. 保存提取的水印图,提取完毕

阅读全文

与数字水印算法matlab相关的资料

热点内容
linux安装deb包 浏览:521
电脑盘文件夹如何平铺 浏览:267
相机卡满了没文件夹 浏览:751
如何批量快速压缩视频 浏览:432
我的世界如何加入ice服务器 浏览:873
兄弟cnc编程说明书 浏览:204
php闪电入门教程学习 浏览:152
金岳霖逻辑pdf 浏览:938
linuxtomcat线程 浏览:77
pboc长度加数据加密 浏览:187
英雄联盟国际服手游怎么下安卓 浏览:297
程序员的思路 浏览:234
只能用命令获得的四种方块 浏览:358
怎么用命令方块防止开创造 浏览:807
扫描版的pdf 浏览:790
编程猫怎样做3d游戏 浏览:207
怎么查找云服务器上的ftp 浏览:156
我的世界服务器如何注册账号 浏览:935
统计英文字符python 浏览:424
linux信息安全 浏览:910