图像处理PSNR及其计算(OpenCV和matlab实现)

2023-05-16

  • 图像PSNR及其计算OpenCV和matlab实现
    • PSNR的概念
    • PSNR编程实现
      • matlab实现
        • 第一种实现方法
        • 第二种直观方法
        • 第三种实现方法
      • OpenCV实现
    • 参考资料

图像PSNR及其计算(OpenCV和matlab实现)

引言:在图像处理中,要对图像进行客观的评价,常常需要计算PSNR,本文将简单介绍PSNR的定义,并给出相关的源代码。

PSNR的概念

PSNR (Peak Signal to Noise Ratio)
峰值信噪比PSNR衡量图像失真或是噪声水平的客观标准。2个图像之间PSNR值越大,则越相似。普遍基准为30dB,30dB以下的图像劣化较为明显。定义为,

PSNR=10log10MAX2MSE

这里MAX表示图像颜色的最大数值,8bit图像取值为255。我们还要介绍MSE(均方差),即m×n单色图像 IK(原图像与处理图像)之间均方误差,定义为:

MSE=1mni=1nj=1mK(i,j)I(i,j)2

PSNR编程实现

matlab实现

第一种实现方法:

  • 在matlab 2016版本中是带有psnr的计算的,只需调用相关函数就好。官方详细说明链接
peaksnr = psnr(A,ref)
%peaksnr = psnr(A,ref) calculates the peak signal-to-noise ratio for the image A, with the image ref as the reference. A and ref must be of the same size and class.

第二种直观方法

  • 在matlab中新建m文件,下面这个实现简单明了
function [PSNR, MSE]=psnr(I,K)
[M,N,D] = size(I);
Diff = double(I)-double(K);
MSE = sum(Diff(:).^2)/numel(I);
PSNR=10*log10(255^2/MSE);
end

第三种实现方法:

  • 在matlab中新建m文件,复制进去保存就可以调用了。
function PSNR(A,B)

% PURPOSE: To find the PSNR (peak signal-to-noise ratio) between two
%          intensity images A and B, each having values in the interval
%          [0,1]. The answer is in decibels (dB).
%
%          There is also a provision, in EXAMPLE 3 below, for images 
%          stored in the interval [0,255], i.e. 256 gray levels. 
%
% SYNOPSIS: PSNR(A,B)
%
% DESCRIPTION: The following is quoted from "Fractal Image Compression",
%              by Yuval Fisher et al.,(Springer Verlag, 1995),
%              section 2.4, "Pixelized Data".
%
%              "...PSNR is used to measure the difference between two
%              images. It is defined as
%
%                           PSNR = 20 * log10(b/rms)
%
%              where b is the largest possible value of the signal
%              (typically 255 or 1), and rms is the root mean square
%              difference between two images. The PSNR is given in
%              decibel units (dB), which measure the ratio of the peak 
%              signal and the difference between two images. An increase
%              of 20 dB corresponds to a ten-fold decrease in the rms
%              difference between two images.
%              
%              There are many versions of signal-to-noise ratios, but
%              the PSNR is very common in image processing, probably
%              because it gives better-sounding numbers than other
%              measures."
%
% EXAMPLE 1: load clown
%            A = ind2gray(X,map); % Convert to an intensity image in [0,1].
%            B = 0.95 * A;        % Make B close to, but different from, A.
%            PSNR(A,B)            % ---> "PSNR = +33.49 dB"
%
% EXAMPLE 2: A = rand(256); % A is a random 256 X 256 matrix in [0,1].
%            B = 0.9 * A;   % Make B close to, but different from, A.
%            PSNR(A,B)      % ---> "PSNR = +24.76 dB (approx)"
%
% EXAMPLE 3: For images with 256 gray levels: this function PSNR was 
%            originally written for matrix-values between 0 and 1,
%            because of MATLAB's preference for that interval.
%
%            However, suppose the matrix has values in [0,255]. Taking
%            Example 1 above, we could change the image to 256 gray levels.
%         
%            load clown
%            A = ind2gray(X,map); % Convert to intensity image in [0,1]
%            AA = uint8(255*A);   % Change to integers in [0,255]
%            BB = 0.95*AA;        % Make BB close to AA.
%
%            Now we must alter the code for this new case. Comment out the
%            existing program (using %) and uncomment the alternative 
%            underneath it.
%
%            PSNR(AA,BB)          % ---> "PSNR = +33.56 dB"
%
%            Note the slightly different result from Example 1, because
%            decimal values were rounded into integers.

if A == B
   error('Images are identical: PSNR has infinite value')
end

max2_A = max(max(A));
max2_B = max(max(B));
min2_A = min(min(A));
min2_B = min(min(B));

if max2_A > 1 || max2_B > 1 || min2_A < 0 || min2_B < 0
   error('input matrices must have values in the interval [0,1]')
end

error_diff = A - B;
decibels = 20*log10(1/(sqrt(mean(mean(error_diff.^2)))));
disp(sprintf('PSNR = +%5.2f dB',decibels))

% if A == B
%    error('Images are identical: PSNR has infinite value')
% end

% max2_A = max(max(A));
% max2_B = max(max(B));
% min2_A = min(min(A));
% min2_B = min(min(B));
%
% if max2_A > 255 || max2_B > 255 || min2_A < 0 || min2_B < 0
%   error('input matrices must have values in the interval [0,255]')
% end

% error_diff = A - B;
% decibels = 20*log10(255/(sqrt(mean(mean(error_diff.^2)))));
% disp(sprintf('PSNR = +%5.2f dB',decibels))

OpenCV实现

  • 使用的是opencv 2.0版本,核心程序如下,很简单的程序,详细的注释可以帮助你理解getPSNR函数:
//输入格式是Mat类型,I1,I2代表是输入的两幅图像
double getPSNR(const Mat& I1, const Mat& I2)
{
    Mat s1;
    absdiff(I1, I2, s1);       // |I1 - I2|AbsDiff函数是 OpenCV 中计算两个数组差的绝对值的函数
    s1.convertTo(s1, CV_32F);  // 这里我们使用的CV_32F来计算,因为8位无符号char是不能进行平方计算
    s1 = s1.mul(s1);           // |I1 - I2|^2

    Scalar s = sum(s1);         //对每一个通道进行加和

    double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels

    if( sse <= 1e-10) // 对于非常小的值我们将约等于0
        return 0;
    else
    {
        double  mse =sse /(double)(I1.channels() * I1.total());//计算MSE
        double psnr = 10.0*log10((255*255)/mse);
        return psnr;//返回PSNR
    }
}

可能需要添加的头文件是:

#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp>  // OpenCV window I/O

使用说明:

//先定义PSNR
double psnr;
//然后读取输入的两幅图像
Mat img1=imread('1.jpg');
Mat img2=imread('2.jpg');
//调用函数
psnr = getPSNR(img1,img2);  

参考资料

[1]http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.html
[2]http://www.mathworks.com/matlabcentral/fileexchange/135-psnr

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像处理PSNR及其计算(OpenCV和matlab实现) 的相关文章

  • MySQL5.7安装半同步插件报错,错误码1126

    MySQL5 7安装半同步插件报错 xff0c 错误码1126 mysql gt INSTALL PLUGIN rpl semi sync master SONAME 39 semisync master so 39 ERROR 1126
  • apollo ros联合编译进度及问题

    0 进度 xff1a cyber base 全是头文件 xff0c 做成INTERFACE 库 xff0c cyber base cyber common xff1a 先分开构建 xff0c 最后合成cyber common库 cyber
  • lvm热更换磁盘

    lvm热更换磁盘 由于更换存储或者磁盘等问题 xff0c 需要将lvm里面的某个磁盘替换出来回收 xff0c 采用热回收的方法 xff0c 可以在线迁移数据 xff0c 不影响业务使用 xff0c 当然会对磁盘的io造成影响 xff0c 建
  • svn常见问题,报错,命令转载

    我自己犯过的一个错误是 xff1a svn MyERP core Main svn act b8bd621b c193 4969 b66c d35f11009815 后来证实是地址的大小写问题 xff0c 我修改了大小写 xff0c 然后删
  • Hadoop2-MapReduce(2)

    新的API xff1a Mapper MyMapper extends Mapper lt gt map LongWritable key Text value Context context throws context write ne
  • Keil生成bin文件绝对路径,U盘SD卡根目录

    使用U盘或者SD卡更新固件 xff0c 手动操作bin文件很麻烦 xff0c 可以使用keil自带快捷命令 比如U盘符是F盘 fromelf exe bin output 61 F 64 L bin L 编译时候自动生成替换
  • 【数据清洗】总结

    写在前面 xff08 201908 xff09 xff1a 数据质量问题往往会影响到工作效果 xff0c 我们学习现代工具后 xff0c 很容易就建立起一个初步的模型 但是真正的工作是如何优化它 xff0c 而关键节点就包括数据的清洗和模型
  • Ubuntu安装Proxychains4

    平时在使用github的时候 xff0c 偶尔发现无法Clone仓库 xff0c 此时就需要用特别的上网的方式解决 一 安装proxychains4 sudo apt get install proxychains4 注意 国内某些软件源没
  • 关于OLSR协议中的MPR机制的阅读与理解

    主要参考Request For Comments7181 OLSRv2 及RFC文档进行理解 MPR机制简介 简介 MPR MultiPoint Relay多点中继 机制是OLSR Optimized Link State Routing最
  • open /run/flannel/subnet.env: no such file or directory

    查看pod的信息时发现报错 xff1a open run flannel subnet env no such file or directory 一是查看各个节点 xff0c 包括master 节点是否有 run flannel subn
  • maven 依赖com.google.code.kaptcha

    前言 在工程的pom xml文件里已经加了 span class hljs tag lt span class hljs title dependency span gt span span class hljs tag lt span c
  • 灰度共生矩阵GLCM及其matlab实现

    Prerequisites 概念 计算方式 对于精度要求高且纹理细密的纹理分布 我们取像素间距为 d 1 d 1 d 1 以下是方向的说明 我们来看 matlab内置工具箱中的灰度共生矩阵的生成函数graycomatrix gray lev
  • np.max 与 np.maximum

    1 参数 首先比较二者的参数部分 xff1a np max xff1a a axis 61 None out 61 None keepdims 61 False 求序列的最值最少接收一个参数axis xff1a 默认为列向 xff08 也即
  • matlab 中使用 GPU 加速运算

    为了提高大规模数据处理的能力 xff0c matlab 的 GPU 并行计算 xff0c 本质上是在 cuda 的基础上开发的 wrapper xff0c 也就是说 matlab 目前只支持 NVIDIA 的显卡 1 GPU 硬件支持 首先
  • Linux Ubuntu系统设置成中文语言

    1 打开 系统设置 xff1a 可以从右上角弹出菜单 xff0c 选择 System Settings 打开系统设置 也可以点击左侧 xff08 齿轮和扳手 xff09 快捷图标打开 2 首先选择软件更新服务器 xff0c 选择国内的 3
  • VNC 灰屏

    用vnc连接服务器的时候 xff0c 出现了灰屏 xff0c xff08 在xshell可以正常运行 xff09 上面会显示三个checkbox xff1a Accept clipboard from viewers Send clipbo
  • 从零开始学习树莓派4B与ROS历程(1)——安装ubantu系统,ROS以及配置远程SSH(一系列错误解决办法,无显示屏外设也可以安装系列)

    目录 安装ubuntu系统文件 1 使用显示器连接树莓派 2 使用SSH xshell安装 安装ROS 安装ubuntu系统文件 1 下载ubuntu系统文件Ubuntu18版 xff0c 目前最新都是21版本了 xff0c 但是树莓派处理
  • Ubuntu服务器端与客户端(RV1126)配置NFS实现文件夹共享

    这里写目录标题 1 NFS简介2 NFS实现步骤3 测试平台3 NFS安装方法1 xff09 安装 NFS 软件包2 xff09 设置 NFS 共享目录3 xff09 主机启动NFS 4 客户端配置方法1 xff09 连接客户端和服务器2
  • 由xubuntu桌面系统恢复到ubuntu桌面系统

    假定读者原来的系统为ubuntu桌面系统 xff0c 并且根据如下命令更换到xubuntu桌面系统 sudo apt get install xrdp sudo apt get install vnc4server sudo apt get
  • 设置Chrome以https方式访问指定网址

    1 打开Chrome xff0c 在地址栏键入chrome net internals xff0c 回车 2 在HSTS选项卡下的Domain中输入你想要实现这个强制跳转的域名 xff0c 如 twitter com gt https tw

随机推荐

  • winfrom自适应布局技巧

    两个技巧 控件的布局属性 Anchor技巧Dock技巧 FillLeftRightBottomTop 以上方法可能达不到想要的效果 xff0c 可以使用下面的方法 表格布局控件应用 TableLayoutPanel 对控件进行行列编辑 xf
  • x0vncserver

    vncserver By default a logged in user has a desktop provided by X Server on display 0 A user can share their desktop usi
  • k8s安装flannel组件出错

    安装完flannel组建后 xff0c 查看pod xff0c 显示Error 查看log 提示 xff1a Error registering network failed to acquire lease subnet 34 10 24
  • openjdk下载与安装

    openjdk下载与安装 官方网站和文档参考 http openjdk java net install 安装说明 http jdk java net 11 openjdk下载地址
  • DirectUI简介

    DirectUI界面库 取名自微软的一个窗口类名 DirectUIHWND xff0c 意为Paint on parent dc directly 即子窗口不以窗口句柄的形式创建 xff0c 只是逻辑上的窗口 xff0c 绘制在父窗口之上
  • 机器学习 之 Haar特征

    Haar特征 Haar特征原理综述 Haar特征是一种反映图像的灰度变化的 xff0c 像素分模块求差值的一种特征 它分为三类 xff1a 边缘特征 线性特征 中心特征和对角线特征 用黑白两种矩形框组合成特征模板 xff0c 在特征模板内用
  • Linux下将c++转换为so文件并利用python调用

    C 43 43 转so文件 这里以简单的加法为例 xff0c 代码如下 xff0c add传入两个int的参数 xff0c 完成加法 主函数main调用add xff0c return结果 这里需要注意的点在于 xff0c 不能忘记将函数添
  • Oracle的rollup、cube、grouping sets函数

    Oracle的rollup cube grouping sets函数 Oracle的group by除了基本用法以外 xff0c 还有3种扩展用法 xff0c 分别是rollup cube grouping sets 1 rollup 假设
  • 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    跳转指令分三类 一 无条件跳转 JMP 二 根据 CX ECX 寄存器的值跳转 JCXZ CX 为 0 则跳转 JECXZ ECX 为 0 则跳转 三 根据 EFLAGS 寄存器的标志位跳转 这个太多了 根据标志位跳转的指令 JE 等于则跳
  • 中标麒麟yum源的问题以及 mips64el.rpm和.noarch.rpm 不同 openjdk1.8安装

    1 一开始发现yum源地址不对 xff0c 访问不了 xff0c 进行了修改 ns7 adv os name 61 NeoKylin Linux Advanced Server 7 Os baseurl 61 http download c
  • 多任务学习(Multi-Task Learning, MTL)

    目录 显示 1 背景2 什么是多任务学习 xff1f 3 多任务学习如何发挥作用 xff1f 3 1 提高泛化能力的潜在原因3 2 多任务学习机制3 3 后向传播多任务学习如何发现任务是相关的4 多任务学习可被广泛应用 xff1f 4 1
  • Zhong__一文通透Casbin

    时间 xff1a 2021 12 06 环境 xff1a Windows 目的 xff1a Casbin简介与使用 希望对大家有帮助 说明 xff1a 以官方文档为基础来讲解与拓展详解 xff0c 并最终帮助大家在项目中使用 xff01 本
  • Linux多线程调度策略

    转自 xff1a http blog csdn net byperseverance article details 44522731 Linux线程的调度策略分为3个 xff1a SCHED OTHER xff0c SCHED FIFO
  • HDFS操作语句

    HDFS操作语句 本地交互 上传重命名 xff1a hdfs dfs put xx csv srv bigdata xxxx csv 上传 xff1a hdfs dfs put xx csv srv bigdata 强制上传 xff1a h
  • 【ubuntu】Ubuntu 各版本代号简介

    一 版本及代号说明 Ubuntu中 xff0c 每个版本都有一个更为特色的名字 xff0c 这个名字由一个形容词和一个动物名称组成 xff0c 并且 xff0c 形容词和名词的首字母都是一致的 Ubuntu版本的命名规则是根据正式版发布的年
  • 一行代码加速你的Pandas数据探索分析

    本文3分钟 xff0c 大幅提升分析数据效率 我们知道 xff0c pandas库为EDA提供了许多非常有用的功能 但是 xff0c 在能够应用大多数功能之前 xff0c 通常必须先从更通用的功能开始 xff0c 例如df describe
  • 无需虚拟机或双系统!Windows下愉快地使用Linux子系统

    文章目录 说明一 启用 适用于Linux的Windows子系统 WSL 二 启用开发人员模式三 下载linux安装包相关深入学习Ubuntu子系统的资料参考资料 本文阅读3分钟 xff0c 你将获得如下方案 xff0c 在轻量使用场景下 x
  • 解决GitHub的raw.githubusercontent.com无法连接问题

    问题描述 xff1a Ubuntu下连接raw githubusercontent com失败 wget https raw githubusercontent com madmashup targeted marketing predic
  • k2pdfopt详细教程-让kindle看遍所有pdf

    pdf拿什么拯救6寸kindle救世主登场一步一步解决图文混排扫描版pdf 书籍总结 pdf xff0c 拿什么拯救6寸kindle kindle现在已经出道paperwhite第三代了 xff08 2015年7月 xff09 xff0c
  • 图像处理PSNR及其计算(OpenCV和matlab实现)

    图像PSNR及其计算OpenCV和matlab实现 PSNR的概念PSNR编程实现 matlab实现 第一种实现方法第二种直观方法第三种实现方法 OpenCV实现 参考资料 图像PSNR及其计算 xff08 OpenCV和matlab实现