最爱947 2023-04-18 13:59 采纳率: 75%
浏览 427
已结题

(matlab)psnr显示负数,要怎么修改?

代码如下

clc;
clear;
% 加载图像
img = imread('lin.bmp');
% 将图像转换为灰度图像
gray_img = rgb2gray(img);
%将图像类型转换为double类型
gray_img=im2double(gray_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);

fprintf('PSNR值为:%f\n', peaksnr);


% 提取水印
[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

有跳出结果,但psnr为负数,要怎么解决。

img

展开全部

  • 写回答

3条回答 默认 最新

  • 关注

    PSNR显示负数的原因是因为峰值信噪比(PSNR)公式是基于原始图像和处理后的图像之间的差异。如果处理后的图像比原始图像的值高,则差异将为负,导致PSNR值为负。解决此问题的一种方法是确保处理后的图像具有与原始图像相同的值范围。您可以尝试将处理后的图像的像素值归一化为0到1之间的值。

    
    
    clc;
    clear;
    
    % 加载图像
    img = imread('lin.bmp');
    
    % 将图像转换为灰度图像
    gray_img = rgb2gray(img);
    
    %将图像类型转换为double类型
    gray_img=im2double(gray_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(watermarked_img,[]);
    title('加水印后的图像');
    
    % 计算PSNR和NC值
    [peaksnr, snr] = psnr(watermarked_img, gray_img);
    
    fprintf('PSNR值为:%f\n', peaksnr);
    
    % 提取水印
    [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,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('压缩后的相关性曲线');
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 4月27日
  • 已采纳回答 4月20日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 RHEL8.10安装文件
  • ¥25 实时时钟,测温,模拟量采集,超声波测距,四种在数码管上的显示通过独立按键S4依次切换
  • ¥50 Linq更新数据导致数据库崩溃
  • ¥15 使用vue3+springboot+elementplus开发web小项目,用easyexcel导出后台查询到的数据。postman测试下载测试成功但是浏览器不能触发下载
  • ¥15 关于#r语言#的问题:单细胞数据处理
  • ¥15 我主页资源的代码要如何导入JAVAEE里面使其可以运行
  • ¥20 如何在linux centos7中,搭建DVWA?
  • ¥20 更改手机应用的音频输入/推荐其他方案
  • ¥15 数据库 'LibraryManage' 已存在。请选择其他数据库名称。
  • ¥20 windows毛玻璃窗口缩放延时问题