代码如下
originalImg = imread('lena.bmp');
watermarkImg = imread('ming.jpg');
% 灰度化处理
originalImg = rgb2gray(originalImg);
% 统一文件大小
watermarkImg = imresize(watermarkImg, size(originalImg));
% 进行小波变换,将原始图像分解为低频和高频部分
[cA, cH, cV, cD] = dwt2(originalImg, 'haar');
% 进行二维傅里叶变换,对高频部分进行频域变换
fft_cH = fft2(cH);
% 进行水印嵌入,将水印信息嵌入到高频部分中
alpha = 0.1; % 嵌入强度系数
watermark = double(watermarkImg)/255; % 归一化水印图像
wm_size = size(watermark);
for i=1:wm_size(1)
for j=1:wm_size(2)
% 对每一个像素进行嵌入,嵌入的方式可以采用加权平均或置乘
fft_cH(i,j) = (1-alpha)*fft_cH(i,j) + alpha*fft_cH(i,j)*(1+watermark(i,j));
end
end
% 进行逆二维傅里叶变换,将加入水印信息的高频部分反变换回空域
cH_wm = ifft2(fft_cH);
% 进行逆小波变换,将加入水印信息的高频部分与低频部分合并,得到最终的水印图像
watermarkedImg = idwt2(cA, cH_wm, cV, cD, 'haar');
% 进行数字水印提取
[cA, cH_wm, cV, cD] = dwt2(watermarkedImg, 'haar');
fft_cH_wm = fft2(cH_wm); % 水印图像的频域信息
wm_extracted = zeros(wm_size); % 初始化提取的水印图像
for i=1:wm_size(1)
for j=1:wm_size(2)
% 对每一个像素进行提取,提取的方式可以采用加权平均或置除
wm_extracted(i,j) = (fft_cH_wm(i,j)/fft_cH(i,j) - 1)/alpha;
end
end
% 计算PSNR值
psnr_value = psnr(watermarkImg, uint8(wm_extracted*255));
% 添加攻击测试,例如加噪声、裁剪等
watermarkedImg_noisy = imnoise(watermarkedImg, 'gaussian', 0, 0.01);
watermarkedImg_cropped = imcrop(watermarkedImg, [10 10 size(watermarkImg,2)-1 size(watermarkImg,1)-1]);
% 进行数字水印提取和PSNR计算
[cA, cH_wm_noisy, cV, cD] = dwt2(watermarkedImg_noisy, 'haar');
fft_cH_wm_noisy = fft2(cH_wm_noisy);
wm_extracted_noisy = zeros(wm_size);
for i=1:wm_size(1)
for j=1:wm_size(2)
wm_extracted_noisy(i,j) = (fft_cH_wm_noisy(i,j)/fft_cH(i,j) - 1)/alpha;
end
end
psnr_value_noisy = psnr(watermarkImg, uint8(wm_extracted_noisy*255));
[cA, cH_wm_cropped, cV, cD] = dwt2(watermarkedImg_cropped, 'haar');
fft_cH_wm_cropped = fft2(cH_wm_cropped);
wm_extracted_cropped = zeros(wm_size);
for i=1:wm_size(1)
for j=1:wm_size(2)
wm_extracted_cropped(i,j) = (fft_cH_wm_cropped(i,j)/fft_cH(i,j) - 1)/alpha;
end
end
psnr_value_cropped = psnr(watermarkImg, uint8(wm_extracted_cropped*255));
% 显示结果
figure;
subplot(2,3,1); imshow(originalImg); title('原始图像');
subplot(2,3,2); imshow(watermarkedImg_noisy); title('加入噪声后的图像');
subplot(2,3,6); imshow(uint8(wm_extracted_noisy*255)); title('提取的噪声图像');
fprintf('PSNR值:%.2f dB\n', psnr_value);
fprintf('加入噪声后的PSNR值:%.2f dB\n', psnr_value_noisy);
figure;
subplot(1,2,1); imshow(watermarkedImg_cropped); title('裁剪后的图像');
subplot(1,2,2); imshow(uint8(wm_extracted_cropped*255)); title('提取的裁剪图像');
fprintf('裁剪后的PSNR值:%.2f dB\n', psnr_value_cropped);
插入图像如下:
插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不同,二者的数学方法上是完全不同的。而面对一个实际问题,究竟应该用插值还是拟合,有时容易确定,有时则并不明显。
很抱歉,以上参考资料中并没有提到任何具体的代码和错误提示信息,也没有明确的问题需要解决。因此,无法提供具体的解决方案。建议提供更具体的问题和相关信息,以便更好地得到有针对性的解答。