海尔网站建设水平,乐清网吧什么时候恢复营业,网站建设系统设计,家政保洁服务网站模板最常见的图像评价指标-PSNR和SSIM 专题介绍一、PSNR原理讲解代码讲解 二、SSIM原理讲解代码讲解 三、总结 本文将介绍讲解学术界最常见的全参考图像质量评价指标#xff0c;PSNR和SSIM#xff0c;可以有效的对图像算法的保真度#xff08;Fidelity#xff09;进行评估。参考… 最常见的图像评价指标-PSNR和SSIM 专题介绍一、PSNR原理讲解代码讲解 二、SSIM原理讲解代码讲解 三、总结 本文将介绍讲解学术界最常见的全参考图像质量评价指标PSNR和SSIM可以有效的对图像算法的保真度Fidelity进行评估。参考资料如下其中代码实现的部分博主准备参考一个GitHub开源的IQA集合实现IQA-pytorch大家也可以尝试用pip来安装IQA-pytorch库调用IQA算法起来会更简单方便些 [1]. 图像质量评价综述 [2]. PSNR和SSIM原理讲解 [3]. IQA-pytorch代码路径 专题介绍
图像质量评价Image Quality Assessment, IQA是图像处理、计算机视觉和多媒体通信等领域的关键技术之一。IQA不仅被用于学术研究更在影像相关行业内实现了完整的商业化应用涉及影视、智能手机、专业相机、安防监控、工业质检、医疗影像等。IQA与图像如影随形其重要程度可见一斑。
但随着算法侧的能力不断突破AIGC技术发展火热早期的IQA或已无法准确评估新技术的能力。另一方面千行百业中各类应用对图像质量的需求也存在差异和变化旧标准也面临着适应性不足的挑战。
本专题旨在梳理和跟进IQA技术发展内容和趋势为读者分享有价值、有意思的IQA。希望能够为底层视觉领域内的研究者和从业者提供一些参考和思路。 一、PSNR
原理讲解
PSNR峰值信噪比Peak Signal-to-Noise Ratio全参考IQA方法用于衡量两张图像之间差异例如压缩图像与原始图像评估压缩图像质量复原图像与ground truth评估复原算法性能等是基于HVS设计的算法参考的图像的逐像素特征。公式如下所示 P S N R 10 × lg ( M a x V a l u e 2 M S E ) \mathrm{PSNR}10 \times \lg \left(\frac{\mathrm{MaxValue}^{2}}{\mathrm{MSE}}\right) PSNR10×lg(MSEMaxValue2) 公式中MaxValue是图像的最大值对于8bit图像来说就是255当然如果是归一化到1的浮点图像就是1了而MSE的计算公式如下所示 1 M N ∑ i 1 M ∑ j 1 N ( I ( i , j ) − K ( i , j ) ) 2 \frac{1}{MN}\sum_{i1}^{M}\sum_{j1}^{N}(I(i,j)-K(i,j))^2 MN1i1∑Mj1∑N(I(i,j)−K(i,j))2 其中 I I I和 K K K分别是算法处理后以及参考图像 M M M和 N N N是图像的宽高公式计算的是均方误差因为我们通常使用的是彩色图像因此这里关于MSE的定义就需要考虑通道考虑通道就有多种方式 1分别计算 RGB 三个通道的 PSNR然后取平均值。 2计算 RGB 三通道的 MSE 然后再除以 3 。 3将图片转化为 YCbCr 格式然后只计算 Y 分量也就是亮度分量的 PSNR。 其中第二和第三种方法比较常见。
代码讲解
前面讲了这里会以IQA-pytorch库作为参考来讲解IQA-pytorch代码结构如下所示。 大家可以打开pyiqa/archs/psnr_arch.py文件其中代码实现如下所示。
from pyiqa.utils.color_util import to_y_channeldef psnr(x, y, test_y_channelFalse, data_range1.0, eps1e-8, color_spaceyiq):rCompute Peak Signal-to-Noise Ratio for a batch of images.Supports both greyscale and color images with RGB channel order.Args:- x: An input tensor. Shape :math:(N, C, H, W).- y: A target tensor. Shape :math:(N, C, H, W).- test_y_channel (Boolean): Convert RGB image to YCbCr format and computes PSNRonly on luminance channel if True. Compute on all 3 channels otherwise.- data_range: Maximum value range of images (default 1.0).Returns:PSNR Index of similarity between two images.if (x.shape[1] 3) and test_y_channel:# Convert RGB image to YCbCr and use Y-channelx to_y_channel(x, data_range, color_space)y to_y_channel(y, data_range, color_space)mse torch.mean((x - y) ** 2, dim[1, 2, 3])score 10 * torch.log10(data_range**2 / (mse eps))return score可以看到核心代码在psnr函数中有两种模式如果选择只对Y通道处理就需要先将图像转换到Y通道否则就继续保持RGB格式计算中首先对后三维进行求取均值计算MSE的大小之后根据公式计算PSNR。这两种模式正好对应前面讲到的2种实现原理。
二、SSIM
原理讲解
SSIM是基于三个公式来估计了图像的三个比较衡量亮度 (luminance)、对比度 (contrast) 和结构 (structure)也是一个全参考IQA方法同样是基于HVS设计的算法对比的是图像间的结构特征公式如下所示 l ( x , y ) 2 μ x μ y c 1 μ x 2 μ y 2 c 1 , c ( x , y ) 2 σ x σ y c 2 σ x 2 σ y 2 c 2 , s ( x , y ) σ x y c 3 σ x σ y c 3 l(x, y)\frac{2 \mu_{x} \mu_{y}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_{x y}c_{3}}{\sigma_{x} \sigma_{y}c_{3}} l(x,y)μx2μy2c12μxμyc1,c(x,y)σx2σy2c22σxσyc2,s(x,y)σxσyc3σxyc3 其中 μ x \mu_{x} μx和 μ y \mu_{y} μy代表两幅图像的均值 σ x \sigma_{x} σx和 σ y \sigma_{y} σy代表方差 σ x y \sigma_{x y} σxy代表协方差 c 1 − 3 c_{1-3} c1−3是为了防止除0的常数通过以上定义的三个指标定义出了SSIM如下所示。 S S I M ( x , y ) l ( x , y ) ∗ c ( x , y ) ∗ s ( x , y ) ( 2 μ x μ y c 1 ) ( 2 σ x y c 2 ) ( μ x 2 μ y 2 c 1 ) ( σ x 2 σ y 2 c 2 ) {SSIM}(x, y)l(x,y)*c(x,y)*s(x,y)\operatorname\frac{\left(2 \mu_{x} \mu_{y}c_{1}\right)\left(2 \sigma_{x y}c_{2}\right)}{\left(\mu_{x}^{2}\mu_{y}^{2}c_{1}\right)\left(\sigma_{x}^{2}\sigma_{y}^{2}c_{2}\right)} SSIM(x,y)l(x,y)∗c(x,y)∗s(x,y)(μx2μy2c1)(σx2σy2c2)(2μxμyc1)(2σxyc2) 其中c1和c2的取值有默认值在后面代码会看到。 最后需要注意的是每次计算的时候都从图片上取一个N*N的窗口并不是整图去做不断滑动窗口进行计算最后取平均值作为全局的 SSIM即每次计算一个窗口的SSIM最后将他们进行平均得到最终的值。
代码讲解
同样的大家可以看到pyiqa/archs/ssim_arch.py文件代码实现如下
from pyiqa.utils.color_util import to_y_channel
from pyiqa.matlab_utils import fspecial, SCFpyr_PyTorch, math_util, filter2
from pyiqa.utils.registry import ARCH_REGISTRY
from .func_util import preprocess_rgbdef ssim(X,Y,winNone,get_ssim_mapFalse,get_csFalse,get_weightFalse,downsampleFalse,data_range1.0,
):if win is None:win fspecial(11, 1.5, X.shape[1]).to(X)C1 (0.01 * data_range) ** 2C2 (0.03 * data_range) ** 2# Averagepool image if the size is large enoughf max(1, round(min(X.size()[-2:]) / 256))# Downsample operation is used in official matlab codeif (f 1) and downsample:X F.avg_pool2d(X, kernel_sizef)Y F.avg_pool2d(Y, kernel_sizef)mu1 filter2(X, win, valid)mu2 filter2(Y, win, valid)mu1_sq mu1.pow(2)mu2_sq mu2.pow(2)mu1_mu2 mu1 * mu2sigma1_sq filter2(X * X, win, valid) - mu1_sqsigma2_sq filter2(Y * Y, win, valid) - mu2_sqsigma12 filter2(X * Y, win, valid) - mu1_mu2cs_map (2 * sigma12 C2) / (sigma1_sq sigma2_sq C2)cs_map F.relu(cs_map) # force the ssim response to be nonnegative to avoid negative results.ssim_map ((2 * mu1_mu2 C1) / (mu1_sq mu2_sq C1)) * cs_mapssim_val ssim_map.mean([1, 2, 3])if get_weight:weights torch.log((1 sigma1_sq / C2) * (1 sigma2_sq / C2))return ssim_map, weightsif get_ssim_map:return ssim_mapif get_cs:return ssim_val, cs_map.mean([1, 2, 3])return ssim_val可以看到C1和C2是我们前面讲到的常数因为我们是每次计算一个窗口内的均值、方差、协方差等统计量因此非常适合卷积操作。代码里面就使用到一个win来对各个图像进行filter得到均值mu然后使用方差公式平方的均值减去均值的平方协方差公式乘积的均值减去均值的乘积来得到sigma1_sq和sigma12。 然后根据SSIM公式进行一个组合就得到了ssim_map计算均值就得到了ssim_val了。
三、总结
PSNR和SSIM作为经典的图像评价指标基本上所有的图像处理任务在最后的效果对比上都会进行对比因此是非常重要的不仅要会使用也要熟悉它的原理。 感谢阅读欢迎留言或私信一起探讨和交流如果对你有帮助的话也希望可以给博主点一个关注谢谢。