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%
相关推荐
程序喵大人35 分钟前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng1 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
wdfk_prog2 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕2 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫2 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通3 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦4 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
qq_2518364575 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
野生风长5 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++