深度学习——图像相似度评价指标

PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)

定义

峰值信噪比(PeakSignal toNoiseRatio,PSNR),表示的是信号的最大功率与噪声功率的比值。峰值信噪比越高,表示噪声影响越小;峰值信噪比越低,表示噪声影响越大,单位是分贝dB。PSNR是基于像素值的全局评估,不考虑图像的结构信息

  1. PSNR接近50dB:表示压缩后的图像质量非常高,仅有非常小的误差。在这种情况下,原始图像和压缩后的图像之间的差异几乎不可察觉。
  2. PSNR大于30dB:通常认为,人眼很难察觉到这种压缩水平下图像的失真。这意味着压缩后的图像在视觉上与原始图像非常接近。
  3. PSNR介于20dB到30dB之间:在这个范围内,人眼可以开始察觉到图像的一些差异,但这些差异通常不会太显著。
  4. PSNR介于10dB到20dB之间:在这个范围内,人眼可以较为明显地看出图像的差异,但仍然可以辨识出图像的基本结构。尽管存在失真,但人们可能仍然会认为两张图像是相似的。
  5. PSNR低于10dB:当PSNR值非常低时,图像的质量会显著下降,以至于人眼很难判断两个图像是否为同一场景的图像,或者一个图像是否为另一个图像的有效压缩版本。

公式

假设原始图像是 x x x,生成图像是 y y y,图像大小是 H × W H \times W H×W,两张图像的均方差公式 ( M S E ) (MSE) (MSE)定义为: M S E = 1 H W ∑ i = 0 H − 1 ∑ j = 0 W − 1 ( x i j − y i j ) 2 MSE=\frac{1}{HW}\sum_{i=0}^{H-1}\sum_{j=0}^{W-1}(x_{ij}-y_{ij})^2 MSE=HW1i=0H1j=0W1(xijyij)2 我们假设图像是 B B B位图像,像素的最大值 M A X = 2 B − 1 MAX=2^B-1 MAX=2B1,例如如果是8位图像,图像最大值为255, P S N R PSNR PSNR的公式可以定义为:
P S N R = 10 l o g 10 ( M A X 2 M S E ) PSNR=10 log_{10}(\frac{MAX^2}{MSE}) PSNR=10log10(MSEMAX2)

代码

from PIL import Image
import numpy as np

def psnr(img1, img2):
    mse = np.mean((img1-img2)**2)
    if mse == 0:
        return float('inf')
    else:
        return 20*np.log10(255/np.sqrt(mse))
        
if __name__ == "__main__":
	img1 = np.array(Image.open('original.jpg')).astype(np.float64)
	img2 = np.array(Image.open('compress.jpg')).astype(np.float64)
    print(psnr(img1, img2))

SSIM

我们假设原图为 x x x,生成图像为 y y y.其均值和方差分别为 μ x , μ y , σ x , σ y \mu_x,\mu_y,\sigma_x,\sigma_y μx,μy,σx,σy。他们的协方差为 σ x , y \sigma_{x,y} σx,y,我们从三个角度考虑图像的相似度,亮度(luminance)对比度(contrast)结构(structure)

亮度相似度比较: l ( x , y ) = 2 μ x μ y + c 1 μ x 2 + μ y 2 + c 1 l(x,y)=\frac{2\mu_x\mu_y+c_1}{\mu_x^2+\mu_y^2+c_1} l(x,y)=μx2+μy2+c12μxμy+c1

对比相似度比较: c ( x , y ) = 2 σ x σ y + c 2 σ x 2 + σ y 2 + c 2 c(x,y)=\frac{2\sigma_x\sigma_y+c_2}{\sigma_x^2+\sigma_y^2+c_2} c(x,y)=σx2+σy2+c22σxσy+c2

结构相似度比较: s ( x , y ) = σ x y + c 3 σ x σ y + c 3 s(x,y)=\frac{\sigma_{xy}+c_3}{\sigma_x\sigma_y+c_3} s(x,y)=σxσy+c3σxy+c3

S S I M = 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=l(x,y)c(x,y)s(x,y)=\frac{(2\mu_x\mu_y+c_1)(2\sigma_{x,y}+c_2)}{(\mu_x^2+\mu_y^2+c_1)(\sigma_x^2+\sigma_y^2+c_2)} SSIM=l(x,y)c(x,y)s(x,y)=(μx2+μy2+c1)(σx2+σy2+c2)(2μxμy+c1)(2σx,y+c2)

其中 c 1 , c 2 , c 3 c_1,c_2,c_3 c1,c2,c3是稳定除法运算的常数, c 1 = ( k 1 L ) 2 , c 2 = ( k 2 L ) 2 , c 3 = c 2 / 2 c_1=(k_1L)^2 ,c_2=(k_2L)^2,c_3=c_2/2 c1=(k1L)2,c2=(k2L)2,c3=c2/2, L L L是像素值的动态范围 2 B − 1 2^B-1 2B1,默认值: k 1 = 0.01 , k 2 = 0.03 k_1=0.01,k_2=0.03 k1=0.01,k2=0.03

然而,上面的 SSIM 不能用于一整幅图。因为在整幅图的跨度上,均值和方差往往变化剧烈;同时图像上不同区块的失真程度也有可能不同,不能一概而论;此外类比人眼睛每次只能聚焦于一处的特点,作者采用 sliding window 以步长为 1 计算两幅图各个对应 sliding window 下的 patch 的 SSIM,然后取平均值作为两幅图整体的 SSIM,称为 Mean SSIM,简写为 M-SSIM。代码中,计算每个 patch 的均值和方差时,作者采用了方差为 1.5 的高斯卷积核作加权平均,滑窗大小为 11*11 ,如果整幅图有 M 个 patch,那么 Mean-SSIM 公式为:
M e a n − S S I M = 1 M ∑ m M S S I M ( x p a t c h , y p a t c h ) Mean-SSIM=\frac{1}{M}\sum_m^MSSIM(x_{patch},y_{patch}) MeanSSIM=M1mMSSIM(xpatch,ypatch)

MS-SSIM (Multi Scale Structural Similarity Index Measure,多尺度结构相似性)

MS-SSIM(多尺度结构相似性指数)是SSIM(结构相似性指数)的扩展版本,用于评估图像质量。它通过多个尺度来捕捉图像的结构信息,从而更全面地评估图像相似度。MS-SSIM的公式如下:

MS-SSIM ( x , y ) = [ l M ( x , y ) ] α M ⋅ ∏ j = 1 M [ c j ( x , y ) ] β j ⋅ [ s j ( x , y ) ] γ j \text{MS-SSIM}(x, y) = [l_M(x, y)]^{\alpha_M} \cdot \prod_{j=1}^{M} [c_j(x, y)]^{\beta_j} \cdot [s_j(x, y)]^{\gamma_j} MS-SSIM(x,y)=[lM(x,y)]αMj=1M[cj(x,y)]βj[sj(x,y)]γj

其中:

  • x x x y y y 分别是待比较的两幅图像。
  • $ M $ 是尺度的总数。
  • l M ( x , y ) l_M(x, y) lM(x,y) 是在第 M 个尺度上的亮度比较。
  • c j ( x , y ) c_j(x, y) cj(x,y)是在第 j 个尺度上的对比度比较。
  • s j ( x , y ) s_j(x, y) sj(x,y) 是在第 j 个尺度上的结构比较。
  • α M \alpha_M αM, β j \beta_j βj, 和 γ j \gamma_j γj 是权重参数,用于调整各部分的贡献。

CSS (Contrast-Structure Similarity 对比结构相似度)

CSS是SSIM的一个变体,去除了SSIM中的亮度这一项,
C S S ( x , y ) = 2 σ x y + c σ x 2 + σ y 2 + c CSS(x,y)=\frac{2\sigma_{xy}+c}{\sigma_x^2+\sigma_y^2+c} CSS(x,y)=σx2+σy2+c2σxy+c

MAE

图像相似度计算中,MAE(Mean Absolute Error,平均绝对误差)是一种常用的指标,用于衡量两幅图像之间的差异。MAE 的计算公式如下:

MAE = 1 H W ∑ i = 0 H − 1 ∑ i = 0 W − 1 ∣ x i , j − y i , j ∣ \text{MAE} = \frac{1}{HW} \sum_{i=0}^{H-1} \sum_{i=0}^{W-1}|x_{i,j} - y_{i,j}| MAE=HW1i=0H1i=0W1xi,jyi,j

FID

FID(Fréchet Inception Distance)是一种用于评估生成图像质量的指标,尤其在生成对抗网络(GAN)中广泛应用。它通过比较生成图像与真实图像的统计特征来衡量相似度。

FID = ∥ μ g − μ r ∥ 2 + Tr ( Σ g + Σ r − 2 ( Σ g Σ r ) 1 / 2 ) \text{FID} = \|\mu_g - \mu_r\|^2 + \text{Tr}(\Sigma_g + \Sigma_r - 2(\Sigma_g \Sigma_r)^{1/2}) FID=μgμr2+Tr(Σg+Σr2(ΣgΣr)1/2)

  • 其中, ∥ μ g − μ r ∥ 2 \|\mu_g - \mu_r\|^2 μgμr2是均值差的平方, Tr \text{Tr} Tr 是矩阵的迹。

补充协方差

两张图像的协方差公式用于衡量它们之间的线性关系。对于图像 x x x y y y,假设它们的大小均为 H × W H \times W H×W,协方差公式如下:

σ ( x , y ) = 1 H W ∑ i = 0 H − 1 ∑ j = 0 W − 1 ( x i j − μ x ) ( y i j − μ y ) \sigma(x, y) = \frac{1}{HW} \sum_{i=0}^{H-1} \sum_{j=0}^{W-1} (x_{ij} - \mu_x)(y_{ij}- \mu_y) σ(x,y)=HW1i=0H1j=0W1(xijμx)(yijμy)

其中: x ( i , j ) x(i,j) x(i,j) y ( i , j ) y(i,j) y(i,j)分别是图像 x x x y y y在像素点 ( i , j ) (i,j) (i,j)处的灰度值。 μ x \mu_x μx μ y \mu_y μy分别是图像 x x x y y y的均值,计算公式为:
μ x = 1 H W ∑ i = 0 H − 1 ∑ j = 0 W − 1 x i j , μ y = 1 H W ∑ i = 0 H − 1 ∑ j = 0 W − 1 y i j \mu_x = \frac{1}{HW} \sum_{i=0}^{H-1} \sum_{j=0}^{W-1} x_{ij}, \quad \mu_y = \frac{1}{HW} \sum_{i=0}^{H-1} \sum_{j=0}^{W-1} y_{ij} μx=HW1i=0H1j=0W1xij,μy=HW1i=0H1j=0W1yij
协方差为正表示两图像变化趋势一致,为负则表示变化趋势相反,接近零则表明两者无明显线性关系。

参考文献

https://zhuanlan.zhihu.com/p/661510928
https://blog.youkuaiyun.com/sinat_29957455/article/details/125119550
https://zhuanlan.zhihu.com/p/622244511
代码实现SSIM,MS-SSIM,

### 深度学习中的图像相似度计算 #### 卷积神经网络(CNNs)用于图像补丁对比的学习 卷积神经网络被广泛应用于图像相似度的评估之中。通过特定架构设计,CNN能够有效地捕捉到图像内部复杂的模式与结构信息,从而实现对于不同图像之间细微差异的有效识别[^1]。 ```python import torch.nn as nn class SiameseNetwork(nn.Module): def __init__(self): super(SiameseNetwork, self).__init__() # 定义基础网络层... def forward_once(self, x): output = ... return output def forward(self, input1, input2): output1 = self.forward_once(input1) output2 = self.forward_once(input2) return output1, output2 ``` 此部分展示了如何构建一个简单的孪生网络来比较两个输入图像间的特征表示向量距离,进而判断两者的相似程度。 #### 利用预训练模型(VGG16)进行高效迁移学习 为了简化开发流程并提高效率,在实际项目中可以考虑采用已经过大规模数据集充分训练过的经典深度视觉模型作为基底来进行微调或直接利用其高层语义特征完成任务目标。例如VGG16就是一个很好的选择,它不仅拥有出色的性能表现而且易于操作部署[^2]。 ```python from keras.applications.vgg16 import VGG16 from keras.preprocessing import image from keras.applications.vgg16 import preprocess_input import numpy as np model = VGG16(weights='imagenet', include_top=False) def get_image_embedding(img_path): img = image.load_img(img_path, target_size=(224, 224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = preprocess_input(x) features = model.predict(x).flatten() return features ``` 上述代码片段说明了怎样借助于Keras框架快速加载VGG16权重文件,并编写辅助函数获取任意给定图片对应的固定长度特征描述子以便后续处理分析。 #### 基于感知损失(LPIPS)改进传统度量方式 除了传统的欧氏空间内核映射外,研究者们还提出了更加贴近人类主观感受的新颖评价指标—LPIPS( Learned Perceptual Image Patch Similarity )。该方法试图模拟人眼视知觉机制下的质量评判标准,使得计算机生成的结果更符合真实世界应用场景需求[^3]。 ```python from lpips import LPIPS loss_fn_alex = LPIPS(net='alex') img0 = ... # (N,C,H,W) ndarray or Variable with values normalized to [-1,1] img1 = ... distances = loss_fn_alex(img0, img1) print('Distance:', distances.item()) ``` 这段Python脚本示范了使用PyTorch版lpips包轻松集成至现有工作流当中,方便快捷地测量两张或多张测试样本间直观上的接近性大小。 #### SIMGNN算法针对图结构化对象匹配优化探索 当面对复杂关联关系的数据集合时,则可能需要用到专门面向此类问题定制化的解决方案——比如SIMGNN就是这样一种旨在解决图形数据库检索难题的技术方案之一。这类技术通常涉及到对个体单元属性编码以及整体拓扑布局建模等多个层面考量因素综合权衡取舍过程[^4]。 ```python # 这里仅提供概念示意而非具体实现细节 graph_data = load_graph_dataset() node_features, adjacency_matrix = extract_structure_info(graph_data) gnn_model = GraphNeuralNetwork(...) similarity_scores = gnn_model(node_features, adjacency_matrix) ``` 以上就是有关几种主流深度学习驱动下图像/图形相似性判定策略介绍及其对应编程实践指南概览。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满船清梦压星河QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值