本篇内容主要讲解“Matlab中图像数字水印算法的原理与实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Matlab中图像数字水印算法的原理与实现方法是什么”吧!
基本原理
图像数字水印技术以一定的算法将一些标志性信息嵌人到图像中,而不影响原图像的面质和使用。水印信息可以是序列号或有特殊意义的文本等,通过和载体图像的紧密结合而达到识别图像来源、作者等版权信息的目的。与传统加密技术不同,图像水印技术的目的并不在于直接阻止对图像的盗版,而是着眼于如何将版权信息加入到正版图像,并能够从盗版图像中提取出先期加人的版权方面的证据(水印),在能够证明图像确系盜版之后再以法律的手段对盜版者实施制裁。
图像数字水印处理可分为对水印的嵌人处理和对已嵌人的水印的检测处理两部分。从图像处理的角度看,嵌人水印可以看作是在强背景(原始图像)下叠加一个弱信号(水印),由于人的视觉系统对图像的分辨率有限,因此只要叠加的信号在幅度上低于某个对比度门限,就可以使人眼完全感受不到叠加信号的存在,这个对比度门限主要受系统的空间、时间和频率特征的影响。因此,在不改变视觉效果的前提下,对原始图像做一定的调整,嵌入一些额外信息是完全有可能的。
由于图像数字水印的目的不在于限制其正常的图像复制,而在于保证隐藏其內的水印不被侵犯和发现。因此,在向图像嵌人水印时。必领考虑到正常的信息操作对水印所造成的威胁,以及要求水印能够对通常的图像编辑操作具有一定的抵御、免疫能力。根据图像水印的目的和技术要求,可以总结出图像水印的一些特点。
①鲁棒性 (robustness):图像一旦嵌人了水印后,图像与水印将紧密地融合在一起,而且不因因像的某种处理而导致隐含的水印信息丢失。这里所谓的“处理”,包括了噪声干扰、滤波、平滑、增强、重采样、有损编码压缩、D/A 或 A/D转换等各种常规的图像处理手段。图像水印除了能对无意识的图像处理操作具有抵御能力外,还应具各抵扰恶意删除攻击、逃惑攻击等有意识政击的能力,除非攻击方对加人的水印有足够的先验知识,否则任何破坏和去除水印的企图都将严重损坏因像的面质,使破解后的图像毫无利用价值。
②不可检测性(undetectability):水印和图像应具有一致的特性,如统计噪声分布等,这样可以使非法攻击者无从确认该图像是否含有水印信息。
③透明性 (invisibility):此特性主要应用了人眼的生理特点,经过隐藏处理的图像水印不会对原始图像有视觉可察的画质降低现象。
④低复杂性:水印的嵌人和提取识别算法应简单易行。
⑤自恢复性:嵌入了水印的图像在经过一系列的处理和变换后,可能对原图产生了较大的破坏,这就要求从留下的片段中仍可提取出水印(或水印残片),并根据检验出的结果确认出水印的存在。
算法介绍
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; %图像矩阵赋给tempImgfor n=1:5 %置乱次数for u=1:64for v=1:64temp=tempImg(u,v);ax=mod((u-1)+(v-1),64)+1;%新像素行位置ay=mod((u-1)+2*(v-1),64)+1;%新像素列位置outImg(ax,ay)=temp;endendtempImg=outImg;endG=uint8(outImg);%得到置乱后的水印图像%嵌入水印for p=1:64for 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反变换endend%显示嵌入水印后的图像imwrite(uint8(W), 'lena_mark.jpg ', 'jpg');subplot(2,2,3);imshow('lena_mark.jpg');title('嵌入水印后的图像');
上图中0.2为可调参数嵌入强度系数,可以发现,随着嵌入强度的增大,嵌入水印后的图像效果越来越差。
2 数字水印提取
水印的提取是根据水印的嵌入策略执行相应的逆过程来提取水印。因此,在水印提取过程中,只须将嵌人水印后的图像块经DCT变换后的系数减去相应强度的水印信息就可以提取出嵌人该块的水印信息,再对所有块提取出来的水印信息进行反置乱就得到提取出来的水印图像。
水印提取的具体步骤如下:
第一步,读入嵌入水印后的图像W和原始水印图像I。
第二步,分别对W和I进行分块DCT变换,得到每个块的系数矩阵。
第三步,对每个8X8块的中频系数位置上,利用公式
计算出每一块的水印信息,合并成一个整图,就得到了提取出来的水印图像。
代码如下:
for p=1:64for q=1:64BLOCK1=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;endend% 对水印进行arnold反置乱for n=1:43 % 循环次数为48-5for u=1:64for v=1:64temp1=Y(u,v);bx=mod((u-1)+(v-1),64)+1;by=mod((u-1)+2*(v-1),64)+1;outImg1(bx,by)=temp1;endendY=outImg1;end%显示提取出来的水印图像imwrite(uint8(Y), 'watermark.jpg ', 'jpg');subplot(2,2,4);imshow('watermark.jpg');title('提取出来的水印图像');
到此,相信大家对“Matlab中图像数字水印算法的原理与实现方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!