原始载体图像为灰度图像,水印为黑白二值小图像,写出嵌入水印和提取水印步骤, 编程实现算法。同屏显示原始图像、含水印图像和嵌入的水印,计算含水印图像的 PSNR; 同屏显示原始水印和提取的水印图像,计算提取水印的 NC 和 BER。matlab实现
时间: 2023-12-12 16:03:34 浏览: 248
matlab_实现基于压缩感知的数字图像水印算法_水印嵌入_水印提取
5星 · 资源好评率100%
嵌入水印的步骤:
1. 读取原始图像和水印图像,并将水印图像二值化。
2. 对原始图像进行离散余弦变换(DCT)。
3. 将水印图像嵌入到原始图像的低频系数中,可以根据需要选择嵌入的系数数量。
4. 对嵌入水印后的DCT系数进行反变换,得到含水印的图像。
5. 计算含水印图像的PSNR。
提取水印的步骤:
1. 读取含水印图像。
2. 对含水印图像进行DCT变换。
3. 提取DCT系数中的水印信息。
4. 将提取的水印信息还原成水印图像。
5. 计算提取水印的NC和BER。
以下是matlab实现代码:
嵌入水印:
```matlab
% 读取原始图像和水印图像
ori_img = imread('original_image.jpg');
watermark_img = imread('watermark_image.bmp');
% 将水印图像二值化
watermark_img = im2bw(watermark_img);
% 进行DCT变换
dct_img = dct2(double(ori_img));
% 嵌入水印
watermark_size = size(watermark_img, 1) * size(watermark_img, 2);
dct_watermark = reshape(double(watermark_img), watermark_size, 1);
dct_coeff = reshape(dct_img, size(dct_img, 1) * size(dct_img, 2), 1);
alpha = 0.1; % 嵌入强度
num_coeff = 1000; % 嵌入系数数量
idx = randperm(length(dct_coeff));
embed_idx = idx(1:num_coeff);
dct_coeff(embed_idx) = dct_coeff(embed_idx) + alpha * dct_watermark;
dct_img(embed_idx) = dct_coeff(embed_idx);
watermark_img_dct = idct2(dct_img);
% 显示原始图像、含水印图像和嵌入的水印
figure;
subplot(1, 3, 1); imshow(ori_img); title('Original Image');
subplot(1, 3, 2); imshow(uint8(watermark_img_dct)); title('Watermarked Image');
subplot(1, 3, 3); imshow(watermark_img); title('Watermark Image');
% 计算含水印图像的PSNR
psnr_val = psnr(uint8(watermark_img_dct), ori_img);
fprintf('PSNR value of watermarked image is %f\n', psnr_val);
```
提取水印:
```matlab
% 读取含水印图像
watermark_img_dct = imread('watermarked_image.jpg');
% 进行DCT变换
dct_img = dct2(double(watermark_img_dct));
% 提取水印
dct_coeff = reshape(dct_img, size(dct_img, 1) * size(dct_img, 2), 1);
idx = randperm(length(dct_coeff));
extract_idx = idx(1:num_coeff);
extracted_watermark = (dct_coeff(extract_idx) - reshape(dct_img, size(dct_img, 1) * size(dct_img, 2), 1)(extract_idx)) / alpha;
extracted_watermark = (extracted_watermark > 0.5);
% 将提取的水印信息还原成水印图像
extracted_watermark = reshape(extracted_watermark, size(watermark_img, 1), size(watermark_img, 2));
% 显示原始水印和提取的水印图像
figure;
subplot(1, 2, 1); imshow(watermark_img); title('Original Watermark');
subplot(1, 2, 2); imshow(extracted_watermark); title('Extracted Watermark');
% 计算提取水印的NC和BER
nc_val = nc(watermark_img, extracted_watermark);
fprintf('NC value of extracted watermark is %f\n', nc_val);
ber_val = ber(watermark_img, extracted_watermark);
fprintf('BER value of extracted watermark is %f\n', ber_val);
```
注:`nc`和`ber`是自定义函数,分别用于计算归一化相关系数(NC)和误比特率(BER)。
阅读全文