opencv图像处理学习(五十七)——峰值信噪比和结构相似性

article/2025/9/27 0:07:41

1.峰值信噪比

峰值信噪比是常用的衡量信号失真的指标。该参数是基于图像像素灰度值进行统计分析,但是由于人类视觉特性的差异性,通常出现的评价结果与人的主管感觉不一致,但其仍然是一个有参考价值的评价指标。对于两幅图像I与K,尺寸大小为m x n,它们的均方误差的定义为公式:

            MSE=\frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}||I(i,j)-k(i,j)||^{2}                                         

       那么信噪比的定义为公式:

            PSNR=10\cdot log_{10}(\frac{MAX_{I}^{2}}{MSE})=20.log_{10}(\frac{MAX_{I}}{MSE})           

其中,MSE表示当前图像I与K的均方误差, 表示图像点颜色的最大值。PSNE的单位为dB,在图像质量评价中,典型的峰值信噪比为30~40dB。PSNR的值越大,图像质量越好。

double PSNR(const cv::Mat& I1, const cv::Mat& I2)
{cv::Mat s1;cv::absdiff(I1, I2, s1);//计算图像差s1.convertTo(s1, CV_32F);//转成32浮点数进行平方运算//s1*s1,即|I1-I2|^2s1 = s1.mul(s1);cv::Scalar s = cv::sum(s1);//分别叠加每个通道元素,存于s中double sse = s.val[0] + s.val[1] + s.val[2];//计算所有通道元素和if (sse <= 1e-10)//当元素很小时返回0值{return 0;}else{double mse = sse / ((double)(I1.channels() * I1.total()));double psnr = 10.0*log10((255 * 255) / mse);return psnr;}
}

2.结构相似性(PSNR)

结构相似性是高度结构化的自然影像,从亮度、对比度、结构三方面评价图像质量,故邻域像素具有较强的关联性,即物体结构信息的相似性,对比峰值信噪比更复合人类视觉观察到的直观效果,其具有对称性、上下界等性质。

给定两个信号x和y。两者的结构相似性定义为公式:

\left\{\begin{matrix} SSIM=[l(x,y)]^{\alpha }\[c(x,y)]^{\beta }[s(x,y)]^{\gamma }\\l(x,y)=\frac{2\mu _{x}\mu _{u}+C_{1}}{\mu _{x}^{2}+\mu _{y}^{2}+C_{1}} \\ c(x,y)=\frac{2\sigma _{x}\sigma _{y}+C_{2}}{\sigma _{x}^{2}+\sigma _{y}^{2}+C_{2}}\\s(x,y)=\frac{\sigma _{xy}+C_{3}}{\sigma _{x}\sigma _{y}+C_{3}} \end{matrix}\right.

其中l(x,y)表示x和y的亮度,c(x,y)代表x和y的对比度,s(x,y)表示x和y的结构,\alpha ,\beta ,\gamma(都大于0)为SSIM参数调整,\mu _{x}\mu _{y}分别表示图像x和y的均值,\sigma _{x}\sigma _{y}分别表示图像x和y的方差,\sigma _{xy}表示图像x和y的协方差,C_{1},C_{2},C_{3} 为常数。SSIM的取值范围为0到1,值越大越好。

cv::Scalar MSSIM(const cv::Mat& i1, const cv::Mat& i2)
{const double C1 = 6.5025, C2 = 58.5225;cv::Mat I1, I2;i1.convertTo(I1, CV_32F);i2.convertTo(I2, CV_32F);cv::Mat I2_2 = I2.mul(I2);//I2^2cv::Mat I1_2 = I1.mul(I1);cv::Mat I1_I2 = I1.mul(I2);cv::Mat mu1, mu2;cv::GaussianBlur(I1, mu1, cv::Size(11, 11), 1.5);//高斯加权计算每一窗口的均值、方差以及协方差cv::GaussianBlur(I2, mu2, cv::Size(11, 11), 1.5);cv::Mat mu1_2 = mu1.mul(mu1);cv::Mat mu2_2 = mu2.mul(mu2);cv::Mat mu1_mu2 = mu1.mul(mu2);cv::Mat sigma1_2, sigma2_2, sigma12;cv::GaussianBlur(I1_2, sigma1_2, cv::Size(11, 11), 1.5);sigma1_2 -= mu1_2;cv::GaussianBlur(I2_2, sigma2_2, cv::Size(11, 11), 1.5);sigma2_2 -= mu2_2;cv::GaussianBlur(I1_I2, sigma12, cv::Size(11, 11), 1.5);sigma12 -= mu1_mu2;//根据公式计算相应参数cv::Mat t1, t2, t3;t1 = 2 * mu1_mu2 + C1;t2 = 2 * sigma12 + C2;//t3 = ((2*mu1_mu2+C1).*(2*sigma12+C2))t3 = t1.mul(t2);t1 = mu1_2 + mu2_2 + C1;t2 = sigma1_2 + sigma2_2 + C2;//t1 = ((mu1_2+mu2_2+C1).*(sigma1_2+sigma2_2+C2))t1 = t1.mul(t2);cv::Mat ssim_map;//ssim_map = t3  ./ t1;cv::divide(t3, t1, ssim_map);cv::Scalar mssim = mean(ssim_map);return mssim;
}

 


http://chatgpt.dhexx.cn/article/VKhYsWRO.shtml

相关文章

用户自定义函数UDF

SQL DDL&#xff1a;用户自定义函数UDF 什么是UDF&#xff1f; Hive支持的函数除了内置函数&#xff0c;允许编写用户自定义函数&#xff08;User Define Function&#xff09;来扩充函数的功能。 用户自定义函数需要使用Java语言进行编写&#xff0c;完成的UDF可以打包成Ja…

hive笔记八:自定义函数-自定义UDF函数/自定义UDTF函数

目录 自定义函数 自定义UDF函数 自定义UDTF函数 自定义函数 Hive自带一些函数&#xff0c;比如&#xff1a;max/min等&#xff1b;当Hive提供的内置函数无法满足你的业务处理需要时&#xff0c;此时就可以考虑使用用户自定义函数。 UDF&#xff1a;user-defined function …

用python实现Hive中的UDF函数

用python实现Hive中的UDF函数 简介 Hive为我们提供了众多的内置函数&#xff0c;但是在实际的运用过程中仍然不能满足我们所有的需求.hive是用java开发的&#xff0c;本身提供了使用java去开发UDF的方式.而这里我们采用python的方式去实现UDF函数. DEMO实现 我们这里用pyth…

hive创建udf函数流程

1.编写udf函数 引入pom文件 <dependencies> <dependency> <!-- 这个属于额外的jar包 自己按需引用 比如你想搞得函数 里面要连接mysql 这里肯定需要引入mysql的驱动包 我这个包是为了计算字符串的表达式的。 --> <groupId>org.apache.com…

自定义UDF、UDTF函数

自定义步骤 自定义UDF&#xff1a;继承UDF&#xff0c;重写evaluate方法自定义UDTF&#xff1a;继承GenericUDTF&#xff0c;重写3个方法&#xff1a;initialize&#xff08;自定义输出数据的列名和类型&#xff09;&#xff0c;process&#xff08;将结果返回forward(result)…

Hive-编写UDF函数(详细教程~~~)

编写UDF函数 (1)创建项目:(2)导入依赖:(3)继承UDF类(4)业务代码(5)打包编译(5)添加到hive类路径(6)创建临时函数(7)使用测试 Hive 自带了一些函数&#xff0c;比如&#xff1a;max/min 等&#xff0c;但是数量有限&#xff0c;自己可以通过自定义 UDF 来 方便的扩展。 2&#x…

关于Mysql中UDF函数的思考(一)

一点背景 从大学二年纪接触编程&#xff0c;几乎我阅读过的所有的编程语言教材都会有那么一章专门讲述数据库编程&#xff0c;而讲述的内容都无非是介绍某个数据库历史&#xff0c;对应的安装过程&#xff0c;最后才会讲解一点SQL语句&#xff0c;像这样的教材我个人认为是完全…

UDF、UDAF、UDTF之间的区别

1、UDF&#xff1a;用户定义&#xff08;普通&#xff09;函数&#xff0c;只对单行数值产生作用&#xff1b; 继承UDF类&#xff0c;添加方法 evaluate() /*** function 自定义UDF统计最小值**/public class Min extends UDF {public Double evaluate(Double a, Double b) {i…

HIVE udf、udaf、udtf函数定义与用法(最全!!!!!)

一、定义 1、hive udf、udaf、udtf函数定义与用法 &#xff08;1&#xff09;UDF&#xff08;user-defined function&#xff09;作用于单个数据行&#xff0c;产生一个数据行作为输出。&#xff08;数学函数&#xff0c;字符串函数&#xff09; &#xff08;2&#xff09;U…

udf,udaf,udtf之间的区别

1、UDF&#xff1a;用户定义&#xff08;普通&#xff09;函数&#xff0c;只对单行数值产生作用&#xff1b; 继承UDF类&#xff0c;添加方法 evaluate() /*** function 自定义UDF统计最小值* author John**/public class Min extends UDF {public Double evaluate(Double a…

如何编写udf函数(收藏篇)

hive自带了一些函数&#xff0c;比如&#xff1a;max、min 等&#xff0c;但是自带的函数数量有限&#xff0c;所以hive提供给用户自定义函数的功能。 udf 函数可以直接应用于select 语句&#xff0c;对查询结构做格式化处理之后&#xff0c;然后再输出内容。 下面将详细介绍下…

自定义UDF函数

自定义函数案例&#xff1a; 文章目录 自定义UDF函数1.需求2.前期maven工程准备3.编程实现4.导包5.导入hive中 自定义UDTF函数1.需求2.编程实现3.导入hive中 自定义UDF函数 1.需求 自定义一个UDF实现计算给定字符串的长度例如 2.前期maven工程准备 创建一个maven工程&#x…

Hive自定义UDF函数详解

Hive自定义UDF函数详解 一、UDF概述二、UDF种类三、如何自定义UDF四、自定义实现UDF和UDTF4.1 需求4.2 项目pom文件4.3 Hive建表测试及数据4.4 UDF函数编写4.5 UDTF函数编写4.6 UDTF使用 一、UDF概述 UDF全称&#xff1a;User-Defined Functions&#xff0c;即用户自定义函数&…

Hive UDF简单函数

概念 在Hive中&#xff0c;用户可以自定义一些函数&#xff0c;用于扩展HiveQL的功能&#xff0c;而这类函数叫做UDF&#xff08;用户自定义函数)。UDF分为两大类&#xff1a;UDAF&#xff08;用户自定义聚合函数&#xff09;和UDTF&#xff08;用户自定义表生成函数)。  UDF…

大数据Hive篇--UDF函数

什么是UDF: 它是User defined Function的简写&#xff0c;意思是用户自定义方法 为什么要用UDF&#xff1f; hive自带了一些函数&#xff0c;比如&#xff1a;max、min 等&#xff0c;但是自带的函数数量有限&#xff0c;所以hive提供给用户自定义函数的功能。 udf 函数可以…

《C#入门详解》刘铁猛——Lesson20-21事件

其实事件一般就是在界面程序中应用&#xff0c;所以这里讲的不如WPF这种的实用。

《C#入门详解》刘铁猛——Lesson1-2 IDE、各种应用程序

编程学习路径&#xff1a;语言——类库——框架 参考资料&#xff1a;离线MSDN文档&#xff0c;C#语言定义文档&#xff0c;推荐书籍—C# in a nutshell&#xff1b;其中&#xff0c;C#语言定义文档知识点会串的比较多&#xff0c;不建议详读。 使用MSDN&#xff1a;光标选中…

《C#入门详解》刘铁猛——Lesson8-9 方法的定义、调用与调试

方法命名&#xff1a;使用动词或者动词短语&#xff1b;使用PASCAL规则&#xff0c;即所有单词首字母大写。 静态类型的方法不是实例的方法&#xff0c;是类的方法&#xff0c;因此&#xff0c;实例不能调用静态方法&#xff0c;只能用类调用静态方法&#xff0c;示例程序如下&…

《C#入门详解》刘铁猛——Lesson17字段、属性、索引器、常量

属性代码示例&#xff1a; 以上代码演示了字段由get-set方法对演化成为属性的过程。 prop连敲两下Tab键&#xff0c;是属性声明的快捷键。 强调以下&#xff1a; 很少使用索引器。 声明和使用常量&#xff1a;