深入理解一种简单的数字水印嵌入与提取方法 --- 空间域水印嵌入方法:最低有效位(LSB)替换法


我选择一种简单的空间域水印嵌入方法:最低有效位(LSB)替换法。这种方法将水印信息嵌入到载体图像像素值的最低有效位中,因为最低有效位的改变对人眼视觉影响最小。

基本思想:

嵌入过程:将载体图像的每个像素的最低1位(或几位)替换为水印信息的比特。
提取过程:从含水印图像中直接读取每个像素的最低1位(或几位),组合起来得到水印信息。
注意:水印信息可以是二值图像,我们需要将二值图像转换成一维的比特流。

优点:简单,嵌入容量大(如果使用多个最低位,容量更大,但隐藏性会下降)。
缺点:抗攻击能力弱,例如对图像进行压缩、滤波、噪声等操作容易破坏水印。

# 步骤:

## 嵌入过程:

读取载体图像(假设为灰度图像,如果是彩色图像,可以只嵌入一个通道或者分别嵌入)。
读取水印图像(二值图像),将其转换为一维比特流。
确定载体图像中用于嵌入水印的像素位置(可以顺序嵌入,也可以使用伪随机序列选择位置以提高安全性)。
将载体图像中选定像素的最低1位替换为水印比特。
## 提取过程:

读取含水印图像。
根据嵌入时选定的像素位置(需要知道嵌入的位置和长度),提取这些像素的最低1位。
将提取的比特流重新组合成水印图像。
为了提高安全性,我们可以引入密钥来控制嵌入位置(使用伪随机序列)。但为了简单,我们先实现顺序嵌入。

我们使用1个最低位(LSB1)来嵌入水印。

注意:嵌入水印后,载体图像像素值的变化范围在±1(因为只改变最低位)。因此,视觉上变化很小。

# 实现:

载体图像:lena.jpg(512x512)
水印图像:一个32x32的二值图像(共1024个比特)

# 步骤:

将水印图像二值化,然后展平成一维比特序列。
在载体图像中,我们选择前1024个像素(按行扫描)来嵌入水印。注意:载体图像有512*512=262144个像素,所以我们只需要前1024个像素。
将载体图像中这1024个像素的最低1位替换为水印比特。
提取时,我们只需要从含水印图像的前1024个像素中取出最低位,然后重新组合成32x32的二值图像。

代码实现:

首先,我们读取载体图像和水印图像。
然后,我们进行嵌入操作。
接着,我们进行提取操作,并计算提取出的水印图像与原始水印图像的差异。

注意:由于我们只修改了最低位,所以嵌入水印后的图像和原图像的PSNR应该很高(大约在48dB左右)。

我们也可以尝试使用多个最低位(如2位)来嵌入,这样容量更大,但图像质量会下降。

下面我们用MATLAB代码实现LSB1的嵌入和提取。

深入理解数字水印嵌入与提取:LSB(最低有效位)算法

核心原理

LSB算法是一种空间域水印技术,利用人类视觉系统(HVS)对图像最低位不敏感的特性:

  1. 嵌入原理:将水印信息替换载体图像像素值的最低有效位
  2. 提取原理:从含水印图像中直接读取像素的最低有效位
  3. 关键特性
    • 高隐藏性(人眼不可见)
    • 大容量(可嵌入大量数据)
    • 低计算复杂度
    • 抗常规攻击能力较弱
MATLAB实现代码

链接: 下载

关键代码解析
  1. 水印嵌入过程
% 清除最低位 (LSB置0)
watermarked_img(x,y) = bitset(watermarked_img(x,y), 1, 0);

% 嵌入水印位
watermarked_img(x,y) = bitset(watermarked_img(x,y), 1, watermark_bin(i,j));
  • bitset()函数操作像素位的二进制表示
  • 第一个参数:目标像素值
  • 第二个参数:要操作的位位置(1表示最低位)
  • 第三个参数:设置的值(0或1)
  1. 水印提取过程
% 提取最低有效位
extracted_watermark(i,j) = bitget(watermarked_img(x,y), 1);
  • bitget()函数获取指定位置的比特值
  • 参数1:像素值
  • 参数2:位位置(1表示最低位)
  1. 质量评估指标
  • PSNR(峰值信噪比):衡量含水印图像与原始图像的视觉相似度

    PSNR > 40dB 表示人眼难以察觉差异

  • NC(归一化相关系数):衡量提取水印与原始水印的相似度

    NC = 1 表示完全一致

算法特性分析
特性LSB算法表现说明
隐藏性★★★★★ (优秀)人眼无法察觉变化(PSNR>48dB)
容量★★★★★ (极大)最多可嵌入12.5%的图像数据
复杂度★★★★★ (极低)O(n)时间复杂度
抗JPEG压缩★☆☆☆☆ (差)压缩后NC通常<0.6
抗噪声★★☆☆☆ (弱)高斯噪声使NC降至0.7左右
抗滤波★☆☆☆☆ (差)中值滤波会完全破坏水印
算法改进方向
  1. 增强鲁棒性
% 改进方案:使用多位嵌入+纠错编码
for bitpos = 1:3  % 使用低3位
    watermarked_img(x,y) = bitset(watermarked_img(x,y), bitpos, watermark_bits(bit_index));
    bit_index = bit_index + 1;
end
  1. 增加安全性
% 改进方案:混沌加密嵌入位置
rng(123); % 设置随机种子
permutation = randperm(cover_h * cover_w);
embed_pos = permutation(1:numel(watermark_bin));
  1. 自适应嵌入
% 改进方案:根据纹理复杂度调整嵌入强度
edge_map = edge(cover_img, 'canny');
embed_strength = 1 + double(edge_map); % 边缘区域嵌入2位
执行结果说明
  1. 视觉效果

    • 含水印图像与原始图像视觉差异不可辨
    • PSNR值通常>48dB(高质量嵌入)
  2. 水印提取

    • 无攻击时NC≈1.0(完美提取)
    • 攻击后提取效果:
      • JPEG压缩(50%质量):NC≈0.4-0.6
      • 高斯噪声(σ=0.01):NC≈0.7-0.8
      • 中值滤波(3×3):NC≈0.3-0.5
  3. 攻击测试

    • 证明LSB算法对常规处理操作脆弱
    • 展示数字水印鲁棒性的评估方法

此实现展示了数字水印技术的核心概念,体现了隐藏性和鲁棒性的平衡关系。实际应用中需要根据具体需求选择更复杂的算法(如DCT、DWT域水印)来增强抗攻击能力。

结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

gui:

MATLAB 数字水印系统 - 传统GUI实现

提供一个使用传统MATLAB GUI编程(GUIDE风格)的数字水印系统实现,它不依赖App Designer,可以直接在MATLAB脚本中运行。

链接: 下载

function watermark_gui
    % 创建主窗口
    fig = figure('Name', '数字水印系统', ...

使用说明

如何运行

  1. 将上述代码复制到MATLAB编辑器中
  2. 保存为 watermark_gui.m 文件
  3. 在MATLAB命令窗口中输入 watermark_gui 运行程序

功能说明

1. 水印嵌入选项卡
  • 选择载体图像:选择要嵌入水印的原始图像
  • 选择水印图像:选择要嵌入的水印(自动调整为32x32二值图像)
  • 嵌入水印:执行LSB水印嵌入算法
  • 保存结果:保存含水印的图像
2. 水印提取选项卡
  • 加载含水印图像:加载已嵌入水印的图像
  • 提取水印:从图像中提取水印信息
  • 保存提取结果:保存提取出的水印图像
3. 抗攻击测试选项卡
  • 加载含水印图像:加载要测试的图像
  • 选择攻击类型
    • 高斯噪声
    • 椒盐噪声
    • JPEG压缩
    • 中值滤波
    • 高斯滤波
    • 旋转攻击
    • 缩放攻击
    • 裁剪攻击
  • 应用攻击:对图像应用选定的攻击
  • 提取水印:从攻击后的图像中提取水印
  • 评估指标:显示PSNR(图像质量)和NC(水印相似度)指标
4. 关于选项卡
  • 显示系统信息和功能说明

技术特点

  1. 纯MATLAB脚本实现

    • 不依赖App Designer
    • 使用传统GUI编程方法
    • 兼容所有MATLAB版本(R2014b及以上)
  2. 完整的数字水印功能

    • LSB水印嵌入算法
    • 水印提取功能
    • 多种攻击模拟
    • 评估指标计算(PSNR和NC)
  3. 用户友好界面

    • 选项卡式界面设计
    • 图像预览功能
    • 状态提示和错误处理
    • 直观的操作流程
  4. 图像处理能力

    • 支持多种图像格式(JPG、PNG、BMP等)
    • 自动图像转换(RGB转灰度)
    • 水印图像自动二值化和调整大小

注意事项

  1. 载体图像建议使用512x512或更大尺寸的灰度图像
  2. 水印图像会自动转换为32x32二值图像
  3. LSB算法对攻击敏感,攻击后的提取效果可能不佳
  4. 保存提取的水印时建议使用PNG格式以保留二值信息

这个传统GUI实现提供了与App Designer版本相同的功能,但避免了App Designer可能遇到的问题,可以直接在MATLAB脚本中运行。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HH予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值