基于HL子带的MATLAB数字水印嵌入算法
基于HL子带的MATLAB数字水印嵌入算法
概述
本篇博客介绍一种基于HL子带的数字水印嵌入算法,并提供完整的MATLAB代码实现。该算法将水印信息嵌入到图像的HL子带中,具有较好的鲁棒性和不可感知性。
算法原理
- 将原始图像进行小波变换,得到HL、LH、HH等子带。
- 将水印信息转换为二进制序列。
- 在HL子带中,选取2x2的像素块,根据水印信息修改像素值。
- 对修改后的HL子带进行逆小波变换,得到嵌入水印的图像。
MATLAB代码实现
function loca = wm_type_0(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 a11-a12<=g % 如果满足条件,a11增,a12减
a11 = a11 + s;
a12 = a12 - s;
else
break; % 不满足条件,跳出此循环
end
end
% -----如果a21和a22不满足条件,则也要调整------------
if a21-a22<=g
a21 = a21 + s;
a22 = a22 - s;
end
end
if 1 == w(index)
for s = step:step:100*step
if a11-a12>=-g % 如果满足条件,a11增,a12减
a11 = a11 - s;
a12 = a12 + s;
else
break; % 不满足条件,跳出此循环
end
end
% -----如果a21和a22不满足条件,则也要调整------------
if a21-a22>=-g
a21 = a21 - s;
a22 = a22 + s;
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: 水印信息二进制序列。step: 像素值调整步长。g: 阈值。
总结
本文介绍了一种基于HL子带的数字水印嵌入算法,并提供了详细的MATLAB代码实现。该算法能够有效地将水印信息嵌入到图像中,并具有一定的鲁棒性和不可感知性。您可以根据实际需求修改代码参数,以达到最佳的嵌入效果。
原文地址: https://www.cveoy.top/t/topic/jpQJ 著作权归作者所有。请勿转载和采集!