基于离散小波变换(DWT)的脆弱水印嵌入和提取算法(MATLAB实现)
基于离散小波变换(DWT)的脆弱水印嵌入和提取算法(MATLAB实现)
1. 概述
本篇介绍一种基于离散小波变换(DWT)的脆弱水印算法,该算法利用DWT将水印信息嵌入到图像的特定频率子带中,并通过计算小波系数的统计特征来实现水印的提取和图像的篡改检测。
2. 水印嵌入算法
function J = wm_embed(I, w)
% 此函数为水印嵌入过程
% 输入:I为原始图像;w为水印信息
% 输出:J为嵌入水印的图像
%%
% 一层小波分解
[LL,LH,HL,HH] = dwt2(I,'haar');
%=======计算avr_LH======
[m,n] = size(LH);
avr_LH = sum(LH(:))/(m*n);
%=======计算avr_HL======
[m0,n0] = size(HL);
avr_HL = sum(HL(:))/(m0*n0);
% 嵌入水印
if avr_LH <= avr_HL
LH = wm_embed_type1(LH, w); % 写出嵌入子函数
J = idwt2(LL,LH,HL,HH,'haar');
else
HL = wm_embed_type0(HL, w); % 写出嵌入子函数
J = idwt2(LL,LH,HL,HH,'haar');
end
end
3. 水印提取算法
function rw = wm_extr(J)
% 此函数为提取过程
% 输入:J为水印嵌入的图像;
% 输出:rw为提取的水印
%%
% 一层小波分解
[LL,LH,HL,HH] = dwt2(J,'haar');
%=======计算avr_LH======
[m,n] = size(LH);
avr_LH = sum(LH(:))/(m*n);
%=======计算avr_HL======
[m0,n0] = size(HL);
avr_HL = sum(HL(:))/(m0*n0);
% 判断嵌入的子带
if avr_LH <= avr_HL
num = 0;
loca = LH;
else
num = 1;
loca = HL;
end
%%
% 提取水印
if num == 0
rw = wm_extr_type1(loca); % 写出提取子函数
else
rw = wm_extr_type0(loca); % 写出提取子函数
end
end
4. 算法说明
- wm_embed函数:
- 首先对输入图像进行一层Haar小波分解,得到LL, LH, HL, HH四个子带。
- 分别计算LH和HL子带的平均值
avr_LH和avr_HL。 - 根据
avr_LH和avr_HL的大小关系,选择将水印嵌入到LH或HL子带中。 - 调用
wm_embed_type1或wm_embed_type0函数完成水印嵌入。 - 最后进行小波逆变换得到嵌入水印后的图像。
- wm_extr函数:
- 与嵌入过程类似,首先对嵌入水印的图像进行一层Haar小波分解。
- 计算LH和HL子带的平均值,并根据其大小关系判断水印嵌入的子带。
- 调用
wm_extr_type1或wm_extr_type0函数从对应子带中提取水印信息。
注意:
wm_embed_type1、wm_embed_type0、wm_extr_type1和wm_extr_type0函数需要根据具体的嵌入和提取方法进行定义。- 该代码示例仅提供了一个算法框架,具体的实现细节需要根据实际需求进行调整。
5. 总结
本文介绍了一种基于DWT的脆弱水印算法,并提供了MATLAB代码示例。该算法实现简单,具有一定的鲁棒性,可应用于图像版权保护、完整性认证等领域。
原文地址: https://www.cveoy.top/t/topic/jpPN 著作权归作者所有。请勿转载和采集!