opencv_contrib quality 模块全解析:MSE / PSNR / SSIM / GMSD / BRISQUE 图像质量评估实战指南
计算机视觉图像处理机器学习【免费下载链接】opencv_contrib项目地址https://gitcode.com/gh_mirrors/ope/opencv_contrib点击查看免费下载本篇技术指南围绕 opencv_contrib 仓库中的quality模块modules/quality/README.md展开系统讲解其提供的五种图像质量分析IQA, Image Quality Analysis算法——全参考Full-Reference的 MSE、PSNR、SSIM、GMSD以及无参考No-Reference的 BRISQUE。你将掌握每种算法的适用场景、C 与 Python 双语言的静态compute与实例化create两种调用方式、输出结果与质量图quality map的解读方法并结合模块源码理解底层实现原理与性能优化建议从而能够直接在自己的图像处理管线中落地质量评估能力。模块定位与算法总览quality模块位于 modules/quality是 OpenCV contrib 中专门负责图像质量分析IQA的组件。它实现了五类算法覆盖了有无参考图像两大阵营全参考 IQA需要一张参考/原始图像与之对比计算失真程度MSE均方误差Mean Squared Error逐像素误差的平方均值数值越小代表两图越接近PSNR峰值信噪比Peak Signal-to-Noise Ratio基于 MSE 的对数形式以分贝dB为单位数值越大质量越好SSIM结构相似性Structural Similarity结合亮度、对比度与结构三方面衡量感知相似度0最差~ 1最好GMSD梯度幅度相似性偏差Gradient Magnitude Similarity Deviation基于梯度幅度相似性的统计偏差0最差~ 1最好。模块文档指出在全参考 IQA 场景下GMSD 通常能取得最好的结果。无参考 IQA不需要参考图像直接对单张待评图像打分BRISQUE盲/无参考空间域图像质量评价Blind/Referenceless Image Spatial Quality Evaluation基于自然场景统计Natural Scene Statistics特征与训练好的 SVM 模型给出 0最好~ 100最坏的分数。这些算法对应的原始文献收录在 modules/quality/doc/quality.bib包括 BRISQUE 论文Mittal 等《No-Reference Image Quality Assessment in the Spatial Domain》、TID2008 数据库Ponomarenko 等以及 LIVE Image Quality Assessment Database Release 2Sheikh 等便于读者追溯算法出处。接口设计静态 compute 与实例化 create 双模式模块文档明确了统一的访问方式所有算法既可以通过更简单的静态compute方法直接调用也可以通过静态create方法创建实例后再调用实例方法。两者的取舍在文档中说明得很清楚静态compute一步到位适合一次性比较实例方法在一个参考图像 vs 多个待比较图像的场景下性能更好因为构造实例时已完成对参考图像的算法专属预处理如 SSIM 的模糊、GMSD 的梯度图计算后续每次compute无需重复这部分工作。从源码看所有算法的统一抽象由基类 qualitybase.hpp 提供class CV_EXPORTS_W QualityBase : public virtual Algorithm公开的compute(InputArray img)为纯虚方法返回cv::Scalar每个元素对应一个通道的质量分数getQualityMap(OutputArray dst)用于取回计算过程中生成的质量图若算法支持内部存储在_qualityMap中其矩阵类型默认为_mat_type cv::UMatclear()与empty()重写了Algorithm的对应接口empty()直接返回_qualityMap是否为空。也就是说输入统一使用InputArray可接收cv::Mat或cv::UMat输出统一为cv::Scalar逐通道值 可选的质量图这是整个模块一致的契约。C 快速上手全参考算法MSE / PSNR / SSIM / GMSD以 MSE 为例代码见 qualitymse.hpp#include opencv2/quality.hpp cv::Mat img1, img2; /* 待比较的两张图像 */ cv::Mat quality_map; /* 输出质量图可选 */ /* 方式一静态方法一步计算 */ cv::Scalar result_static quality::QualityMSE::compute(img1, img2, quality_map); /* 若不关心质量图第三个参数可传 cv::noArray() */ /* 方式二先 create 实例再调用实例方法 */ cv::Ptrquality::QualityBase ptr quality::QualityMSE::create(img1); cv::Scalar result ptr-compute(img2); /* 比较 img1 vs img2 */ ptr-getQualityMap(quality_map); /* 可选取出质量图 */其余全参考算法的调用模式完全一致仅类名不同QualityPSNR、QualitySSIM、QualityGMSD头文件分别见 qualitypsnr.hpp、qualityssim.hpp、qualitygmsd.hpp。结果解读要点来自各算法头文件注释QualityMSE::compute返回逐通道 MSE0最佳~ 潜在的最大 float最差QualityPSNR::compute返回逐通道 PSNRdB若两图像 MSE 恰好为 0则返回std::numeric_limitsdouble::infinity()PSNR 计算所用最大像素值可通过create(ref, maxPixelValue)指定默认MAX_PIXEL_VALUE_DEFAULT 255.适用于 uint8 图像实例运行期间还可用getMaxPixelValue()/setMaxPixelValue()读取与修改QualitySSIM::compute返回逐通道 SSIM0最差~ 1最好QualityGMSD::compute返回逐通道 GMSD0最差~ 1最好。无参考算法BRISQUEBRISQUE 不需要参考图像但需要已训练好的模型文件与范围range文件模块在 samples 目录下直接提供了基于 LIVE-R2 数据库训练的成品见下文BRISQUE 模型与配套工具一节#include opencv2/quality.hpp cv::Mat img cv::imread(/path/to/my_image.bmp); /* 待评估图像 */ cv::String model_path path/to/brisque_model_live.yml; /* 训练好的模型路径 */ cv::String range_path path/to/brisque_range_live.yml; /* range 文件路径 */ /* 方式一静态方法 */ cv::Scalar result_static quality::QualityBRISQUE::compute(img, model_path, range_path); /* 方式二实例方法 */ cv::Ptrquality::QualityBase ptr quality::QualityBRISQUE::create(model_path, range_path); cv::Scalar result ptr-compute(img);结果解读QualityBRISQUE::compute返回cv::Scalar分数位于第一个元素取值范围 0最佳质量~ 100最差质量。除了create(model_file_path, range_file_path)之外qualitybrisque.hpp 还提供了接受已加载cv::Ptrcv::ml::SVM与 rangecv::Mat的重载方便在内存中复用模型另有静态方法computeFeatures(InputArray img, OutputArray features)可单独输出 BRISQUE 提取的图像特征行向量供二次训练或分析使用。Python 快速上手模块对所有类均使用CV_WRAP导出Python 侧可直接通过cv2.quality访问命名规则为类名_方法名。全参考算法MSE / PSNR / SSIM / GMSDimport cv2 # 读取图像 img1 cv2.imread(img1, 1) # 指定 img1 路径 img2 cv2.imread(img2_path, 1) # 指定 img2_path 路径 # 静态方法返回分数与质量图 result_static, quality_map cv2.quality.QualityMSE_compute(img1, img2) # 实例方法 obj cv2.quality.QualityMSE_create(img1) result obj.compute(img2) quality_map obj.getQualityMap()其余算法QualityPSNR、QualitySSIM、QualityGMSD的 Python 调用方式同理仅替换类名。无参考算法BRISQUEimport cv2 img cv2.imread(img_path, 1) # 指定 img_path # 静态方法返回质量分数 score cv2.quality.QualityBRISQUE_compute(img, model_path, range_path) # 指定 model_path 与 range_path # 实例方法 obj cv2.quality.QualityBRISQUE_create(model_path, range_path) score obj.compute(img)输入规范与性能建议模块文档给出两条重要使用建议强烈建议非强制在输入前将图像转为灰度图。原因有二一是 SSIM 与 GMSD 的原始论文均在灰度 uint8 图像上验证二是灰度输入可显著减少逐通道重复计算的开销。若用户确实需要本实现也支持对多通道图像逐通道计算——返回的cv::Scalar中每个元素即对应一个通道的分数。输入可为cv::Mat或cv::UMat支持单通道或多通道。若某个算法不支持多通道输入应当在文档与代码中明确说明并给出相应断言assert。就当前模块而言五个算法均按通道独立计算。另外模块文档明确 BRISQUE 属于NR-IQANo-Reference算法评估时不需要参考图像其图像输入放在compute方法中而全参考算法在构造时完成参考图像的预处理。源码级实现剖析QualityBase 的统一抽象QualityBasequalitybase.hpp内部以_mat_type cv::UMat存储质量图_qualityMap实例compute方法会在计算结束时将结果写入_qualityMap静态compute则通过OutputArray参数如cv::noArray()表示不需要把质量图返回给调用方。这意味着质量图的内部载体是 UMat可与 OpenCL 等后端协同。MSE最朴素的逐像素误差实现位于 qualitymse.cppcv::subtract(lhs, rhs, diff)求差cv::multiply对差值自乘求平方注释说明比cv::pow(diff, 2., diff)略快最后cv::mean得到逐通道均值。create时通过quality_utils::expand_matmse_mat_type将参考图展开为内部 UMat 类型。PSNRMSE 的对数封装QualityPSNRqualitypsnr.hpp内部持有一个PtrQualityMSEcompute先委托 MSE 计算再经_mse_to_psnr换算10 * log10(max_pixel_value^2 / mse)当 MSE 为 0 时返回正无穷。这解释了头文件中PSNR 与 MSE 结果完全对应的设计——PSNR 本质是 MSE 的 dB 化呈现。SSIM高斯模糊 局部统计实现位于 qualityssim.cpp预处理对图像做cv::GaussianBlur(mat, result, cv::Size(11, 11), 1.5)并预存I、I_2、mu、mu_2、sigma_2五个量原始图像、图像平方、均值、均值平方、方差这些在构造时一次性算好正是一参考对多比较场景高效的原因单帧计算使用经典常数C1 6.5025、C2 58.5225按标准 SSIM 公式逐像素生成质量图t3 / t1最后cv::mean汇总为逐通道分数。源码注释表明其算法基准是 OpenCV 2.4 的 PSNR/SSIM 视频教程实现。GMSD下采样 Prewitt 梯度 标准差实现位于 qualitygmsd.cpp流程与原始论文一致cv::blur2x2 平均核 cv::resize0.5 倍最近邻下采样代码中保留了对一个 UMat 就地 resize 旧 bug 的 workaround 注释用prewitt_y、prewitt_x两个 3x3 Prewitt 核做卷积合成梯度幅度图sqrt(gx^2 gy^2)并预存梯度幅度平方图单帧计算质量图(2*gm1*gm2 T) / (gm1^2 gm2^2 T)其中T 170.最后用cv::meanStdDev求质量图的标准差作为 GMSD 分数——这正是Gradient MagnitudeSimilarity Deviation中Deviation偏差一词的来源以逐像素 GMS 相似图的标准差作为整体失真度量。值得注意的实现细节模块代码在filter_2D中针对OpenCL UMat CV_32F 组合下cv::Filter2D存在精度损失的问题做了先转 CV_64F 滤波、再转回的规避处理这正是 READMETo Do中提到的已知待查问题详见下文。BRISQUE自然场景统计 SVM 回归实现位于 qualitybrisque.hpp核心组成提取自然场景统计特征文档注释指向 Mittal 等的原始论文与原始实现得到特征行向量用cv::Ptrcv::ml::SVM回归模型 range 数据特征归一化所需的最小/最大值范围完成打分。头文件注释给出了模块自带模型的量化证据预训练模型基于 LIVE-R2 数据库训练与原始实现一致在 TID2008 数据库上评估时 SROCC 为 -0.8424原始实现为 -0.8354。computeFeatures静态方法可供提取特征用于自训模型。BRISQUE 模型与配套工具模块在 modules/quality/samples 目录下随仓库提供了一整套可直接使用的 BRISQUE 资源brisque_model_live.yml基于 LIVE-R2 数据库训练好的 SVM 模型文件即 README 示例中model_path应指向的目标brisque_range_live.yml特征归一化 range 文件即range_path应指向的目标brisque_trainer_livedb.cppBRISQUE 训练器LIVE-R2 版。从 brisque_trainer_livedb.cpp 源码可见其按原始实现的 5 类失真#define CATEGORIES 5组织 982 张训练图像#define IMAGENUM 982沿用 UT Austin LIVE 实验室原始发布代码的许可条款brisque_eval_tid2008.cpp在 TID2008 数据库上评估 BRISQUE 指标的评价器实现了序数排名含并列分数的 fractional rank与 SROCC 计算用于复现与原始实现 SROCC 对比的结论。这两份样例正好呼应了QualityBRISQUE头文件注释中关于训练器与 TID2008 评估器 C 代码随模块提供的说明读者可用其复现模型训练与指标评估全流程。测试覆盖与质量保障模块为每个算法都编写了独立测试位于 modules/quality/testtest_mse.cpp、test_psnr.cpp、test_ssim.cpp、test_gmsd.cpp、test_brisque.cpp分别覆盖对应算法test_main.cpp为测试入口。按照 README 的Library Design要求测试需同时覆盖静态compute与实例方法、单通道与多通道图像、OpenCL 开启与关闭等组合这为模块在异构后端下的行为一致性提供了保障。库设计规范新增算法的实现约定README 的Library Design一节为本模块后续扩展定义了硬性规范任何新增 IQA 算法都必须满足继承QualityBase正确实现/重写实例方法compute、empty、clear并同时提供静态compute通过InputArray接受一个cv::Mat或cv::UMat支持单通道或多通道若算法不支持多通道须在文档中说明并加入相应断言返回逐通道数值的cv::Scalar静态方法与实例方法统一命名compute参见qualitybase.hpp中的定义参考图像的预处理应在构造函数中完成以支持一参考对多比较的高效复用无参考算法则在compute中接收待评估图像可选地生成质量图实例compute将质量图存入QualityBase::_qualityMap矩阵类型遵循QualityBase::_mat_type或重写QualityBase::getQualityMap静态compute通过OutputArray参数返回质量图在本 README 及对应头文件中记录算法文档包括compute结果含义、质量图格式若支持及其他重要使用信息提供静态方法与实例方法在单/多通道图像、OpenCL 开/关下的测试。该约定是理解本模块代码组织方式的钥匙也是社区贡献者扩展新 IQA 算法的直接依据。已知限制与 To DoREADME 末尾列出了模块当前的两项已知事项使用时应有所预期各算法输出质量图的格式尚未在文档中逐一详细说明质量图可通过getQualityMap或静态compute的OutputArray参数获取但其具体数据格式的文档化仍在规划中GMSD 在cv::Filter2D UMat CV_32F OpenCL 组合下存在精度损失源码中已通过临时转 CV_64F 规避但根因修复仍在跟进对应 issue 见 qualitygmsd.cpp 内注释。小结与实践建议结合 README 与源码可以得出以下选型与使用建议追求严格数值度量MSE 与 PSNR 最直观、开销最低适合算法回归测试与码率/压缩质量监控追求感知一致性SSIM 综合亮度/对比度/结构适合内容感知质量评估GMSD 在模块文档中被明确推荐为全参考 IQA 中通常表现最佳的算法代价是其预处理链下采样 梯度相对更重无参考场景当没有原始参考图像时使用 BRISQUE直接使用仓库自带的brisque_model_live.yml与brisque_range_live.yml即可打分也可借助computeFeatures与brisque_trainer_livedb.cpp在自己的数据库上重新训练批量对比优化凡涉及同一参考图像 vs 多张待评图的场景一律优先使用create实例化方式让参考图预处理只执行一次输入预处理按模块建议将输入转为灰度图可获得更贴近原始论文语义的结果并减少计算量多通道输入时注意逐通道返回的cv::Scalar各元素含义。至此你已具备在 C 与 Python 项目中直接使用 opencv_contrib quality 模块完成图像质量评估的完整能力并对其底层实现与扩展规范有了源码级的理解。赞分享计算机视觉图像处理机器学习【免费下载链接】opencv_contrib项目地址https://gitcode.com/gh_mirrors/ope/opencv_contrib点击查看免费下载相关推荐OpenCV Extra Modules 图像质量分析IQA模块实战指南MSE、PSNR、SSIM、GMSD 与 BRISQUEOpenCV Extra Modules 图像质量分析IQA模块实战指南MSE、PSNR、SSIM、GMSD 与 BRISQUE 导读 本文全面讲解 Op计算机视觉图像处理深度学习机器学习Anime4K图像质量评估指标PSNR与SSIM实战应用Anime4K图像质量评估指标PSNR与SSIM实战应用 在动漫视频超分领域客观评估指标是衡量算法性能的重要依据。本文将聚焦PSNR峰值信噪比与SSIM人工智能计算机视觉图像处理深度学习视频处理Kornia 图像质量评估指南PSNR、SSIM 与 SSIM3D 度量详解Kornia 图像质量评估指南PSNR、SSIM 与 SSIM3D 度量详解 导读 本文围绕 Kornia 的 metrics.image_quality 文计算机视觉人工智能深度学习图像处理上一篇应用程序名称下一篇从Grafana迁移到Perses云原生监控可视化的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考