索引超出数组边界,怎么解决?

代码如下

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);

插入图像如下:

img

img


显示错误:第24行出错kaonile
fft_cH(i,j)=(1-alpha)*fft_cH(i,j)

img


要怎么解决索引超出问题(如果解答,不要复制粘贴,谢谢)。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7675210
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:计算两张图片的信噪比时,结果偏低甚至出现负值怎么办?
  • 除此之外, 这篇博客: 数学建模-插值与拟合模型中的 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不同,二者的数学方法上是完全不同的。而面对一个实际问题,究竟应该用插值还是拟合,有时容易确定,有时则并不明显。

  • 您还可以看一下 王剑老师的站长必修课:网站是怎样做出来的?课程中的 运营:才刚开始,站长更重要的工作…小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    很抱歉,以上参考资料中并没有提到任何具体的代码和错误提示信息,也没有明确的问题需要解决。因此,无法提供具体的解决方案。建议提供更具体的问题和相关信息,以便更好地得到有针对性的解答。