原始载体图像为灰度图像,水印为完成转换的黑白二值小图像,编程实现嵌入水印和提取水印, 同屏显示原始图像、含水印图像和嵌入的水印,计算含水印图像的 PSNR; 同屏显示原始水印和提取的水印图像,计算提取水印的 NC 和 BER。matlab实现
时间: 2023-12-12 20:03:34 浏览: 82
matlab_利用DWT的图像数字水印的嵌入与提取,里面包含水印图像、原图像
5星 · 资源好评率100%
以下是Matlab实现的示例代码,其中包括嵌入水印和提取水印的过程,以及计算PSNR、NC和BER的过程:
```matlab
% 读取原始载体图像和水印图像
carrier = imread('carrier.jpg');
watermark = imread('watermark.bmp');
% 将水印图像转换为黑白二值图像
watermark = im2bw(watermark);
% 嵌入水印
alpha = 0.1; % 嵌入强度系数
dct_carrier = dct2(carrier); % 对载体图像进行DCT变换
dct_watermark = dct2(watermark); % 对水印图像进行DCT变换
embed_idx = 1:100; % 指定嵌入位置
dct_carrier(embed_idx) = dct_carrier(embed_idx) + alpha * dct_watermark; % 嵌入水印
watermarked = idct2(dct_carrier); % 对含水印的DCT系数进行IDCT变换
% 计算PSNR
psnr_val = psnr(carrier, watermarked);
% 显示原始图像、含水印图像和嵌入的水印
figure;
subplot(1,3,1); imshow(carrier); title('原始载体图像');
subplot(1,3,2); imshow(watermarked); title('含水印图像');
subplot(1,3,3); imshow(watermark); title('嵌入的水印');
% 提取水印
extracted = zeros(size(watermark));
dct_watermarked = dct2(watermarked); % 对含水印的图像进行DCT变换
dct_watermark_extract = dct_watermarked(embed_idx); % 提取嵌入的水印DCT系数
threshold = 0; % 设定阈值
extracted(dct_watermark_extract > threshold) = 1; % 根据阈值将DCT系数转换为二值水印图像
% 计算NC和BER
nc_val = nc(watermark, extracted);
ber_val = ber(watermark, extracted);
% 显示原始水印和提取的水印
figure;
subplot(1,2,1); imshow(watermark); title('原始水印');
subplot(1,2,2); imshow(extracted); title('提取的水印');
```
需要注意的是,此代码仅作为示例,具体实现需要根据实际情况进行调整和改进。
阅读全文