(matlab)错误使用psnr>checkimages,如何解决?

% 加载图像
img = imread('lena.bmp');
% 将图像转换为灰度图像
gray_img = rgb2gray(img);
% 显示原始图像
subplot(2,3,1);
imshow(gray_img);
title('原始图像');

% 设置水印
watermark = 'Hello World';
% 将水印转换为二进制序列
watermark_bin = dec2bin(watermark, 8);
watermark_bin = watermark_bin(:)';
% 将二进制序列转换为数字序列
watermark_num = str2num(watermark_bin);

% 进行小波变换
[cA,cH,cV,cD] = dwt2(gray_img,'haar');
% 提取水印嵌入位置
embed_pos = 1:4:length(cA(:));
% 将水印嵌入到小波系数中
cA(embed_pos) = cA(embed_pos) + watermark_num;
% 进行逆小波变换
watermarked_img = idwt2(cA,cH,cV,cD,'haar');
% 显示加水印后的图像
subplot(2,3,2);
imshow(uint8(watermarked_img));
title('加水印后的图像');

% 计算PSNR和NC值
[peaksnr, snr] = psnr(watermarked_img, gray_img);
nc_value = nc(gray_img, watermarked_img);
fprintf('PSNR值为:%f\n', peaksnr);
fprintf('NC值为:%f\n', nc_value);

% 提取水印
[cA,cH,cV,cD] = dwt2(watermarked_img,'haar');
% 从小波系数中提取嵌入位置的值
extracted_watermark_num = cA(embed_pos);
% 对提取的水印进行FFT变换
fft_extracted_watermark = fft(extracted_watermark_num);
% 对原始水印进行FFT变换
fft_watermark = fft(watermark_num);
% 计算相关性
corr = ifft(fft_extracted_watermark .* conj(fft_watermark));
% 显示相关性曲线
subplot(2,3,3);
plot(abs(corr));
title('相关性曲线');

% 添加噪声攻击
noisy_img = imnoise(watermarked_img, 'salt & pepper', 0.05);
% 显示添加噪声后的图像
subplot(2,3,4);
imshow(noisy_img);
title('添加噪声后的图像');

% 提取水印
[cA,cH,cV,cD] = dwt2(noisy_img,'haar');
% 从小波系数中提取嵌入位置的值
extracted_watermark_num = cA(embed_pos);
% 对提取的水印进行FFT变换
fft_extracted_watermark = fft(extracted_watermark_num);
% 对原始水印进行FFT变换
fft_watermark = fft(watermark_num);
% 计算相关性
corr = ifft(fft_extracted_watermark .* conj(fft_watermark));
% 显示相关性曲线
subplot(2,3,5);
plot(abs(corr));
title('添加噪声后的相关性曲线');

% 添加压缩攻击
imwrite(watermarked_img, 'watermarked_img.jpg', 'jpg', 'Quality', 50);
compressed_img = imread('watermarked_img.jpg');
% 显示压缩后的图像
subplot(2,3,6);
imshow(compressed_img);
title('压缩后的图像');

% 提取水印
[cA,cH,cV,cD] = dwt2(compressed_img,'haar');
% 从小波系数中提取嵌入位置的值
extracted_watermark_num = cA(embed_pos);
% 对提取的水印进行FFT变换
fft_extracted_watermark = fft(extracted_watermark_num);
% 对原始水印进行FFT变换
fft_watermark = fft(watermark_num);
% 计算相关性
corr = ifft(fft_extracted_watermark .* conj(fft_watermark));
%显示压缩后的相关性曲线
subplot(2,3,6);
plot(abs(corr));
title('压缩后的相关性曲线');

% 计算PSNR和NC值
psnr_value = psnr(gray_img, compressed_img);
nc_value = nc(gray_img, compressed_img);
fprintf('经过噪声和压缩攻击后的PSNR值为:%f\n', psnr_value);
fprintf('经过噪声和压缩攻击后的NC值为:%f\n', nc_value);

代码运行显示
错误使用psnr>checkimages
A和REF的类必须相同

出错psnr(第69行)
checkimages(A,ref)
有人知道要如何解决这个问题嘛?

[peaksnr, snr] = psnr(watermarked_img, gray_img);
改为:

[peaksnr, snr] = psnr(watermarked_img, uint8(gray_img));

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    解决方案:

    1. 首先确保A和REF的数据类型相同,如果不同则需要先将它们转换成相同的数据类型。比如,如果A是uint8类型,而REF是double类型,则需要将REF转换成uint8类型。可以使用Matlab中的cast函数完成这个操作,例如:
    REF = cast(REF, 'uint8');
    
    1. 使用whos命令查看A和REF的类型,确保它们是相同的。例如:
    whos A REF
    
    1. 如果A和REF的类型相同,但是出现了错误,那么可能是A和REF的大小不同,需要将它们resize到相同的大小。可以使用Matlab中的imresize函数完成这个操作,例如:
    A = imresize(A, size(REF));
    
    1. 如果A和REF的大小相同,但是出现了错误,那么可能是A和REF的数据范围不同,需要将它们的数据范围都放到[0,1]范围内。可以使用Matlab中的mat2gray函数完成这个操作,例如:
    A = mat2gray(A);
    REF = mat2gray(REF);
    
    1. 如果以上方法都不能解决问题,可以考虑使用其他的图像质量评价函数,例如SSIM、MSE等。

    Matlab版本号:需要提供

    代码中A和REF的类型以及数据类型:需要提供,如果可以的话,最好提供一下完整的代码。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^