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% |