用MATLAB通过频域对原始图像img.png添加数字水印(加密)watermark.png,提取水印,同时测试涂抹攻击、裁剪攻击对水印提取的影响。基本代码框架为FFT_watermarking_to_student.m。
时间: 2024-10-22 18:14:26 浏览: 32
在MATLAB中,我们可以使用快速傅里叶变换(Fast Fourier Transform, FFT)来进行频域操作,如添加和提取数字水印。以下是一个基本的代码框架,用于在`img.png`图像上添加从`watermark.png`读取的水印,并考虑了涂抹攻击和裁剪攻击对水印提取的影响:
```matlab
% 加载原始图像和水印图像
img = imread('img.png');
watermark = imread('watermark.png');
% 将图片转换为灰度并调整大小
gray_img = rgb2gray(img);
watermark = imresize(watermark, [size(gray_img,1)/2 size(gray_img,2)/2]); % 假设 watermark 比 img 小
% 对水印做离散余弦变换 (DCT) 或者其他频率压缩处理,这里仅作示例
watermark_dct = dct2(watermark);
% 添加水印到频域的图像
watermarked_freq = fft2(gray_img);
watermarked_freq = watermarked_freq .* watermark_dct; % 直接将水印乘到频域
% 回到空间域,再应用反离散余弦变换 (IDCT)
recovered_watermark = idct2(log(1 + abs(watermarked_freq)));
% 涂抹攻击(随机像素替换)
attack_strength = 0.1; % 攻击强度
attacked_img = gray_img;
attack_pixels = rand(size(attacked_img)) < attack_strength; % 随机选择像素
attacked_img(attack_pixels) = randi([0 255], sum(attack_pixels), 1); % 替换像素值
% 裁剪攻击(去除部分图像)
crop_percentage = 0.2; % 裁剪比例
cropped_img = attacked_img(1+round(crop_percentage*height(attacked_img)):end, 1+round(crop_percentage*width(attacked_img)):end);
% 提取水印,尝试在涂抹和裁剪后的图像上
extracted_watermark_from_attacked = extractWatermarkFromImage(cropped_img); % 假设存在名为 extractWatermarkFromImage 的函数
% 打印结果
figure, subplot(2,2,1), imshow(img);
subplot(2,2,2), imshow(recovered_watermark);
subplot(2,2,3), imshow(attacked_img);
subplot(2,2,4), imshow(extracted_watermark_from_attacked);
阅读全文