基于小波变换的脆弱水印嵌入算法(Matlab代码实现)
基于小波变换的脆弱水印嵌入算法(Matlab代码实现)
本文介绍一种基于小波变换的脆弱水印嵌入算法,并提供完整的 Matlab 代码实现。该算法通过修改小波系数之间的关系来嵌入水印,具有较好的不可见性。
完整代码如下:
function J = wm(I,w,g)
% 此函数为嵌入过程
% 输入:I为原始图像;w为水印信息;g为水印嵌入的阈值
% 输出:J为嵌入水印的图像
%%
% 参数设置
step = 0.5; % 小波系数增长步长
%%
[mm,nn] = size(I);
% 一层小波分解
[LL,LH,HL,HH] = dwt2(I,'haar');
%=======计算avr_LH======
[m0,n0] = size(LH); avr_LH = 0;
for i = 1:m0
for j = 1:n0
avr_LH = avr_LH + abs(LH(i,j));
end
end
avr_LH = avr_LH / (m0*n0);
%=======计算avr_HL======
[m1,n1] = size(HL); avr_HL = 0;
for i = 1:m1
for j = 1:n1
avr_HL = avr_HL + abs(HL(i,j));
end
end
avr_HL = avr_HL / (m1*n1);
%判断嵌入的子带
if avr_LH <= avr_HL
num = 0; loca = LH;
else
num = 1; loca = HL;
end
%%
% 嵌入水印
if num == 0
loca = wm_type_0(loca,w,step,g); %LH是横向,写出嵌入子函数
else
loca = wm_type_1(loca,w,step,g); %HL是纵向,写出嵌入子函数
end
%%
if num == 0
LH = loca;
else
HL = loca;
end
J = idwt2(LL,LH,HL,HH,'haar',[mm,nn]); %小波逆变换,还回原始图像
end
function loca = wm_type_0(loca,w,step,g)
% 此函数用于在LH子带嵌入水印
% 输入:loca为要嵌入水印的子带
% 输出:loca为嵌入水印后的子带
[m2,n2] = size(loca);
index = 1;
% 取出2*2的块
for k = 1:2:m2-1
for kk = 1:2:n2-1
tem = loca(k:k+1,kk:kk+1);
a11 = tem(1,1);
a12 = tem(1,2);
a21 = tem(2,1);
a22 = tem(2,2);
if 0 == w(index)
for s = step:step:100*step
if a12-a11<=g %如果满足条件,a12增,a22减
a12 = a12 + s;
a22 = a22 - s;
else
break; %不满足条件,跳出此循环
end
end
%-----如果a21和a22不满足条件,则也要调整------------
if a21-a22>g
a21 = a21 - s;
a22 = a22 + s;
end
tem(1,1) = a11;
tem(1,2) = a12;
tem(2,1) = a21;
tem(2,2) = a22;
loca(k:k+1,kk:kk+1) = tem;
end
if 1 == w(index)
for s = step:step:100*step
if a12-a11<-g %如果满足条件,a12减,a22增
a12 = a12 - s;
a22 = a22 + s;
else
break; %不满足条件,跳出此循环
end
end
%-----如果a21和a22不满足条件,则也要调整------------
if a21-a22>g
a21 = a21 - s;
a22 = a22 + s;
end
tem(1,1) = a11;
tem(1,2) = a12;
tem(2,1) = a21;
tem(2,2) = a22;
loca(k:k+1,kk:kk+1) = tem;
end
index = index + 1;
tem(1,1) = a11;
tem(1,2) = a12;
tem(2,1) = a21;
tem(2,2) = a22;
loca(k:k+1,kk:kk+1) = tem;
end
end
end
function loca = wm_type_1(loca,w,step,g)
% 此函数用于在HL子带嵌入水印
% 输入:loca为要嵌入水印的子带
% 输出:loca为嵌入水印后的子带
[m2,n2] = size(loca);
index = 1;
% 取出2*2的块
for k = 1:2:m2-1
for kk = 1:2:n2-1
tem = loca(k:k+1,kk:kk+1);
a11 = tem(1,1);
a12 = tem(1,2);
a21 = tem(2,1);
a22 = tem(2,2);
if 0 == w(index)
for s = step:step:100*step
if a21-a11<=g %如果满足条件,a21增,a22减
a21 = a21 + s;
a22 = a22 - s;
else
break; %不满足条件,跳出此循环
end
end
%-----如果a12和a22不满足条件,则也要调整------------
if a12-a22>g
a12 = a12 + s;
a22 = a22 - s;
end
tem(1,1) = a11;
tem(1,2) = a12;
tem(2,1) = a21;
tem(2,2) = a22;
loca(k:k+1,kk:kk+1) = tem;
end
if 1 == w(index)
for s = step:step:100*step
if a21-a11<-g %如果满足条件,a21减,a22增
a21 = a21 - s;
a22 = a22 + s;
else
break; %不满足条件,跳出此循环
end
end
%-----如果a12和a22不满足条件,则也要调整------------
if a12-a22>g
a12 = a12 + s;
a22 = a22 - s;
end
tem(1,1) = a11;
tem(1,2) = a12;
tem(2,1) = a21;
tem(2,2) = a22;
loca(k:k+1,kk:kk+1) = tem;
end
index = index + 1;
tem(1,1) = a11;
tem(1,2) = a12;
tem(2,1) = a21;
tem(2,2) = a22;
loca(k:k+1,kk:kk+1) = tem;
end
end
end
算法说明:
- 该算法首先对原始图像进行一层 Haar 小波变换,得到 LL, LH, HL, HH 四个子带。
- 计算 LH 和 HL 子带的平均系数,选择平均系数较小的子带进行水印嵌入。
- 将水印信息转换为二进制序列,逐位嵌入到选定子带的 2x2 像素块中。
- 通过修改 2x2 像素块中系数之间的关系来表示水印信息,例如,通过调整 a12-a11 和 a21-a22 的差值来嵌入 0 或 1。
- 最后,对嵌入水印后的子带进行小波逆变换,得到嵌入水印的图像。
优点:
- 算法简单易于实现。
- 嵌入的水印具有较好的不可见性。
缺点:
- 脆弱性:对图像的任何修改都可能导致水印信息的丢失。
- 水印容量有限:只能嵌入少量的水印信息。
应用场景:
- 版权保护:用于标识图像的版权信息。
- 完整性认证:用于检测图像是否被篡改。
总结
本文介绍了一种基于小波变换的脆弱水印嵌入算法,并提供了完整的 Matlab 代码实现。该算法简单易于实现,具有一定的应用价值。
原文地址: https://www.cveoy.top/t/topic/jpP3 著作权归作者所有。请勿转载和采集!