基于HL子带的数字水印嵌入算法 (MATLAB实现)
基于HL子带的数字水印嵌入算法 (MATLAB实现)
本代码实现了一种基于HL子带的数字水印嵌入算法。该算法将水印信息嵌入到图像的HL子带中,通过修改2x2像素块的系数关系来实现水印的嵌入。
函数代码
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 a12-a22<=g % 如果满足条件,a22增,a12减
a12 = a12 - s;
a22 = a22 + s;
else
break; % 不满足条件,跳出此循环
end
end
% -----如果a11和a21不满足条件,则也要调整------------
if a11-a21<=g
a11 = a11 + (a21-a11)/2;
a21 = a21 - (a21-a11)/2;
end
if a21-a11<=g
a21 = a21 + (a11-a21)/2;
a11 = a11 - (a11-a21)/2;
end
if a12-a22<=g
a12 = a12 - (a22-a12)/2;
a22 = a22 + (a22-a12)/2;
end
if a22-a12<=g
a22 = a22 - (a12-a22)/2;
a12 = a12 + (a12-a22)/2;
end
% ------------------------------------------------------
end
if 1 == w(index)
for s = step:step:100*step
if a12-a22>=-g % 如果满足条件,a22增,a12减
a12 = a12 + s;
a22 = a22 - s;
else
break; % 不满足条件,跳出此循环
end
end
% -----如果a11和a21不满足条件,则也要调整------------
if a11-a21<=g
a11 = a11 + (a21-a11)/2;
a21 = a21 - (a21-a11)/2;
end
if a21-a11<=g
a21 = a21 + (a11-a21)/2;
a11 = a11 - (a11-a21)/2;
end
if a12-a22<=g
a12 = a12 - (a22-a12)/2;
a22 = a22 + (a22-a12)/2;
end
if a22-a12<=g
a22 = a22 - (a12-a22)/2;
a12 = a12 + (a12-a22)/2;
end
% ------------------------------------------------------
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
参数说明
loca: 要嵌入水印的HL子带w: 水印信息,为0或1的向量step: 嵌入强度调节步长g: 嵌入阈值
算法说明
该算法首先将HL子带划分为2x2的像素块,然后根据水印信息对每个像素块进行修改。如果水印位为0,则调整像素块的系数关系,使得a12-a22<=g;如果水印位为1,则调整像素块的系数关系,使得a12-a22>=-g。
优点
- 隐蔽性好,嵌入水印后的图像质量损失小
- 鲁棒性强,对常见的图像处理操作(如JPEG压缩、噪声干扰等)具有较强的抵抗能力
总结
本代码提供了一种基于HL子带的数字水印嵌入算法的MATLAB实现,可供相关研究人员参考使用。
原文地址: https://www.cveoy.top/t/topic/jpQK 著作权归作者所有。请勿转载和采集!