如何判断两张图片的相似度

dfelf项目中,猜测是poppler的底层原因,导致PDF转图片时,会存在不同OS下,输出的图片不能通过checksum进行大小比较确保一致性。

所以只能通过其他方法来看看两张图片的相似度,如果相似度高(即差异度在容忍的范围内),则认为两张图片是一样的。

相似度度量指标有好多,python下有人实现了各种度量指标,项目名为sewar;该项目当前已实现的度量指标如下:

  • Mean Squared Error (MSE)
  • Root Mean Squared Error (RMSE)
  • Peak Signal-to-Noise Ratio (PSNR, ieee)
  • Structural Similarity Index (SSIM, ieee)
  • Universal Quality Image Index (UQI, ieee)
  • Multi-scale Structural Similarity Index (MS-SSIM, ieee)
  • Erreur Relative Globale Adimensionnelle de Synthèse (ERGAS)
  • Spatial Correlation Coefficient (SCC)
  • Relative Average Spectral Error (RASE)
  • Spectral Angle Mapper (SAM)
  • Visual Information Fidelity (VIF)
  • Block Sensitive - Peak Signal-to-Noise Ratio (PSNR-B)

考量了下,貌似MSESSIM比较常用,所以项目中就用了这两个度量指标。

因为$ RMSE = \sqrt{MSE} $,所以就不考RMSE了。

因为MSESSIM都比较好实现,我就没有用sewar了。

图片的数据为$ {x}\times{y} $的矩阵,每个点由(r, g, b)组成(这里先简化,忽略掉alpha),计算MSE,需要把

$$ MSE = \frac{1}{n}\sum_{i=1}^n{(Y_i-\hat{Y_i})^2} $$

调整为

$$ MSE = \frac{1}{x\times{y}}\sum_{i=0..x, j=0..y}{(P_{i,j}-\hat{P_{i,j}})^2} $$

SSIM的计算公式为:

$$ SSIM(x, y) = \frac{(2\mu_{x}\mu_{y}+c_{1})(2\sigma_{xy}+c_{2})}{(\mu_{x}^{2}+\mu_{y}^{2}+c_{1})(\sigma_{x}^{2}+\sigma_{y}^{2}+c_{2})} $$

SSIM我直接用skimage.metrics.structural_similarity,没有自己写了,懒~