图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

图像相似度主要是对两幅图像内容的相似程度进行打分,根据分数的高低来判断图像的内容的相似程度。图像的相似度在目标检测跟踪、图像内容搜索、特征分析领域有着广泛的应用。常见的图像相似度比较指标有:峰值信噪比PSNR与结构相似性SSIM。

1.峰值信噪比PSNR(Peak Signal to Noise Ratio)

PSNR可简单地由均方差MSE进行定义。PSNR基于图像像素灰度值进行统计分析。由于人类视觉特性的差异性,通常出现的评价结果与人的主要感觉不一致,但其仍然是一个有参考价值的评价指标。

2.结构相似性SSIM(tructural similarity index)

SSIM是一种衡量两幅图像相似程度的结构相似性指标,相对PSNR而言,结构相似性在评价图像质量上更能符合人类的视觉特性。结构相似于基于的原理是自然影像是高度结构化的,领域像素具有较强的关联性。SSIM分别从亮度、对比度、结构三方面度量图像的相似。

这两个指标的计算代码如下:

代码中用到的图像的下载链接:PSNR-SSIM_免费高速下载|百度网盘-分享无限制

//OpenCV版本opencv2.4.13
//图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
//图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;// PSNR 峰值信噪比计算 返回数值为30-50dB 值越大越好
double PSNR( const Mat& I1, const Mat& I2 )//注意,两幅图的大小要一致
{cv::Mat s1;// 计算图像差|I1 - I2|absdiff(I1, I2, s1);       // 转成32浮点数进行平方s1.convertTo(s1, CV_32F);  // s1*s1,即|I1 - I2|^2s1 = s1.mul(s1);           // 分别叠加每个通道的元素,存于s中cv::Scalar s = sum(s1);        // 计算所有通道元素和double sse = s.val[0] + s.val[1] + s.val[2]; // 当元素很小时返回0值if( sse <= 1e-10) return 0;else{// 根据公式计算当前I1与I2的均方误差double mse  = sse /(double)(I1.channels() * I1.total());// 计算峰值信噪比double psnr = 10.0*log10((255*255)/mse);return psnr;}
}// MSSIM 结构相似性计算 0到1 值越大越好
//返回值为三个元素构成的向量,分别表示亮度、对比度、结构的相似性。
cv::Scalar MSSIM( const Mat& i1, const Mat& i2) //注意,两幅图的大小要一致
{const double C1 = 6.5025, C2 = 58.5225; cv::Mat I1, I2;// 转换成32浮点数进行平方操作i1.convertTo(I1, CV_32F);          i2.convertTo(I2, CV_32F);// I2^2cv::Mat I2_2   = I2.mul(I2); cv::Mat I1_2   = I1.mul(I1);       cv::Mat I1_I2  = I1.mul(I2); cv::Mat mu1, mu2;  // 高斯加权计算每一窗口的均值、方差以及协方差GaussianBlur(I1, mu1, Size(11, 11), 1.5);GaussianBlur(I2, mu2, Size(11, 11), 1.5);Mat mu1_2   =   mu1.mul(mu1);Mat mu2_2   =   mu2.mul(mu2);Mat mu1_mu2 =   mu1.mul(mu2);Mat sigma1_2, sigma2_2, sigma12;// 高斯平滑,具体原理见4.4节GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);sigma1_2 -= mu1_2;GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);sigma2_2 -= mu2_2;GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);sigma12 -= mu1_mu2;// 根据计算公式相应参数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);               Mat ssim_map;// ssim_map =  t3./t1;divide(t3, t1, ssim_map); // 将平均值作为两图像的结构相似性度量    cv::Scalar mssim = mean( ssim_map ); return mssim;
}int main ()
{  // 读取源图像及待匹配图像  cv::Mat srcImage1 =   cv::imread("hand1.jpg", 1);   if (srcImage1.empty())   return -1;  cv::Mat srcImage2 =   cv::imread("hand3.jpg", 1);  if (srcImage2.empty())   return -1;  cv::Mat srcImage3 =   cv::imread("circle.jpg", 1);  if (srcImage3.empty())   return -1;  cv::imshow("hand1", srcImage1); cv::imshow("hand3", srcImage2);cv::imshow("circle", srcImage3);double psnr_01=0;psnr_01=PSNR(srcImage1,srcImage2);//注意,两幅图的大小要一致std::cout <<"hand1 VS hand3 PSNR is: " << psnr_01<< std::endl; double psnr_02=0;psnr_02=PSNR(srcImage1,srcImage3);//注意,两幅图的大小要一致std::cout <<"hand1 VS circle PSNR is: " << psnr_02<< std::endl; cv::Scalar mssim_01;mssim_01=MSSIM(srcImage1,srcImage2);//注意,两幅图的大小要一致std::cout <<"hand1 VS hand3 MSSIM is: " << mssim_01<< std::endl; cv::Scalar mssim_02;mssim_02=MSSIM(srcImage1,srcImage3);//注意,两幅图的大小要一致std::cout <<"hand1 VS circle MSSIM is: " << mssim_02<< std::endl; cv::waitKey(0);  return 0;
}  

运行结果如下图所示:

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

两幅相同大小图像的相似程度的两个评价指标-PSNR和SSIM相关推荐

  1. 【图像相关】图像质量评价指标 PSNR 和 SSIM

    文章目录 PSNR SSIM 参考链接 PSNR PSNR 是 "Peak Signal to Noise Ratio" 的缩写,即峰值信噪比,是一种评价图像的客观标准,它具有局限 ...

  2. c语言怎么比较两个字母大小,C语言strcmp()函数:比较两个字符串的大小

    函数名:  strcmp 头文件: 函数原型:  int strcmp(const char *str1,const char *str2); 功 能:   比较两个字符串的大小,区分大小写 参 数: ...

  3. 图像评价指标——PSNR、SSIM、FID、KID

    概念 PSNR PSNR 叫 峰值信噪比,与均方误差MSE 和最大像素值MAX有关. SSIM SSIM 是结构相似性,比较亮度.对比度和结构三个指标. FID fid是一个非常常用的评估图像生成质量 ...

  4. VB如何快带比较两幅位图

    虽然VB可以使用Point函数或API函数GetPiexl获得像素颜色,但速度较慢,同时,CSDN论坛里有几个朋友提出了图像比较的问题,为此,写了以下代码,希望能给有此需要的朋友一些启发: Optio ...

  5. maltab-图像拼接(左右两幅图)

    maltab-图像拼接(左右两幅图) 图像拼接 参考自 https://blog.csdn.net/m0_37565736/article/details/79865990 并修改了其中错误的地方,添 ...

  6. Origin——绘制两幅图一起显示,并切换排版方式

    文章目录 1.导入数据 2.垂直绘制两幅图 3.将垂直放置的两幅图变为水平放置 <======================================================== ...

  7. 比较两个日期大小和获取当前月最大天数的存储过程

    下面简单介绍sqlserver2008两个常用的存储过程1.比较两个日期大小的存储过程2.获取当前月份的最大天数的存储过程1.创建比较两个日期大小的存储过程1)创建比较两个日期大小的存储过程/*** ...

  8. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  9. 比较两幅图像的相似度

    现在以图搜图的功能比较火热,很好奇其原理. 简单的搜索学习得知,实现相似图片搜索的关键技术是"感知哈希算法",作用是对每一张图片按照某种规律生成一个对应的指纹字符串.比较不同图片之 ...

最新文章

  1. Blender从头到尾创建一辆宝马轿车视频教程
  2. Style Intelligence 10特点之用户自定义报表
  3. d3h 技嘉b365m 黑苹果_黑苹果macOS10.15.4单硬盘三系统安装教程
  4. 操作系统(四) | 经典进程的同步问题(生产者--消费者问题、哲学家进餐问题、读者--写者问题)
  5. 鸿蒙系统暗黑2,暗黑破坏神2为什么被称为神作!看看装备强化系统就知道有多完美...
  6. mysql sql归类_带有归类SQL强制转换SQL Server归类介绍
  7. 调试安装php源码,Xdebug的安装与配置,帮助调试PHP程序
  8. iOS WKWebView和JS交互的两种方式
  9. 304.二维区域和检索-矩阵不可变
  10. 视频播放插件 Video.js
  11. 【HTML+CSS+JS】模仿QQ登录界面
  12. dsolve函数的功能_为什么Mathematica的DSolve函数会解不出显式解??
  13. 小试牛刀__GAN实战项目之mnist数据集(二)
  14. java身份证实名认证-身份证二要素实名认证-身份证实名校验-身份证一致性实名认证
  15. 最新电脑cpu性能排行服务器,服务器cpu性能如何 服务器cpu性能排行榜介绍【详解】...
  16. L1-005 考试座位号 (15 分)
  17. 【最新损失函数SIOU全文翻译】超越YOLO-V5等先进模型提高了+3.6%
  18. java毕业论文云笔记_《毕业设计指导的系统设计与实现》论文笔记(八)
  19. 机器人教育与编程教育的区别到底是什么?
  20. 【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)

热门文章

  1. python编程实例视屏-使用Python实现视频下载功能实例代码
  2. python写web难受-(2017)你最不建议使用的Python Web框架?
  3. python入门指南pdf-跟老齐学Python+从入门到精通 PDF 下载
  4. python写入文件-Python写入文件(write和writelines)详解
  5. 为什么说python是世界上最好的语言-python是世界上最好的语言
  6. python类装饰器详解-Python装饰器基础概念与用法详解
  7. 流程的python-学习《流畅的python》第一天
  8. python有道翻译-Python爬去有道翻译
  9. python打开一个文件-python,一读取文件open()
  10. python输出数据到excel-python实现数据导出到excel的示例