1.算法描述
随着互联网的普及和数字技术的广泛应用,数字产品变得极大丰富并且传播便捷,同时版权保护问题也日益突出。传统的信息安全技术在数字产品版权保护方面存在的不足,促成了数字水印技术的发展。数字水印技术将数字水印隐藏于数字媒体中,以便在版权纠纷中为版权所有者提供版权证明。数字水印根据水印的嵌入技术不同分为空间域数字水印和变换域数字水印。空间域算法包含叠加法和最低有效位(LSB)图像水印法等,变换域算法包含小波变换法等。实验部分使用Matlab软件进行,并分别用这三种方法对图像数字水印进行嵌入与提取。最后在相同的水印信号条件下,结合这三种方法所产生的含水印图像的峰值信噪比,分析了这三种方法的优缺点。
研究数字图像版权保护问题,由于数字媒体在网上易被复制篡改.针对单纯奇异值分解或小波变换水印算法均存在抵抗攻击差的难题,为了更好的保护数字图像版权,提了一种奇异值分解与小波变换相结合的数字水印算法.首先对水印图像进行置乱处理并对原始图像进行分块,从中找到符合要求的最佳水印嵌入子块,然后对所选择的最佳子块进行小波变换,对子块的低频系数进行奇异值分解,最后将水印嵌入各子块的奇异值中进行仿真.结果表明,水印算法能够很好的抵抗多种攻击,水印具有很好的鲁棒性和不可见性,克服了奇异值分解和小波变换水印算法缺陷,为设计提供了依据.
随着互联网普及,信息通讯技术的飞速发展,多媒体技术得到了充分的应用。但是开放的互联网使这些多媒体信息的传输变得不安全,而数字水印技术恰恰能保护这些多媒体信息的传输。数字水印技术通过一定的嵌入算法将一些可以用来标识多媒体数据的来源、版本、作者等标志性信息嵌入到多媒体数据中来保护多媒体数据的版权,但是不影响原始数据的使用和价值,并且不易被人察觉 。根据嵌入位置的不同,数字水印算法分为空域和变换域水印算法。
数字水印技术是一种基于内容的、非密码机制的计算机信息隐藏技术。它可以将一些标识信息直接嵌入数字载体当中,且不影响原载体的使用价值,也不容易被探知和再次修改,从而实现保护版权、信息隐藏的功能。数字水印按照特性可以分为鲁棒数字水印和脆弱数字水印。本部分重点研究脆弱数字水印的应用,同时分别分析三种水印算法的机理和效果。
对64x64像素的水印图像(可为rgb或灰度图像)进行猫脸变换,得到置乱后的水印图像W ′ W'W ′;对512x512像素的载体图像分割成互不重叠的8x8的小方块,后对每个小块进行DCT离散余弦变换,取变换矩阵中的中频系数构成4x4的矩阵B i j ( i = 1 , 2 , . . . , m ; j = 1 , 2 , . . . , n ) B_{ij} 矩阵进行奇异值分解SVD,取最大的奇异值构成矩阵A AA,再对A AA进行奇异值分解: A = U S V T A=USV^TA=USV T;将置乱后的水印图像矩阵W ′ W'W ′叠加到矩阵S SS上,D = S + α W ′ D=S+\alpha W'D=S+αW ′奇异值分解 反变换得 A ′ = U S 1 V T A'=US_1V^TA ′=US 1V T将 A ′ A'A ′中相应的元素替换 B i j B_{ij}B ij中的最大奇异值,将变换后的中频系数矩阵 B i j B_{ij}B ij还原回相应的块中;对每一块嵌入了水印信息的矩阵进行逆DCT变换,最后得到嵌入了水印图像信息的图像I ′ I'I 。
2)水印提取过程
对图像I*分成8x8的小块,并对每一个小块进行DCT离散余弦变换;取每一块中的16个中频系数,构成矩阵Bij*; 后对其进行奇异值分解SVD,取最大奇异值构成矩阵A*;设需要提取的水印图像为W*,将提取出的灰度水印图像经过猫脸逆变换,得到水印图像。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Image=imread('lena.png');
% Water=imread('water.png');
global src_image;
global src_water;
Image=src_image;
Water=src_water;
[Iwm,Uw,Vw]=EmbedWatermark(Image,Water);
switch get(handles.popupmenu1,'value')
case 1
case 2
number2 = floor(get(handles.slider2,'value')*100);
if number2==0
number2 = number2+1;
end
Iwm = JPEG2000Attack(Iwm,number2);
case 3
number3 = floor(get(handles.slider3,'value')*100);
Iwm = JPEGAttack(Iwm,number3);
case 4
if get(handles.radiobutton1,'value') == 1
number4 = 1;
elseif get(handles.radiobutton2,'value') == 1
number4 = 2;
else
number4 = 3;
end
Iwm = noiseAttack(Iwm,number4);
case 5
if get(handles.radiobutton4,'value') == 1
number5 = 1;
elseif get(handles.radiobutton5,'value') == 1
number5 = 2;
else
number5 = 3;
end
Iwm = FilterAttack(Iwm,number5);
case 6
Iwm = SharpenAttack(Iwm);
case 7
Iwm = histeqAttack(Iwm);
end