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%
相关推荐
rannn_1114 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer5 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
leisoo80975 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
不会代码的小猴5 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
AI备案指南-满满6 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤6 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝6 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林7 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展
陌诺曦.7 小时前
Python扩展小练习
算法