当前位置: 首页 > news >正文

图像匹配质量评估:SSIM 相似度检测方法原理与应用

一、SSIM 结构相似性

SSIM算法主要用于检测两张相同尺寸的图像的相似度、或者检测图像的失真程序。该指标首先是由德州大学奥斯丁分校的图像和视频工程实验室提出。而如果两幅图像是压缩前和压缩后的图像,那么SSIM图像就可以用来评估压缩后的图像质量。

SSIM评价将两幅图的相似性比较拆成了三个维度:亮度(luminance)、对比度(contrast)、结构(structure)。最终的相似度为这三个函数的乘积。

该相似度的设计遵循三个原则

  1. 对称性:即
  2. 有界性:即
  3. 极限值唯一:即,当且仅当X=Y

给定两个图像X和Y,两张图像的结构相似度可按照以下方式求出

式中是X的平均值,是Y的平均值,是X的方差,是Y的方差,是X和Y的协方差。是用来避免分母为0 而维持稳定的常数。L是像素值的动态范围,一般为255。

当设定时,可将SSIM相似度的公式改写为更为简单的形式:

结构相似度的范围为-1到1。当两张图像一摸一样时,SSIM的值等于1。


二、函数及其说明

Scalar getSSIM(Mat cImg1, Mat cImg2) { Mat i1 = cImg1; Mat i2 = cImg2; const double C1 = 6.5025, C2 = 58.5225; // (0.01 * 255)^2 ; (0.03 * 255)^2 Mat cImgExt1, cImgExt2; cImg1.convertTo(cImgExt1, CV_32F); cImg2.convertTo(cImgExt2, CV_32F); Mat cImgGaus1, cImgGaus2; GaussianBlur(cImgExt1, cImgGaus1, Size(11, 11), 1.5); //以高斯代替均值 GaussianBlur(cImgExt2, cImgGaus2, Size(11, 11), 1.5); Mat cL; Mat cImgGaus1_2 = cImgGaus1.mul(cImgGaus2); Mat cImgGaus1_1 = cImgGaus1.mul(cImgGaus1); Mat cImgGaus2_2 = cImgGaus2.mul(cImgGaus2); divide(2 * cImgGaus1_2 + C1, cImgGaus1_1 + cImgGaus2_2 + C1,cL); //亮度 Mat cCS; Mat cImgDelt1 = cImgExt1 - cImgGaus1; Mat cImgDelt2 = cImgExt2 - cImgGaus2; Mat cImgDelt1_2 = cImgDelt1.mul(cImgDelt2); Mat cImgDelt1_1 = cImgDelt1.mul(cImgDelt1); Mat cImgDelt2_2 = cImgDelt2.mul(cImgDelt2); divide(2 * cImgDelt1_2 + C2, cImgDelt1_1 + cImgDelt2_2 + C2, cCS); //对比度与结构 Mat cSSIMRsl = cL.mul(cCS); return mean(cSSIMRsl); }

在SSIM(结构相似性)算法中经常会使用‌高斯模糊(GaussianBlur‌代替‌均值模糊(均值滤波)‌,主要出于以下原因:

  • 高斯加权更符合人眼视觉特性
    人眼对图像中心区域的敏感度高于边缘区域。高斯滤波对中心像素赋予更高权重,能更好地模拟人类视觉系统对局部结构的感知方式,而均值滤波对邻域内所有像素等权处理,忽略了这种空间重要性差异。
  • 避免边缘模糊失真
    均值滤波在图像边缘或细节处容易造成过度平滑,破坏结构信息;高斯滤波则在保留主要结构的同时平滑噪声,更有利于准确计算亮度、对比度和结构三要素。
  • 数学建模更合理
    SSIM公式中需计算局部窗口内的均值、方差和协方差。高斯加权能提供更平滑、连续的统计估计,减少因窗口边界突变带来的计算波动,提升SSIM值的稳定性与准确性。

简言之:‌高斯Blur比均值Blur更贴合人眼感知模型,能更精确地反映图像的结构相似性‌,因此被SSIM算法优先采用。

三、应用限制

结构相似性指标有其限制,对于影像出现位移、缩放、旋转(皆属于非结构性的失真)的情况无法有效的运作。当图片出现平移、旋转或是缩放时,结构相似度指标会改变得十分剧烈,并很容易将两张类似的图片视为不相似的。原因与在计算SSIM时所使用的局部性视窗有关,平移、旋转或是缩放都会导致视窗内的像素结构完全改变,使SSIM无法正确估计相似度。

四、补充说明

1、 convertTo(cImgExt1, CV_32F)

convertTo函数只改变数据类型,不改变通道数。

2、GaussianBlur(cImgExt1, cImgGaus1, Size(11, 11), 1.5);

是 OpenCV 中常用的图像模糊函数之一。它使用高斯滤波器对图像进行平滑处理。高斯模糊通过给不同的像素赋予不同的权重来平滑图像,常用于减少图像中的噪声和细节,同时比均值模糊更好地保留图像的边缘。
其函数原型:

void cv::GaussianBlur( InputArray src, // 输入图像 OutputArray dst, // 输出图像 Size ksize, // 滤波器的核大小 (宽度和高度) double sigmaX, // X方向的高斯核标准差 double sigmaY = 0, // Y方向的高斯核标准差,默认为0 int borderType = BORDER_DEFAULT // 边界类型 );

3、cImgGaus1.mul(cImgGaus2):Opencv中对于矩阵乘法有三种

  1. A*B:即常规理解的矩阵乘法

  1. A.mul(B):即常规立即的矩阵点乘

  1. A.dot(B):在点乘的基础上做一个累加

4、divide(2 * cImgGaus1_2 + C1, cImgGaus1_1 + cImgGaus2_2 + C1,cL)

cv::divide() 是 OpenCV 中用于执行数组或标量的逐元素除法操作的函数。它允许对矩阵进行元素级的除法操作,支持两种使用方式:矩阵与矩阵之间的除法,或矩阵与标量之间的除法。其函数原型如下:

void cv::divide( InputArray src1, //分子 InputArray src2, //分母 OutputArray dst, //输出 double scale=1, //可选的缩放因子。 int dtype=-1); //可选的输出矩阵类型

5、方差:用于衡量一组数据的离散程度。在统计描述中,方差用来计算每一个变量(观察值)与总体均数之间的差异。

6、标准差:是离均差平方的算术平均数(方差)的算术平方根。标准差也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据。标准差越小说明数据越集中。

7、协方差:用来刻画两个随机变量 X,Y 之间的相关性。如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。

如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。

协方差的公式如下:

方差就是协方差的一种特殊形式,当两个变量相同时,协方差就是方差了。

http://www.jsqmd.com/news/1075076/

相关文章:

  • 三步完成FanControl中文界面配置:打造你的个性化散热管理中心
  • ROS Kinetic + TurtleBot 2 实战部署:Ubuntu 16.04.6 兼容性修复与 SLAM 环境构建
  • 预计token费用将再会降低30%
  • PCIe 基础与配置空间详解
  • 3步快速掌握知网文献批量下载:学术研究效率提升的终极方案
  • 【数据分析】自动驾驶车辆控制的优化前馈补偿器的数据驱动方法matlab代码
  • NewTab Redirect! 终极指南:5步轻松定制你的Chrome新标签页
  • ubuntu24.04服务器更换国内安装源
  • Kazumi 视频进度条预览:深度解析 Flutter 播放器智能缩略图架构设计
  • iOS自动化测试进阶:tidevice与Appium协同的5个高效场景
  • VMware蓝屏故障排查黄金七步法(附PowerShell自动解码脚本):仅限内部团队使用的ESXi+Workstation双平台应急指南
  • Sarvam印度AI:低资源多语种语音-文本联合建模实践
  • TEE-OS学习轨迹第二十篇:阅读OP-TEE线程库
  • BilldDesk:跨平台远程桌面控制软件的技术深度解析与实践指南
  • 如何用RDP Wrapper解决Windows多用户远程桌面限制?家庭共享与企业协作的免费神器
  • 【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无
  • 终极Stardew Valley模组体验:用Pathoschild模组集合重新定义你的农场生活
  • GSMA把今年MWC上海的关键词放在了“价值创造”上
  • 字节面试结束后,我反问:“你说你们做agent,你了解claude agent工作原理吗?”,面试官:“你面我,还是我面你!”
  • 【优化选址】基于NSGAII求解考虑成本、救援时间和可靠性的海上救援选址多目标问题附matlab代码
  • 小白逆袭:收藏这份AI上手指南,玩转大模型变大神!
  • 合成数据驱动的政治预测:从建模逻辑到SHAP可解释性实战
  • 深度解析:如何通过VMware Unlocker在普通PC上运行macOS虚拟机
  • DataGemma:小语言模型驱动的事实核查新范式
  • 【控制】基于反步法的无人机四旋翼滑模控制附matlab代码
  • 06. MoE Router代码笔记
  • 多维聚合实战:从数据立方体到OLAP工程落地
  • TVA在物流分拣领域的独特价值(9)
  • CVE-2012-1823漏洞复现:PHP-CGI参数注入原理与防御实践
  • 90% 新手部署 OpenClaw 踩的坑,看完直接一次装好【含安装包】