图像处理中常用的相似度评估指标
导读
有时候我们想要计算两张图片是否相似,而用来衡量两张图片相似度的算法也有很多,例如:RMSE
、PSNR
、SSIM
、UQI
、SIFT
以及深度学习
等。这篇文章主要介绍,RMSE
、PSNR
、SSIM
、UQI
这些指标的计算和应用,关于SIFT
算法来计算图像的相似度在后面的文章中再进行介绍
影响这些算法的结果也有很多因素,图片的噪声
、平移
、缩放
、旋转
、裁剪
、透视变换
等,都会影响到算法的最终结果,所以我们需要根据不同的应用场景来选择使用不同的算法
MSE和RMSE
MSE
(mean squared error):图像像素值的平方误差
RMSE
(root mean squared error):图像像素值的平方根误差
- 缺点
- 对比两张图片的size必须要完全一致
- 对缩放、旋转、裁剪敏感
- 优点
- 计算速度快
- 算法简单
- 适应场景
- 视频中对比前后两帧的差别
- 计算图片的相似
- 代码实现
def mean_squared_error(img1,img2):#判断两张图片的shape是否一致assert img1.shape == img2.shape,"images have different shape " \"{} and {}".format(img1.shape,img2.shape)#计算两张图像的MSEimg_mse = np.mean((img1.astype(np.float64) - img2.astype(np.float64))**2)#将图像的MSE量化为相似度img_sim = img_mse / (255**2)return img_mse,1 - img_simdef root_mean_squared_error(img1,img2):#判断两张图片的shape是否一致assert img1.shape == img2.shape,"images have different shape " \"{} and {}".format(img1.shape,img2.shape)#计算两张图像的MSEimg_rmse = np.sqrt(np.mean((img1.astype(np.float64) - img2.astype(np.float64))**2))#将图像的MSE量化为相似度img_sim = img_rmse / 255return img_rmse,1 - img_sim
计算两张图片的MSE
和RMSE
print(mean_squared_error(img1,img2))
#(10826.879833697936, 0.8334966576901509)
print(root_mean_squared_error(img1,img2))
#(104.05229374549096, 0.5919517892333688)
PSNR
PSNR
(Peak Signal Noise Ratio)也叫峰值信噪比
:为了衡量处理后图像的品质,我们经常会使用到PSNR来衡量程序的处理结果是否令人满意。它是原图像与被处理图像之间的均方误差相对于(2n−1)2(2^n-1)^2(2n−1)2的对数值(信号最大值的平方,n是每个采样值的比特数),计算公式如下:
PSNR=10∗log10(2n−1)2MSEPSNR = 10 * log_{10}\frac{(2^n-1)^2}{MSE} PSNR=10∗log10MSE(2n−1)2
缺点
PSNR的分数无法和人眼看到的品质完全一致优点
算法简单,应用广泛适用场景
用来评价画质客观量的测法,也可以用于图像相似的计算代码实现
def peak_signal_noise_ratio(img1,img2):#判断两张图片的size是否一致assert img1.shape == img2.shape,"images hava different shape " \"{} and {}".format(img1.shape,img2.shape)#获取数据类型所表示的最大值MAX = np.iinfo(img1.dtype).max#计算两张图片的MSEmse,_ = mean_squared_error(img1,img2)#计算两张图片的PSNRpsnr = 10 * np.log10(MAX**2 / mse)return psnrprint(peak_signal_noise_ratio(img1,img2))
#49.24985796979349
注
:由于PSNR
的取值范围在(0,inf),PSNR的值越大表示图像越相似
。如果想要将PSNR指标量化为相似度,可以基于测试图片上设置一个最大的PSNR值,进行取最大操作来换算成相似度
SSIM
SSIM
(structural similarity index)结构相似性:是一种用来衡量两张图像相似程度的指标。当两张图像其中有一张为无失真图像,另一张为失真后的图像,两张图像的结构相似性
可以看做是失真图像的品质质量指标。结构相似性相对于峰值信噪比而言,结构相似性指标在图像品质的衡量上更能符合人眼对图像品质的判断。
以xxx和yyy两个信号为例,结构相似性的计算公式如下:
SSIM(x,y)=(l(x,y))α(c(x,y))β(s(x,y))γl(x,y)=2μxμy+C1μx2+μy2+C1c(x,y)=2δxδy+C2δx2+δy2+C2s(x,y)=δxy+C3δxδy+C3\begin{aligned} SSIM(x,y) &= (l(x,y))^\alpha(c(x,y))^\beta(s(x,y))^\gamma \\ l(x,y) &= \frac{2\mu_x\mu_y + C_1}{\mu_x^2+\mu_y^2+C_1} \\ c(x,y) &= \frac{2\delta_x\delta_y + C_2}{\delta_x^2+\delta_y^2+C_2}\\ s(x,y) &= \frac{\delta_{xy}+C_3}{\delta_x\delta_y+C_3} \end{aligned} SSIM(x,y)l(x,y)c(x,y)s(x,y)=(l(x,y))α(c(x,y))β(s(x,y))γ=μx2+μy2+C12μxμy+C1=δx2+δy2+C22δxδy+C2=δxδy+C3δxy+C3
上式中的l(x,y)l(x,y)l(x,y)比较的是两个信号之间的亮度,c(x,y)c(x,y)c(x,y)比较的是两个信号的对比度,s(x,y)s(x,y)s(x,y)比较的是两个信号的结构,其中α>0,β>0,γ>0\alpha > 0,\beta > 0,\gamma > 0α>0,β>0,γ>0主要是用来调整l(x,y)、c(x,y)、s(x,y)l(x,y)、c(x,y)、s(x,y)l(x,y)、c(x,y)、s(x,y)的重要性,μx和μy\mu_x和\mu_yμx和μy表示的是信号的平均值,δx和δy\delta_x和\delta_yδx和δy表示的是信号的标准差,而δxy\delta_{xy}δxy为信号的协方差,C1、C2、C3C_1、C_2、C_3C1、C2、C3皆为常数,用来维持l(x,y)、c(x,y)、s(x,y)l(x,y)、c(x,y)、s(x,y)l(x,y)、c(x,y)、s(x,y)的稳定,SSIM的值越大,表示两个信号之间的相似度越高
在计算图像结构相似性的时候,我们一般会将参数设为α=β=γ=1以及C3=C2/2\alpha=\beta=\gamma=1以及C_3=C_2/2α=β=γ=1以及C3=C2/2所以SSIMSSIMSSIM最终的公式就变成了下式
SSIM(x,y)=(2μxμy+C1)(2δxy+C2))(μx2+μy2+C1)(δx2+δy2+C2)SSIM(x,y) = \frac{(2\mu_x\mu_y+C_1)(2\delta_{xy}+C_2))}{(\mu_x^2+\mu_y^2+C_1)(\delta_x^2+\delta_y^2+C_2)} SSIM(x,y)=(μx2+μy2+C1)(δx2+δy2+C2)(2μxμy+C1)(2δxy+C2))
通常在计算图像的SSIMSSIMSSIM的时候,我们都会采用移动的filter
来进行计算
- 代码实现
from scipy import signal
from enum import Enumdef filter2(img,fltr,mode='same'):return signal.convolve2d(img, np.rot90(fltr,2), mode=mode)def _get_sums(GT,P,win,mode='same'):mu1,mu2 = (filter2(GT,win,mode),filter2(P,win,mode))return mu1*mu1, mu2*mu2, mu1*mu2def _get_sigmas(GT,P,win,mode='same',**kwargs):if 'sums' in kwargs:GT_sum_sq,P_sum_sq,GT_P_sum_mul = kwargs['sums']else:GT_sum_sq,P_sum_sq,GT_P_sum_mul = _get_sums(GT,P,win,mode)return filter2(GT*GT,win,mode) - GT_sum_sq,\filter2(P*P,win,mode) - P_sum_sq, \filter2(GT*P,win,mode) - GT_P_sum_mulclass Filter(Enum):UNIFORM = 0GAUSSIAN = 1def fspecial(fltr,ws,**kwargs):if fltr == Filter.UNIFORM:return np.ones((ws,ws))/ ws**2elif fltr == Filter.GAUSSIAN:x, y = np.mgrid[-ws//2 + 1:ws//2 + 1, -ws//2 + 1:ws//2 + 1]g = np.exp(-((x**2 + y**2)/(2.0*kwargs['sigma']**2)))g[ g < np.finfo(g.dtype).eps*g.max() ] = 0assert g.shape == (ws,ws)den = g.sum()if den !=0:g/=denreturn greturn Nonedef _ssim_single(GT, P, ws, C1, C2, fltr_specs, mode):win = fspecial(**fltr_specs)GT_sum_sq, P_sum_sq, GT_P_sum_mul = _get_sums(GT, P, win, mode)sigmaGT_sq, sigmaP_sq, sigmaGT_P = _get_sigmas(GT, P, win, mode, sums=(GT_sum_sq, P_sum_sq, GT_P_sum_mul))assert C1 > 0assert C2 > 0ssim_map = ((2 * GT_P_sum_mul + C1) * (2 * sigmaGT_P + C2)) / ((GT_sum_sq + P_sum_sq + C1) * (sigmaGT_sq + sigmaP_sq + C2))cs_map = (2 * sigmaGT_P + C2) / (sigmaGT_sq + sigmaP_sq + C2)return np.mean(ssim_map), np.mean(cs_map)def ssim(GT,P,ws=11,K1=0.01,K2=0.03,MAX=None,fltr_specs=None,mode='valid'):if MAX is None:MAX = np.iinfo(GT.dtype).maxassert GT.shape == P.shape, "Supplied images have different sizes " + \str(GT.shape) + " and " + str(P.shape)if fltr_specs is None:fltr_specs=dict(fltr=Filter.UNIFORM,ws=ws)C1 = (K1*MAX)**2C2 = (K2*MAX)**2ssims = []css = []for i in range(GT.shape[2]):ssim,cs = _ssim_single(GT[:,:,i],P[:,:,i],ws,C1,C2,fltr_specs,mode)ssims.append(ssim)css.append(cs)return np.mean(ssims),np.mean(css)img_sim,_ = ssim(img1,img2)
#0.9459787655432684
UQI
UQI
(Universal Quality Image Index)也叫图像通用质量指标
:它能够很容易的计算并且应用到各种图像处理的应用中,主要结合三个因素来计算,相关性的损失
、亮度失真
、对比度失真
。尽管UQI
指标是从数学的角度来定义的不是利用人类的视觉系统,但是通过各种各样的图像失真表明UQI与主观质量测量有着惊人的一致性
。
UQI
指标的计算公式如下:
Q=4δxyx^y^(δx2+δy2)[(x^)2+(y^)2]x^=1N∑i=1Nxiy^=1N∑i=1Nyiδx2=1N−1∑i=1N(xi−x^)2δy2=1N−1∑i=1N(yi−y^)2\begin{aligned} Q &= \frac{4\delta_{xy}\hat{x}\hat{y}}{(\delta^2_x+\delta^2_y)[(\hat{x})^2+(\hat{y})^2]} \\ \hat{x} &= \frac{1}{N}\sum_{i=1}^{N}x_i \\ \hat{y} &= \frac{1}{N}\sum_{i=1}^{N}y_i \\ \delta_{x}^2 &= \frac{1}{N - 1}\sum_{i=1}^{N}(x_i-\hat{x}) ^2\\ \delta_{y}^2 &= \frac{1}{N - 1}\sum_{i=1}^{N}(y_i - \hat{y})^2 \end{aligned} Qx^y^δx2δy2=(δx2+δy2)[(x^)2+(y^)2]4δxyx^y^=N1i=1∑Nxi=N1i=1∑Nyi=N−11i=1∑N(xi−x^)2=N−11i=1∑N(yi−y^)2
Q
的取值范围在[-1,1]之间
- 代码实现
import numpy as np
from scipy.ndimage import uniform_filterdef _uqi_single(GT,P,ws):N = ws**2window = np.ones((ws,ws))GT_sq = GT*GTP_sq = P*PGT_P = GT*PGT_sum = uniform_filter(GT, ws)P_sum = uniform_filter(P, ws)GT_sq_sum = uniform_filter(GT_sq, ws)P_sq_sum = uniform_filter(P_sq, ws)GT_P_sum = uniform_filter(GT_P, ws)GT_P_sum_mul = GT_sum*P_sumGT_P_sum_sq_sum_mul = GT_sum*GT_sum + P_sum*P_sumnumerator = 4*(N*GT_P_sum - GT_P_sum_mul)*GT_P_sum_muldenominator1 = N*(GT_sq_sum + P_sq_sum) - GT_P_sum_sq_sum_muldenominator = denominator1*GT_P_sum_sq_sum_mulq_map = np.ones(denominator.shape)index = np.logical_and((denominator1 == 0) , (GT_P_sum_sq_sum_mul != 0))q_map[index] = 2*GT_P_sum_mul[index]/GT_P_sum_sq_sum_mul[index]index = (denominator != 0)q_map[index] = numerator[index]/denominator[index]s = int(np.round(ws/2))return np.mean(q_map[s:-s,s:-s])def uqi (GT,P,ws=8):if len(GT.shape) == 2:GT = GT[:, :, np.newaxis]P = P[:, :, np.newaxis]GT = GT.astype(np.float64)P = P.astype(np.float64)return np.mean([_uqi_single(GT[:,:,i],P[:,:,i],ws) for i in range(GT.shape[2])])
总结
除了上面的图像相似度评估指标之外,Sewar还提供了很多其他的图像质量评估指标算法,例如:MS-SSIM
、ERGAS
、SCC
、RASE
、SAM
、D_lambda
、D_S
、QNR
、VIF
以及PSNR-B
。
下面我们来对比一下一些常用指标在添加不同噪声的情况下,计算出来的相似度结果之间的差异
给图片添加噪声可以参考我的这篇文章对图像添加(高斯/椒盐/泊松/斑点)噪声
评估算法 | 原图像 | 高斯噪声 | 高斯模糊 | 泊松噪声 | 椒盐噪声 | 散斑噪声 |
---|---|---|---|---|---|---|
MSE | 0.00 | 548.66 | 79.78 | 0.77 | 885.12 | 10826.88 |
RMSE | 0.00 | 23.42 | 8.93 | 0.88 | 29.75 | 104.05 |
PSNR | inf | 20.74 | 29.11 | 49.25 | 18.66 | 7.79 |
SSIM | 1.00 | 0.25 | 0.94 | 0.99 | 0.45 | 0.06 |
UQI | 1.00 | 0.98 | 0.99 | 1.00 | 0.98 | 0.80 |
MS-SSIM | 1.00+0.00j | 0.76+0.00j | 0.98+0.00j | 1.00+0.00j | 0.86+0.00j | 0.32+0.00j |
ERGAS | 0.00 | 8031.33 | 2322.77 | 225.79 | 11187.33 | 26741.73 |
SCC | 0.89 | 0.08 | 0.17 | 0.48 | 0.35 | 0.02 |
RASE | 0.00 | 1158.13 | 333.25 | 32.21 | 1600.90 | 3814.14 |
SAM | 0.00 | 0.13 | 0.05 | 0.00 | 0.13 | 0.58 |
D_lambda | 0.00 | 0.02 | 0.00 | 0.00 | 0.03 | 0.20 |
VIFP | 1.00 | 0.23 | 0.49 | 0.93 | 0.44 | 0.06 |
PSNR-B | inf | 20.70 | 28.93 | 49.59 | inf | 8.10 |
参考
- https://ece.uwaterloo.ca/~z70wang/publications/uqi.html
- https://github.com/andrewekhalel/sewar
- https://ece.uwaterloo.ca/~z70wang/publications/quality_2c.pdf
图像处理中常用的相似度评估指标相关推荐
- 3个最常用的分类模型评估指标!
针对二元分类结果,常用的评估指标有如下三个:查准率(Precision).查全率(Recall)以及F-score.这篇文章将讨论这些指标的含义.设计初衷以及局限性. 01 二元分类问题 在机器学习领 ...
- 图像处理中常用数学知识
2.3.3 赋范空间 每个实数或复数,都有相对应的绝对值或者模,每一个n维矢量,也都可以定义其长度.如果把"长度"的概念推广到一般抽象空间中的元素上,就可以得到范数这个概念. 本节 ...
- jaccard相似度_推荐系统中常用计算相似度的方法和工具
常用的相似度计算方法:(1)欧氏距离(2)余弦相似度 (3)皮尔逊相关系数 (4)修正余弦相似度(5)汉明距离 (6)曼哈顿距离 1.欧式距离:就是计算空间中两点的距离 def EuclideanDi ...
- 图像处理中常用的彩色模型
颜色模型(颜色空间)就是描述用一组数值来描述颜色的数学模型.在彩色图像处理中,选择合适的彩色模型是很重要的.从应用的角度来看,彩色模型可分为两类: 一.面向硬件设备的彩色模型 1.RGB模型 最典型. ...
- 机器学习中ROC曲线和AUC评估指标
目录 1.真正例率(TPR )与 假正例率(FPR)定义 2.ROC曲线(接受者操作特性曲线,receiver operating characteristic curve) 3.AUC(ROC曲线下 ...
- NLP中常用的相似度计算方法
文章目录 相似度计算方法 1. 文本距离 1.1 编辑距离(Edit Distance) 1.2 最长公共子串.最长公共子序列(Long Common Subsequence,LCS) 1.3 句向量 ...
- 机器学习 对回归的评估_在机器学习回归问题中应使用哪种评估指标?
机器学习 对回归的评估 If you're like me, you might have used R-Squared (R²), Root Mean Squared Error (RMSE), a ...
- (七)图像处理中常用算子Laplacian\Sobel\Roberts\Prewitt\Kirsch
1.拉普拉斯(Laplacian)算子 1.1基础介绍 最简单的各向同性导数算子是拉普赖斯算子,其具有旋转不变性,对于两个变量的函数f(x,y)f(x,y)f(x,y),其定义为 ▽2f=∂2f∂x2 ...
- 图像处理中常用的坐标系转换
共有四种坐标系 世界坐标系-->相机坐标系 [Xc,Yc,Zc]T表示相机坐标,[Xw,Yw,Zw,1]T表示归物体所在的世界坐标.R表示旋转矩阵,T表示平移矩阵. 相机坐标系-->图像坐 ...
- 手游数据分析中常用到的指标说明
说明:在不同的行业做数据分析,有些指标是互通的,但是根据业务的不同也会有很多不同的指标,比如之前在互联网金融公司实习,做的是信贷产品的数据分析,常用到的指标就有各种用户数据,比如新客.老客.随借.结清 ...
最新文章
- 空缺的2018-3-11《祖宗十九代》《缝纫机乐队》
- 人字拖藏SIM卡、戴微型蓝牙耳机!为考教师岗,多人作弊被抓
- 独立成分分析 ( ICA ) 与主成分分析 ( PCA ) 的区别
- linux 的读写操作(转)
- hazelcast入门教程_Hazelcast入门指南第2部分
- java post 多文件报头_Spring MVC-------文件上传,单文件,多文件,文件下载
- 【Flink】Flink 使用代码如何主动触发 SavePoint
- python 编码解码原理_Python的编码解码问题
- 视频讲解(RCNN,FasterRCNN,FPN,MaskRCNN)
- B树和TreeSet与TreeMap
- lesson 040 —— 面向对象简介
- pic单片机c语言 程序,单片机教程:PIC单片机C语言程序设计(一)
- 如何编写大数据分析师简历
- CUDA库之NPP(四):内存开辟和字节对齐
- 荆州水文水位查询_长江水位实时查询网(长江水位公告实时查询)
- 如何在命令行下用命令slmgr激活windows8系统
- 翡润年华教你肉眼鉴别翡翠ABC
- vue项目无法在IE打开
- 【cubemx】移植正点原子ov2640
- ug908 Programming and Debugging