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

(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月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上