基于小波变换的数字水印嵌入:Matlab实现与优化
基于小波变换的数字水印嵌入 (Matlab实现)
本文介绍如何使用Matlab实现基于小波变换的数字水印嵌入技术。代码包含两个函数:wm为主函数,wm_type_1为子函数。
wm 函数
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 = sum(abs(LH(:))) / (m0 * n0);
%=======计算avr_HL======
[m1,n1] = size(HL); avr_HL = sum(abs(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
wm_type_1 函数
function [loca_new] = wm_type_1(loca,w,step,g)
% 此函数为嵌入水印的子函数,用于HL子带
% 输入:loca为HL子带;w为水印信息;step为小波系数增长步长;g为水印嵌入的阈值
% 输出:loca_new为嵌入水印后的HL子带
%参数设置
[m,n] = size(loca);
loca_new = loca;
k = 1; %水印信息的索引
%遍历HL子带的每个小波系数
for i = 1:m
for j = 1:n
if abs(loca(i,j)) > g %判断小波系数是否大于阈值
if w(k) == 1 %如果水印信息为1
if loca(i,j) > 0 %如果小波系数为正数
loca_new(i,j) = loca(i,j) + step; %增加小波系数
else %如果小波系数为负数
loca_new(i,j) = loca(i,j) - step; %减少小波系数
end
else %如果水印信息为0
if loca(i,j) > 0 %如果小波系数为正数
loca_new(i,j) = loca(i,j) - step; %减少小波系数
else %如果小波系数为负数
loca_new(i,j) = loca(i,j) + step; %增加小波系数
end
end
k = k + 1; %水印信息的索引加1
if k > length(w) %如果水印信息已经全部嵌入
return; %结束函数
end
end
end
end
end
代码说明:
wm函数:- 该函数首先对输入图像进行 Haar 小波分解,得到LL, LH, HL, HH 四个子带。
- 然后计算LH和HL子带的平均能量,选择能量较大的子带嵌入水印信息。
- 调用子函数
wm_type_0或wm_type_1将水印嵌入选定的子带。 - 最后进行小波逆变换,得到嵌入水印后的图像。
wm_type_1函数:- 该函数遍历选择的子带,找到大于阈值的小波系数。
- 根据水印信息的比特值(0或1)修改小波系数的大小,实现水印的嵌入。
总结
本文提供的代码清晰地展示了如何使用 Matlab 实现基于小波变换的数字水印嵌入技术。通过修改代码参数,可以方便地调整水印嵌入的强度和位置,以达到不同的应用需求。
原文地址: https://www.cveoy.top/t/topic/jpxO 著作权归作者所有。请勿转载和采集!