- 图像质量评估综述
仅作综述与相关开源库的记录,上一篇博文中有更详细的计算方法整理。
图像质量评估(Image Quality Assessment, IQA)从方法上可分为主观评估和客观评估。主观评估就是从人的主观感知来评价图像的质量,首先给出原始参考图像和失真图像,让标注者给失真图像评分,一般采用平均主观得分(Mean Opinion Score, MOS)或平均主观得分差异(Differential Mean Opinion Score, DMOS)表示。客观评估使用数学模型给出量化值,可以使用图像处理技术生成一批失真图像,操作简单,已经成为IQA研究的重点。
IQA按照原始参考图像提供信息的多少一般分成3类:全参考(Full Reference-IQA, FR-IQA)、半参考(Reduced Reference-IQA, RR-IQA)和无参考(No Reference-IQA, NR-IQA), 无参考也叫盲参考(Blind IQA, BIQA)。FR-IQA同时有原始(无失真、参考)图像和失真图像,难度较低,核心是对比两幅图像的信息量或特征相似度,是研究比较成熟的方向。NR-IQA只有失真图像,难度较高,是近些年的研究热点,也是IQA中最有挑战的问题。RR-IQA只有原始图像的部分信息或从参考图像中提取的部分特征,此类方法介于FR-IQA和NR-IQA之间,且任何FR-IQA和NR-IQA方法经过适当加工都可以转换成RR-IQA方法。进一步,NR-IQA类算法还可以细分成两类,一类研究特定类型的图像质量,比如估计模糊、块效应、噪声的严重程度,另一类估计非特定类型的图像质量,也就是一个通用的失真评估。一般在实际应用中无法提供参考图像,所以NR-IQA最有实用价值,也有着广泛的应用,使用起来也非常方便,同时,由于图像内容的千变万化并且无参考,也使得NR-IQA成为较难的研究对象。
衡量图像质量评估结果的指标有很多,每种指标都有自己的特点,通常比较模型客观值与观测的主观值之间的差异和相关性。常见的2种评估指标是线性相关系数(Linear Correlation Coefficient, LCC)和Spearman秩相关系数(Spearman's Rank Order Correlation Coefficient, SROCC)。LCC也叫Pearson相关系数(PLCC),描述了主、客观评估之间的线性相关性,SROCC衡量算法预测的单调性,除此之外,还有Kendall秩相关系数(Kendall Rank Order Correlation Coefficient,KROCC)、均方根误差(Root Mean Square Error, RMSE)等评估指标。KROCC的性质和SROCC一样,也衡量了算法预测的单调性。RMSE计算MOS与算法预测值之间的绝对误差,衡量算法预测的准确性。
PSNR是图像、视频处理领域应用最广的性能量化方法,计算复杂度小,实现速度快,已经应用在视频编码标准H.264、H.265中。尽管PSNR具有上述特点,但是局限性很明显,受像素点的影响比较大,与主观评价一致性比较低,没有考虑人类视觉系统(Human Visual System,HVS)的一些重要的生理、心理、物理学特征。基于HVS,提出了误差灵敏度分析和结构相似度分析(Structural SIMilarity Index, SSIM)[1]的评价方法。结构相似性假定HVS高度适应于从场景中提取结构信息,试图模拟图像的结构信息,实验表明场景中物体的结构与局部亮度和对比度无关,因此,为了提取结构信息,我们应该分离照明效果。后来又发展出多尺度的结构相似性(Multi-Scale Structural SIMilarity Index, MS-SSIM)和信息量加权的结构相似性(Information Content Weighted Structural Similarity Index, IW-SSIM),在多尺度方法中,将不同分辨率和观察条件下的图像细节结合到质量评估算法中。 VIF算法使用高斯尺度混合(Gaussian Scale Mixtures, GSMs)在小波域对自然图像进行建模,由源模型,失真模型和HVS模型三部分组成。MAD[8]算法假定HVS在判断图像质量时采用不同的策略,即使用局部亮度、对比度掩蔽和空间频率分量的局部统计量的变化来寻找失真。FSIM算法强调人类视觉系统理解图像主要根据图像低级特征,选择相位一致性(Phase Congruency, PC)和图像梯度幅度(Gradient Magnitude, GM)来计算图像质量。后又加入颜色特征并用相位一致性信息做加权平均,发展出FSIMc算法。VSI算法把FSIMc中的相位一致性特征换成了显著图,保留FSIMc中的梯度和颜色信息,提高了效果。GMSD只用梯度作为特征,采用标准差pooling代替以前的均值pooling,达到了较好的效果。
虽然FR-IQA取得了良好的效果,但在许多应用中,参考图像获取不到,只能获取参考图像的一部分信息或间接特征,这便发展出RR-IQA。 RR-IQA方法为参考图像无法完全访问的情况提供了解决方案。 这种类型的方法通常先从参考图像提取最小参数集,然后结合失真图一起来估计质量。RR-IQA研究中的一个重要问题是如何确定IQA任务的有效参数。Maalouf et al等人提出了基于群变换的RR算法, 给定参考图像及其失真版本,将图像组应用于两个图像以便提取图像的纹理和梯度信息, 然后将该信息通过CSF滤波和阈值处理以获得灵敏度系数,最后通过将失真图像的灵敏度系数与参考图像的灵敏度系数进行比较来估计图像质量。Guanawan等人提出了基于局部谐波分析对阻塞或模糊降级的图像进行操作的RR-IQA算法,从边缘检测图像来计算局部谐波幅度信息,然后将该信息与失真图像一起用于估计图像质量。还有其他的基于自然场景统计(Natural Scene Statistics, NSS)的RR-IQA方法。
绝大多数NR-IQA算法试图检测特定类型的失真,如模糊,块效应,各种形式的噪声等。 例如,用于锐度、模糊度估计的算法已被证明对于模糊图像的NR-IQA表现良好。 NR-IQA方法可以评价图像的模糊度,有基于边缘分析的方法,如使用Sobel、Canny提取图像边缘。有基于变换域的方法,如使用DCT、DWT进行模糊评价。有基于像素统计信息的方法,如统计图像协方差矩阵的最大的前几个特征值的迹作为图像锐度的估计。NR-IQA方法可以估计噪声,有基于滤波的方法、基于小波变换和其他一些变换域的方法。 NR-IQA方法可以评估块效应,有基于块边界和变换域的方法。NR-IQA方法还可以评估JPEG和JPEG2000的压缩失真。
还有一些基于通用类型的NR-IQA算法,这些算法不检测特定类型的失真,他们通常将IQA问题转化成一个分类或回归问题,其中分类、回归是使用特定的特征进行训练的。 相关的特征要么使用自然场景统计提取,要么通过机器学习和深度学习发现。NR-IQA使用自然场景统计的一个主要思想是,自然图像表现出一定的统计规律,可以在失真的情况下进行评估。我们可以通过提取特征来估计质量,这些特征指示这些统计数据在失真图像中的偏离程度,比如BLINDS-II,这些方法速度通常非常慢,因为使用了计算耗时的图像转换。有基于SVM的方法,这类方法先提取图像空间域或变换域特征, 基于已有的数据训练支持向量回归分析模型(Support Vector Regression, SVR),或者对失真图像使用SVM+SVR模型,代表算法有BIQI,DIIVINE,BRISQUE等。或者使用概率模型的方法,比如BLIINDS,NIQE。或者基于码本的方法,比如CORNIA。并且 CORNIA证明,可以直接从原始图像像素学习判别图像特征,而不使用手工提取特征。
对于图像质量评估的开源库,补充在了第6、7章。
综述地址:图像质量评估综述 - 知乎 (zhihu.com)
- 直方图
在图像领域经常使用直方图评估图像色彩质量,但直方图指标不容易量化(在摄影上我们一般会用直方图来判断曝光,当你的照片左侧和右侧无明显大量溢出像素的时候,可以说曝光准确。),过曝本身来讲没有一个较为通用的量化指标,并且直方图只反映图像亮度,与过曝与否没有直接联系,使用直方图检测图像是否过曝在一些非常规图像上效果式微,可做参考,如以下文章提到的问题(复制链接到浏览器,点击图片放大到正常阅读尺寸):
https://pic1.zhimg.com/80/630ac0aa03613d34b09963b5c40de2f7_720w.webp?source=1def8aca
在图像处理中,也经常需要分析图像的亮度(即像素级的分布情况),这就需要用到直方图了,如颜色直方图、灰度直方图等。
颜色直方图:
颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可以不受图像尺度变化的影响,其缺点是没有表达出颜色空间分布的信息。
颜色直方图处理方法:
颜色直方图是对RGB三通道分别做统计,逻辑比较简单,我用opencv的函数来实现代码:
- import cv2
- import numpy as np
- from matplotlib import pyplot as plt
- image = cv2.imread("data.jpg")
- cv2.imshow("Original",image)
- #cv2.waitKey(0)
- chans = cv2.split(image)
- colors = ("b","g","r")
- plt.figure()
- plt.title("Flattened Color Histogram")
- plt.xlabel("Bins")
- plt.ylabel("# of Pixels")
- for (chan,color) in zip(chans,colors):
- hist = cv2.calcHist([chan],[0],None,[256],[0,256])
- plt.plot(hist,color = color)
- plt.xlim([0,256])
- plt.show()
如下图所示(只是统计RGB的整体色调级的分布情况,没有位置信息):
颜色直方图:
- 灰度图
在后面字节跳动团队分享的技术文章中使用了灰度图检测像素分布不均匀的图像,在下面一节中也有使用OpenCV实现的使用灰度图的检测方法。
图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横 坐标是灰度级,纵坐标是该灰度级出现的频率,描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所 占的多少。
可以设定一个阈值范围,检查每个图片的RGB每个通道的亮度平均值是否超过或低于阈值以判断是否过曝。
灰度直方图处理方法:
灰度直方图的处理相比颜色直方图更加简单,因为他只是对灰度图的灰度级别做分布统计,还是用同一张图片。
在灰度图像中,像素的亮度范围从0(黑色)到255(白色)。通过分析这个范围内的像素数量,我们可以了解图像的明暗程度。可以设置一个阈值范围,检查每个图片的平均灰度值是否超过或低于阈值以判断是否过曝。
- import cv2
- import numpy as np
- from matplotlib import pyplot as plt
- img = cv2.imread("data.jpg")
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- #cv2.imshow("image_gray", gray)
- # 灰度图像的直方图,方法一
- plt.figure()
- plt.hist(gray.ravel(), 256)
- plt.show()
- 基于opencv的图像亮度异常检测
方法一:图像亮度异常检测主要就是求一张图片的平均亮度,如果大于阈值则判断为过亮,小于阈值则判断为过暗,实际使用时可能不是对整张图片进行检测,而是只检测图片的某个区域,这时候可以根据传入的坐标对特定区域进行检测。
另外下面的代码中是验证了几种方法,最终用的就是平均值的方法,也就是代码中的da。
具体代码参照:基于opencv的图像亮度异常检测_opencv检测亮度不一样的图片-CSDN博客
方法二:读取和调整图像大小。
判断图像是否为RGB图像。如果是则将其转换到HSV色彩空间,如果不是则直接复制图像。
提取HSV图像的V通道(亮度)。
使用8×8的窗口遍历V通道图像,对每个窗口计算均值。如果均值大于233.0(过曝阈值)则增加过曝区域数量,如果小于53.0(过暗阈值)则增加过暗区域数量,无论如何都会增加总的区域数量。
根据过暗和过曝区域的比例判断图像是否过暗或过曝,并输出相应的信息。
代码中的size参数表示调整后的图像大小,可以根据具体情况设定。
这个方法使用滑动窗口方法遍历图像,在代码中用拉普拉斯算子计算图片模糊程度。
具体代码参照:python+opencv图片模糊/过爆/过暗检测一条龙_python图片花屏检测-CSDN博客
方法三:使用灰度图计算灰度图均值与方差。当存在亮度异常时,均值会偏离均值点(可以假设为128),方差也会偏小;通过计算灰度图的均值和方差,就可评估图像是否存在过曝光或曝光不足。
- import cv2
- import numpy as np
- img = cv2.imread('1.jpg')
- # 把图片转换为单通道的灰度图
- gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- # 获取形状以及长宽
- img_shape = gray_img.shape
- height, width = img_shape[0], img_shape[1]
- size = gray_img.size
- # 灰度图的直方图
- hist = cv2.calcHist([gray_img], [0], None, [256], [0, 256])
- # 计算灰度图像素点偏离均值(128)程序
- a = 0
- ma = 0
- #np.full 构造一个数组,用指定值填充其元素
- reduce_matrix = np.full((height, width), 128)
- shift_value = gray_img - reduce_matrix
- shift_sum = np.sum(shift_value)
- da = shift_sum / size
- # 计算偏离128的平均偏差
- for i in range(256):
- ma += (abs(i-128-da) * hist[i])
- m = abs(ma / size)
- # 亮度系数
- k = abs(da) / m
- print(k)
- if k[0] > 1:
- # 过亮
- if da > 0:
- print("过亮")
- else:
- print("过暗")
- else:
- print("亮度正常")
相关代码参照(包括了使用拉普拉斯算子计算图像清晰度,色偏):基于python+opencv的图片质量检测(清晰度+亮度+色偏)_python图片清晰度、色偏和亮度-CSDN博客
- 图像模糊度判断
将图像质量评价论文–hypernet网络移植到mmclassification中进行图片质量评估。
参考项目:史上最详细图像质量评价(IQA)--总目录_iqa-pytorch-CSDN博客
GitHub:GitHub - xingjunhong/IQA--hypernet at master
- 图像质量评估库
这类任务目前一般针对的是GAN、Diffusion这类生成网络生成的新图像判别图像质量的任务,也有不少用到自然图像上进行判别的,可作简单参考。
图像质量评价是在不依赖于人类主观判断的基础上,对失真图像(distorted image)质量进行自动预测,得到其质量分数的过程,其预测结果需要与人眼的 主观感知相一致。 通过图像质量评价,可以量化图像的失真程度,从而更好地监控图像质量。 而且根据此量化结果可以进一步引导各种图像处理系统的优化和评价。
对客观图像质量评价进行分类的一个标准是“原始图像”的可用性。根据原 始图像是否可获取,客观图像质量评价方法主要有 3 种:全参考(Full Reference,FR)图像质量评价方法、无参考(No Reference, NR)图像质量评 价方法与半参考(Reduced Reference,RR)图像质量评价方法。
方法在图片生成,修复,增强等领域经常需要用到。然而,由于图像质量评估本身比较小众,常用的指标往往是多年前由matlab编写而成,使用起来颇为不便。为此,编写了完全基于Python和PyTorch的开源图片质量评估的工具箱:
该工具箱提供以下特性:
- 完备性。支持多种主流的有参考(FR)和无参考(NR)指标,包括LPIPS, FID, NIQE, NRQM(Ma), MUSIQ, NIMA, DBCNN, WaDIQaM, BRISQUE, PI等
- 准确性。提供与原始matlab结果的对比,大多数误差不大于1%。
- 高效性。当使用GPU加速时,我们的实现方法比原始matlab实现最多快10倍以上。例如计算ILNIQE指标,我们的代码对于一张512x384的图片,在GPU下仅需1s,而matlab代码需10s。
- 可导性。借助PyTorch的自动求导机制,我们的工具可以实现对应指标的求导。这方便了图片修复和增强网络的训练。比如加上SSIM loss即可让SR 网络的输出更加清晰锐利。
- 灵活性。如果你需要自己训练IQA网络,我们也提供了多种主流数据的的读取接口。
简介:为什么需要IQA-PyTorch ? - 知乎 (zhihu.com)
介绍文档:IQA-PyTorch介绍 - 知乎 (zhihu.com)
其他图片质量评估 (Image quality assessment, IQA)的研究文章列表:
GitHub - chaofengc/Awesome-Image-Quality-Assessment: A comprehensive collection of IQA papers
图像质量评价领域前沿综述(2022):图像质量评价领域前沿综述(2022)_图像质量评价 前沿-CSDN博客
- OpenCV中的图像质量评估库
图像质量评价(IQA)算法以任意图像作为输入,输出质量分数作为输出。有三种类型的IQA:
- 全参考图像质量评价,适用情形:一个“干净”参考(非扭曲)图像以衡量扭曲图像的质量。此度量可用于评估图像压缩算法的质量。
- 半参考图像质量评价,适用情形:如果没有参考图像,而是具有一些选择性信息的图像(例如,水印图像)来比较和测量失真图像的质量。
- 无参考图像质量评价,适用情形:算法得到的唯一输入是要测量其质量的图像。
在OpenCV contrib的quality模块中一共有提供了5种图像质量评价算法,按上面的类别分仅提供全参考图像质量评价和无参考图像质量评价两种类别的算法,没有半参考图像质量评价算法。官方代码地址见quality,其中包含的5种图像质量评价算法具体如下:
- 均方误差 Mean squared error (MSE)
- 峰值信噪比 Peak signal-to-noise ratio (PSNR)
- 结构相似性 Structural similarity (SSIM)
- 梯度幅度相似性偏差 Gradient Magnitude Similarity Deviation (GMSD)
- 盲/无参考图像空间质量评估器 Blind/Referenceless Image Spatial Quality Evaluation (BRISQUE)
这5种图像质量评价算法中,除了BRISQUE是无参考图像质量评价算法外,其他都是全参考图像质量评价。
参考链接:[OpenCV实战]48 基于OpenCV实现图像质量评价_opencv图像质量评价-CSDN博客
- 字节跳动技术质量团队分享-图像异常质量检测
字节跳动团队对他们的业务中出现的图像异常质量检测进行了概述,比较全面的概述了数据集中出现的各类异常图像的检测方法。但任务是基于非自然图像,并且集中于图像部分、区域异常检测,仅有方法概述,仅作参考。
总体设计思路:“由于异常检测的数据通常是长尾分布,针对大部分算法,我们都采取了传统图像处理的方式来解决,而针对图像处理解决不了的情况,我们使用异常图片生成+深度学习的方式来解决。
传统图像处理的优势在于对数据量的要求相对较低,但泛化性较差,随着时间和异常数据的逐步积累,会逐渐转换为传统方法召回+深度学习方法精确分类的模式。”
类似于我们自然图像检测的方法从文中可以发现:“将界面分割成由上到下的若干个区域,通过计算区域内所有32 * 32灰度图像的像素区域的像素均值和标准差的均值来检测当前界面是否存在黑屏或者白屏的异常出现。”也是使用灰度图像区域像素的均值与标准差均值进行检测的。在2.节与4.节方法三中提到。
针对过曝检测此团队是以图像中部分像素出现过曝情况进行检测,着重了部分图像的处理:“原理:
通过二值化保留高亮区域,利用形态学开操作去除噪点,通过高亮区域的面积和形状进行过滤。”与我们的任务相似度不高。
针对花屏图像数据此团队训练了二分类CNN模型使得检测结果“达到测试集准确率98.7% (961/974),其中异常图片准确率99.4%(484/487),正常图片98.1%(478/487)。CPU单张图片预测时长约42ms。模型大小4 MB。”
文中提到的无监督聚类做数据集图像粗粒度整合可以作为我们任务的预处理步骤:“
· 通过Sift + Spatial Pyramid Pooling 提取多尺度下的Sift 特征点及特征向量,这里选择了3个尺度下的Sift特征。
· 对整个数据集所有的图片所提取的所有尺度下的特征向量进行KMeans聚类,获得一个codebook。
· 根据codebook,对每个图片的的Sift特征进行计算直方图向量,并拼接3个尺度1+4+9 共14个直方图向量作为图片的全局表述
· 使用Bisecting KMeans对全局向量做自适应聚类,无需人工指定簇的个数。
· 对最终的聚类结果做可视化后挑选相同场景的簇做合并,得到最终的场景分类器。”