MATLAB 水印嵌入函数:wm 和 wm_type_0 代码解析
MATLAB 水印嵌入函数:wm 和 wm_type_0 代码解析
本文将解析两个 MATLAB 函数:wm 和 wm_type_0,它们用于实现数字图像水印嵌入过程。
1. wm 函数
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 = 0;
%=======计算avr_HL======
[m1,n1] = size(HL); avr_HL = 0;
% 判断嵌入的子带
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]); % 小波逆变换,还回原始图像
参数说明:
I:原始图像。w:水印信息。g:水印嵌入阈值,用于控制嵌入强度。
函数流程:
- 对原始图像
I进行一层 Haar 小波分解,得到四个子带:LL、LH、HL、HH。 - 计算
LH和HL子带的平均值avr_LH和avr_HL,并根据它们的大小选择一个子带作为水印嵌入的目标子带。 - 调用
wm_type_0或wm_type_1函数将水印信息嵌入到目标子带中。 - 将嵌入水印后的子带替换回原分解后的子带中,并进行小波逆变换,得到最终的嵌入水印图像
J。
2. wm_type_0 函数
wm_type_0 函数是 wm 函数的子函数,它用于将水印信息嵌入到 LH 子带中。
function loca = wm_type_0(loca,w,step,g)
% 此函数为嵌入过程中的子函数,用于嵌入LH子带的水印信息
% 输入:loca为LH子带;w为水印信息;step为小波系数增长步长;g为嵌入水印的阈值
% 输出:loca为嵌入水印后的LH子带
[m,n] = size(loca);
% 水印信息二值化
w = im2bw(w,graythresh(w));
w = double(w);
w(w==0) = -1;
% 水印信息扩展
w_ext = w(:);
w_ext = repmat(w_ext,m*n,1);
% 计算小波系数
[ca,ch,cv,cd] = dwt2(loca,'haar');
% 计算小波系数的绝对值
abs_ch = abs(ch);
abs_cv = abs(cv);
abs_cd = abs(cd);
% 计算小波系数的均值
avr_ch = mean(mean(abs_ch));
avr_cv = mean(mean(abs_cv));
avr_cd = mean(mean(abs_cd));
% 计算增长系数
k_ch = step*avr_ch/max(w_ext);
k_cv = step*avr_cv/max(w_ext);
k_cd = step*avr_cd/max(w_ext);
% 计算嵌入水印后的小波系数
for i = 1:m
for j = 1:n
if w_ext((i-1)*n+j) == 1
if abs_ch(i,j) < g*avr_ch
ch(i,j) = ch(i,j) + k_ch;
end
else
if abs_ch(i,j) < g*avr_ch
ch(i,j) = ch(i,j) - k_ch;
end
end
end
end
loca = idwt2(ca,ch,cv,cd,'haar',[m,n]); % 小波逆变换,还原LH子带
参数说明:
loca:LH子带。w:水印信息。step:小波系数增长步长,用于控制嵌入强度。g:水印嵌入阈值,用于控制嵌入强度。
函数流程:
- 将水印信息
w二值化,并扩展为与LH子带相同大小的矩阵。 - 对
LH子带进行一层 Haar 小波分解,得到四个子带:ca、ch、cv、cd。 - 计算
ch、cv、cd子带的平均绝对值。 - 根据水印信息和阈值,选择性地调整
ch子带的小波系数,从而嵌入水印信息。 - 对
ca、ch、cv、cd子带进行小波逆变换,得到嵌入水印后的LH子带。
代码示例
% 原始图像
I = imread('lena.bmp');
% 水印信息
w = imread('watermark.png');
% 嵌入阈值
g = 0.5;
% 嵌入水印
J = wm(I, w, g);
% 显示嵌入水印后的图像
imshow(J);
总结
本文介绍了使用 MATLAB 实现水印嵌入的函数 wm 和 wm_type_0,详细解释了函数功能、参数设置和代码实现细节,并提供了代码示例。这两个函数实现了基于小波变换的数字水印嵌入算法,可用于保护数字图像的版权和完整性。
注意: wm_type_1 函数的实现与 wm_type_0 函数类似,只是嵌入的目标子带为 HL 子带,具体代码实现可根据 wm_type_0 函数进行修改。
原文地址: https://www.cveoy.top/t/topic/jpxM 著作权归作者所有。请勿转载和采集!