% 载入原始图像和水印图像 I = imread('C:\Users\Administrator\Desktop\lena.bmp'); W = imread('C:\Users\Administrator\Desktop\ahu.png'); % DCT变换 I_dct = dct2(I); W_dct = dct2(W); % 将水印嵌入到频域系数中 alpha = 0.1; % 嵌入强度 I_dct_wm = I_dct + alpha * W_dct; % 逆DCT变换 I_wm = uint8(idct2(I_dct_wm)); % 显示原始图像、水印图像和含水印图像 figure; subplot(1,3,1); imshow(I); title('Original Image'); subplot(1,3,2); imshow(W); title('Watermark Image'); subplot(1,3,3); imshow(I_wm); title('Watermarked Image'); % 旋转原始图像并裁剪 I_rot = imrotate(I, 30, 'crop'); I_crop = imcrop(I_rot, [50, 50, 127, 127]); % 提取水印 I_crop_dct = dct2(I_crop); W_extract = (I_crop_dct - I_dct) / alpha; % 显示裁剪后的图像和提取出的水印图像 figure; subplot(1,2,1); imshow(I_crop); title('Cropped Image'); subplot(1,2,2); imshow(uint8(W_extract)); title('Extracted Watermark');该代码中W_extract = (I_crop_dct - I_dct) / alpha;I_crop_dct和I_dct矩阵维度不同,I_crop_dct为128x128 double,I_dct为200x200 double,已知原始图像和水印图像都是200*200,请修正
时间: 2024-02-11 09:08:51 浏览: 90
根据代码,可以发现 `I_dct` 和 `I_crop_dct` 的维度不同,需要将 `I_crop` 裁剪后的矩阵扩展为与 `I` 相同的维度,然后再进行 DCT 变换。修正后的代码如下:
```
% 载入原始图像和水印图像
I = imread('C:\Users\Administrator\Desktop\lena.bmp');
W = imread('C:\Users\Administrator\Desktop\ahu.png');
% DCT变换
I_dct = dct2(I);
W_dct = dct2(W);
% 将水印嵌入到频域系数中
alpha = 0.1; % 嵌入强度
I_dct_wm = I_dct + alpha * W_dct;
% 逆DCT变换
I_wm = uint8(idct2(I_dct_wm));
% 显示原始图像、水印图像和含水印图像
figure;
subplot(1,3,1); imshow(I); title('Original Image');
subplot(1,3,2); imshow(W); title('Watermark Image');
subplot(1,3,3); imshow(I_wm); title('Watermarked Image');
% 旋转原始图像并裁剪
I_rot = imrotate(I, 30, 'crop');
I_crop = imcrop(I_rot, [50, 50, 127, 127]);
% 扩展裁剪后的矩阵维度为与原始图像相同
I_crop_ext = zeros(size(I));
I_crop_ext(50:50+size(I_crop,1)-1, 50:50+size(I_crop,2)-1) = I_crop;
% 提取水印
I_crop_dct = dct2(I_crop_ext);
W_extract = (I_crop_dct - I_dct) / alpha;
% 显示裁剪后的图像和提取出的水印图像
figure;
subplot(1,2,1); imshow(I_crop); title('Cropped Image');
subplot(1,2,2); imshow(uint8(W_extract)); title('Extracted Watermark');
```
阅读全文