matlab实现原始载体图像为灰度图像,水印为黑白二值小图像,写出嵌入水印和提取水印步骤,编程实现算法。同屏显示原始图像、含水印图像和嵌入的水印,计算含水印图像的 PSNR;同屏显示原始水印和提取的水印图像,计算提取水印的 NC 和 BER。
时间: 2023-12-12 17:04:12 浏览: 76
Watermarking:使用二值图像对图像进行水印。-matlab开发
实现原始载体图像为灰度图像:
```matlab
% 读取原始图像
I = imread('original_image.jpg');
% 转为灰度图像
I_gray = rgb2gray(I);
```
嵌入水印步骤:
1. 将水印图像二值化
```matlab
% 读取水印图像
wm = imread('watermark_image.jpg');
% 二值化水印图像
wm_bw = imbinarize(wm);
```
2. 将水印图像缩小到与载体图像相同的大小
```matlab
% 将水印图像缩小
wm_bw = imresize(wm_bw, size(I_gray));
```
3. 对载体图像进行离散余弦变换(DCT)
```matlab
% 进行离散余弦变换
I_dct = dct2(I_gray);
```
4. 对DCT系数进行水印嵌入
```matlab
% 将水印嵌入DCT系数
alpha = 0.1; % 水印嵌入强度
I_dct_wm = I_dct + alpha * wm_bw;
```
5. 对嵌入水印的DCT系数进行反变换(IDCT)
```matlab
% 进行反离散余弦变换
I_wm = idct2(I_dct_wm);
```
6. 计算含水印图像的PSNR
```matlab
% 计算PSNR
psnr_val = psnr(I_gray, I_wm);
fprintf('含水印图像的PSNR为:%f\n', psnr_val);
% 显示原始图像、含水印图像和嵌入的水印
figure;
subplot(1, 3, 1);
imshow(I_gray);
title('原始图像');
subplot(1, 3, 2);
imshow(I_wm);
title('含水印图像');
subplot(1, 3, 3);
imshow(wm_bw);
title('嵌入的水印');
```
提取水印步骤:
1. 对含水印图像进行离散余弦变换(DCT)
```matlab
% 对含水印图像进行离散余弦变换
I_wm_dct = dct2(I_wm);
```
2. 对含水印图像的DCT系数进行水印提取
```matlab
% 对DCT系数进行水印提取
I_wm_bw = (I_wm_dct - I_dct) >= alpha;
```
3. 计算提取水印的NC和BER
```matlab
% 计算NC和BER
nc_val = nc(wm_bw, I_wm_bw);
ber_val = ber(wm_bw, I_wm_bw);
fprintf('提取水印的NC为:%f\n', nc_val);
fprintf('提取水印的BER为:%f\n', ber_val);
% 显示原始水印和提取的水印图像
figure;
subplot(1, 2, 1);
imshow(wm_bw);
title('原始水印');
subplot(1, 2, 2);
imshow(I_wm_bw);
title('提取的水印');
```
完整代码如下:
```matlab
% 读取原始图像
I = imread('original_image.jpg');
% 转为灰度图像
I_gray = rgb2gray(I);
% 读取水印图像
wm = imread('watermark_image.jpg');
% 二值化水印图像
wm_bw = imbinarize(wm);
% 将水印图像缩小
wm_bw = imresize(wm_bw, size(I_gray));
% 进行离散余弦变换
I_dct = dct2(I_gray);
% 将水印嵌入DCT系数
alpha = 0.1; % 水印嵌入强度
I_dct_wm = I_dct + alpha * wm_bw;
% 进行反离散余弦变换
I_wm = idct2(I_dct_wm);
% 计算PSNR
psnr_val = psnr(I_gray, I_wm);
fprintf('含水印图像的PSNR为:%f\n', psnr_val);
% 显示原始图像、含水印图像和嵌入的水印
figure;
subplot(1, 3, 1);
imshow(I_gray);
title('原始图像');
subplot(1, 3, 2);
imshow(I_wm);
title('含水印图像');
subplot(1, 3, 3);
imshow(wm_bw);
title('嵌入的水印');
% 对含水印图像进行离散余弦变换
I_wm_dct = dct2(I_wm);
% 对DCT系数进行水印提取
I_wm_bw = (I_wm_dct - I_dct) >= alpha;
% 计算NC和BER
nc_val = nc(wm_bw, I_wm_bw);
ber_val = ber(wm_bw, I_wm_bw);
fprintf('提取水印的NC为:%f\n', nc_val);
fprintf('提取水印的BER为:%f\n', ber_val);
% 显示原始水印和提取的水印图像
figure;
subplot(1, 2, 1);
imshow(wm_bw);
title('原始水印');
subplot(1, 2, 2);
imshow(I_wm_bw);
title('提取的水印');
```
阅读全文