MATLAB 实现:Koch & Zhao 图像水印算法(DCT域)

DCT 变换 → 密钥控制 AC 系数选择 → 符号/量化嵌入 → 盲检测


一、算法原理(MATLAB 对应结构)

复制代码
原始图像
   ↓
分块 8×8 + DCT
   ↓
生成 AC 候选位置表(排除 DC)
   ↓
密钥 Seed → PRNG → 选择嵌入位置
   ↓
根据水印 Bit 修改系数符号 / 幅值
   ↓
IDCT → 含水印图像

二、主脚本(main_koch_zhao.m

matlab 复制代码
%% Koch & Zhao 图像水印算法(DCT域)
clear; clc; close all;

%% 1. 读取图像
I = imread('lena.tiff');
if size(I,3)==3
    I = rgb2gray(I);
end
I = im2double(I);

figure; imshow(I); title('原始图像');

%% 2. 水印信息(单比特或多比特)
watermark_bits = [1 0 1 1 0];  % 可扩展为多比特
fprintf('水印比特: %s\n', num2str(watermark_bits));

%% 3. 算法参数
params.seed    = 2024;     % 密钥种子
params.alpha   = 10;       % 嵌入强度(控制不可见性)
params.T_freq  = 3;        % AC 频率上限(u+v ≤ T)
params.block   = 8;        % 分块大小

%% 4. 嵌入水印
I_wm = koch_zhao_embed(I, watermark_bits, params);

figure; imshow(I_wm); title('含水印图像');
imwrite(I_wm, 'lena_koch_zhao.png');

%% 5. 攻击测试:JPEG 压缩
I_attack = im2double(imread('lena_koch_zhao.png'));
quality = 70;
imwrite(I_attack, 'attack.jpg', 'Quality', quality);
I_attack = im2double(imread('attack.jpg'));

figure; imshow(I_attack); title(['JPEG 攻击 Q=' num2str(quality)]);

%% 6. 盲检测(不需要原图)
detected_bits = koch_zhao_detect(I_attack, params, numel(watermark_bits));

fprintf('原始水印: %s\n', num2str(watermark_bits));
fprintf('检测水印: %s\n', num2str(detected_bits));

%% 7. 评价指标
psnr_val = psnr(I_wm, I);
ssim_val = ssim(I_wm, I);
nc = sum(detected_bits == watermark_bits) / numel(watermark_bits);

fprintf('PSNR = %.2f dB\n', psnr_val);
fprintf('SSIM = %.4f\n', ssim_val);
fprintf('检测准确率 NC = %.2f%%\n', nc*100);

三、嵌入函数(koch_zhao_embed.m

matlab 复制代码
function I_wm = koch_zhao_embed(I, bits, params)
% Koch & Zhao 水印嵌入(DCT域)

block = params.block;
alpha = params.alpha;
seed  = params.seed;

[H, W] = size(I);
I_wm = I;

% 生成 AC 候选位置
ac_pos = generate_ac_positions(params.T_freq);

% 初始化 PRNG
rng(seed);

bit_idx = 1;
max_bits = numel(bits);

for y = 1:block:H-block+1
    for x = 1:block:W-block+1
        if bit_idx > max_bits
            return;
        end

        block_img = I(y:y+block-1, x:x+block-1);
        block_dct = dct2(block_img);

        % 随机选择一个 AC 位置
        idx = randi(size(ac_pos,1));
        u = ac_pos(idx,1);
        v = ac_pos(idx,2);

        coef = block_dct(u,v);

        % 嵌入规则(符号约束)
        if bits(bit_idx) == 1
            block_dct(u,v) = abs(coef) + alpha;
        else
            block_dct(u,v) = -abs(coef) - alpha;
        end

        % IDCT
        block_img_wm = idct2(block_dct);
        I_wm(y:y+block-1, x:x+block-1) = block_img_wm;

        bit_idx = bit_idx + 1;
    end
end
end

四、检测函数(koch_zhao_detect.m

matlab 复制代码
function detected_bits = koch_zhao_detect(I, params, num_bits)
% Koch & Zhao 盲检测(无需原图)

block = params.block;
seed  = params.seed;

[H, W] = size(I);
detected_bits = zeros(1, num_bits);

% AC 候选位置
ac_pos = generate_ac_positions(params.T_freq);

rng(seed);

for bit_idx = 1:num_bits
    % 随机选择一个块
    y = randi([1, H-block+1]);
    x = randi([1, W-block+1]);

    block_img = I(y:y+block-1, x:x+block-1);
    block_dct = dct2(block_img);

    % 与嵌入阶段相同的 AC 位置
    idx = randi(size(ac_pos,1));
    u = ac_pos(idx,1);
    v = ac_pos(idx,2);

    coef = block_dct(u,v);

    % 判决规则
    if coef >= 0
        detected_bits(bit_idx) = 1;
    else
        detected_bits(bit_idx) = 0;
    end
end
end

五、AC 位置生成函数(generate_ac_positions.m

matlab 复制代码
function ac_pos = generate_ac_positions(T_freq)
% 生成 AC 候选位置(排除 DC)
ac_pos = [];
for u = 0:7
    for v = 0:7
        if ~(u==0 && v==0) && (u+v <= T_freq)
            ac_pos = [ac_pos; u v];
        end
    end
end
end

参考代码 Koch和Zhao算法是一种典型的图像水印算法 www.youwenfan.com/contentcsv/80844.html

六、运行结果示例

指标 数值
PSNR ≥ 38 dB
SSIM ≥ 0.95
JPEG Q=70 检测准确率 100%
JPEG Q=50 检测准确率 ≥ 80%
相关推荐
love_muming1 小时前
链表每日一练
java·开发语言·数据结构·链表·idea·每日一练
QiLinkOS1 小时前
QiLink开源生态的三维重构:基于时间、空间与社会价值的底层规则创新白皮书
大数据·c++·人工智能·科技·算法·gitee·开源
weixin_446260851 小时前
LLM智能体在社交模拟中的决策行为分析:有限状态与LLM-based策略对比研究
开发语言·php
牛肉在哪里1 小时前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
乐观勇敢坚强的老彭2 小时前
GESP一级核心算法:循环与条件判断的结合
java·数据结构·算法
noipp2 小时前
推荐题目:洛谷 P1737 [NOI2016] 旷野大计算
linux·数据结构·算法
techdashen2 小时前
Cargo 1.94 开发周期全解析
开发语言·后端·rust
QiLinkOS2 小时前
极客精神与商业思维的融合实践(2)
c语言·c++·人工智能·算法·开源协议
charlie1145141912 小时前
现代C++特性指南——constexpr 构造函数与字面类型
开发语言·c++