提示:据说这是科大讯飞的算法面试题
大厂算法面试题:讲一下SSIM公式;
图像降噪后的质量,最直接的思路即比较**降噪后的图像与真实图像(distortion-free)**之间的差剖面,即可视误差,通过 visibility of errors 评价图像质量。
PSNR 和 MSE 就是基于这种简单直接的思路确定的指标,
MSE(Mean Squared Error),顾名思义,定义略。
PSNR(Peak Signal to Noise Ratio),峰值信噪比,即峰值信号的能量与噪声的平均能量之比,通
常表示的时候取 log 变成分贝(dB),
由于 MSE 为真实图像与含噪图像之差的能量均值,
而两者的差即为噪声,因此 PSNR 即峰值信号能量与 MSE 之比。
定义式如下:
第二个等式由于图像像素点数值以量化方式保存,
bits 即每个像素点存储所占的位数。
因此 MaxValue 即为 2^bits - 1。
计算PSNR
def cal_psnr(im1, im2):
mse = (np.abs(im1 - im2) ** 2).mean()
psnr = 10 * np.log10(255 * 255 / mse)
return psnr
灰度等级gray scale 存成 8bit ,故最大值255。
当时上面的评价指标有一个大的问题,那就是
由于基于差剖面的简单计算不符合人类视觉系统(Human Visual System,HVS)的评价结果,
因此需要对评价方式进行重新考量。
如果图片的最终目的是对人类展示的话,那么质量应该以人的主观测评为准。
但是由于主管评价不方便且费时,因此我们试图用客观的 图像质量评价来对图像进行评价,使其接近 HVS 的特点。
由于 HVS 具有可以抓取图像的结构特征的特点,
因此设计(结构相似性) Structural Similarity 进行评价,即 SSIM 。
注意:PSNR和SSIM都是全参考的(full reference)的,也就是需要无噪声的真实图像作为参考依据。
SSIM的基本思路是,通过以下三个方面来对两幅图像的相似性进行评估,即
1. luminance,亮度
2. contrast,对比度
3. structure,结构
其算法的框图基本如下:
算法细节流程:
(1)对于输入的x和y,首先计算出(亮度测量)luminance measurement,进行比对,得到第一个相似性有关的评价;
(2)再减去luminance的影响,img-l,计算(对比度测量)contrast measurement,比对,得到第二个评价;
(3)再用上一步的结果除掉对比度的影响,img-l/c再进行structure的比对。最后将结果combine,得到最终的评价结果。
亮度luminance用均值表征,以标准图像x为例,当然还有另外一张作为对比的图像y,公式是一样的,如下:
对比度contrast用经过均值归一化之后的方差表征,以标准图像x为例,当然还有另外一张作为对比的图像y,公式是一样的如下:
结构用相关系数(就是统计意义上的 r ,协方差与方差乘积的比值)
而相关系数r本来的公式如下:
在SSIM中:
而:
上面的计算我们在实际应用的时候一般不这样去逐像素计算,
一般采用高斯核函数(即高斯卷积)计算图像的均值、方差以及协方差,
而不是采用遍历像素点的方式,以换来更高的效率。
最终的结构相似性公式如下:
其中三个参数α,β,γ 用来表示这三个模块的重要性。
其中SSIM表示相似度,这个算子应当满足作为度量的基本性质,即
Symmetry,交换x和y顺序不影响结果。
Boundedness,值要有界,这里时小于等于1.。
Unique maximum,最大值,即1,只有当 x = y 时候取到。
所以结构相似度指数从图像组成的角度将结构信息定义为:
独立于亮度、对比度的反映场景中物体结构的属性,
并将失真建模为亮度、对比度和结构三个不同因素的组合。
用均值作为亮度的估计,标准差作为对比度的估计,协方差作为结构相似程度的度量。
python的skimage库中实现了一些常见的评价指标如
from skimage.measure import compare_mse #均方误差
from skimage.measure import compare_psnr #峰值信噪比
from skimage.measure import compare_ssmi #结构相似性
提示:重要经验:
1)SSIM公式:结构相似性计算原理,基于SSIM的图像质量评价
2)均值表示明亮度、方差表示对比度,协方差表示结构相似性,仨相乘,就是SSIM,符合人类视觉感知系统的特点
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。