#image #image-processing #comparison #ssim #metrics #distance #histogram

image-compare

基于 image crate 的图像比较库。目前它提供了灰度和 rgb 图像的 SSIM 和 RMS 比较功能,一个酷炫的混合比较以及几个灰度直方图距离度量。所有这些都具有友好的许可证。

17 个版本

0.4.1 2024 年 4 月 4 日
0.4.0 2024 年 3 月 21 日
0.3.1 2023 年 9 月 26 日
0.3.0 2023 年 5 月 31 日
0.2.3 2022 年 6 月 8 日

#81 in 图像

Download history 1608/week @ 2024-04-24 1127/week @ 2024-05-01 877/week @ 2024-05-08 1593/week @ 2024-05-15 1733/week @ 2024-05-22 1399/week @ 2024-05-29 1351/week @ 2024-06-05 1271/week @ 2024-06-12 2516/week @ 2024-06-19 2014/week @ 2024-06-26 1473/week @ 2024-07-03 1344/week @ 2024-07-10 1449/week @ 2024-07-17 2083/week @ 2024-07-24 2407/week @ 2024-07-31 2985/week @ 2024-08-07

9,302 每月下载量
用于 9 个 crates (7 直接)

MIT 许可证

52KB
1K SLoC

image-compare

Crates.io Documentation CI Coverage Status License

Rust 图像库中的图像比较

  • 所有功能都使用纯 CPU 和 rayon 多线程实现,看起来在现代处理器上表现良好。似乎既没有内存优化也没有SIMD能提供任何显著改进。

比较灰度图像

按结构

  • 按 RMS - 分数通过以下公式计算:$1-\sqrt{\frac{\sum_{x,y=0}^{x,y=w,h}\left(f(x,y)-g(x,y)\right)^2}{w*h}}$
  • 按 MSSIM
    • MSSIM 如下实现:维基百科: $\mathrm{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})}}$
    • MSSIM 通过使用 8x8 像素窗口进行 SSIM 并对结果进行平均来计算

按直方图

  • 实现了几个距离度量,请参阅 OpenCV 文档
  • 相关系数 $d(H_1,H_2) = \frac{\sum_I (H_1(I) - \bar{H_1}) (H_2(I) - \bar{H_2})}{\sqrt{\sum_I(H_1(I) - \bar{H_1})^2 \sum_I(H_2(I) - \bar{H_2})^2}}$
  • 卡方 $d(H_1,H_2) = \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)}$
  • 交集 $d(H_1,H_2) = \sum _I \min (H_1(I), H_2(I))$
  • Hellinger 距离 $d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\int{H_1} \int{H_2}}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}$

比较 RGB(A)

按结构:RMS,SSIM

  • RGB 类型图像被分割成 R,G 和 B 通道并分别处理。
  • 最差的颜色结果被传播为分数,但浮点型 RGB 图像提供了对所有值的访问。
  • 如 gherkin 测试所示,这个结果目前不值得,因为它需要更多的时间
  • 可以通过不仅传播单个颜色得分结果,而是使用每个像素的最差结果来改进。
  • 这种方法在混合模式下实现,见下文。

按结构:"混合比较"。

  • 根据T.871将图像分割到YUV色彩空间。
  • 使用MSSIM处理Y通道。
  • 通过RMS比较U和V通道。
  • 将差异重新组合成一个美观的可视化图像。
  • RGB得分计算如下:$\mathrm{score}=\mathrm{avg}_{x,y}\left( \mathrm{min}\left[\Delta \mathrm{MSSIM}(Y,x,y),\sqrt{(\Delta RMS(U,x,y))^2 + (\Delta RMS(V,x,y))^2}\right]\right)$
  • RGBA可以通过使用rgba_blended_hybrid_compare与指定的背景颜色预乘。
  • 否则,对于rgba_hybrid_compare,也使用MSSIM比较$\alpha$通道,并将其考虑在内。
  • 然后使用每个像素的平均$\alpha$,$\bar{\alpha}(x,y) = 1/2 (\alpha_1(x,y) + \alpha_2(x,y))$,作为线性加权因子。
  • RGBA得分计算如下:$\mathrm{score}=\mathrm{avg}_{x,y}\left(1/\bar{\alpha} \cdot \mathrm{min}\left[\Delta \mathrm{MSSIM}(Y,x,y),\sqrt{(\Delta RMS(U,x,y))^2 + (\Delta RMS(V,x,y))^2}, \Delta \mathrm{RMS}(\alpha,x,y)\right] \right)$
  • RGBA的边缘情况:$\mathrm{score} \in (0, 1)$,且如果$\bar{\alpha} = 0.0$,则$\mathrm{score} = 1.0$。
  • 这允许对RGB和RGBA的颜色差异和结构差异进行良好的分离。
  • 差异图像的解释
    • RGB:红色包含结构差异,绿色和蓝色包含颜色差异,颜色越多,差异越大。
    • RGBA:与RGB相同,但$\alpha$包含$\alpha$差异的倒数。如果某物非常半透明,$\alpha$差异很大,区分颜色和结构差异将变得困难。此外,最小$\alpha$被限制在0.1,因此您仍然可以看到所有变化。

更新日志:0.4.1

  • 支持混合比较大于4096x4096的图像(感谢@nikarh)

0.4.0:

  • 支持image-rs系列0.25

0.3.1:

  • 从image-rs中移除了额外的依赖项,使这个库更加精简(感谢@ericseppanen)

0.3.0:

  • 在0.2.x版本中发现了一个错误,混合RGB比较过度加权了颜色差异。测试中的数字已调整。
    • 对于大多数图像影响很小,但对于颜色过滤的图像影响明显,现在相似度更高。
  • 添加了两种RGBA比较方法。
  • 添加了GitHub内联latex方程式而不是嵌入图像 - 修复了暗主题渲染问题。
  • 使API更直观。

依赖项

~4MB
~77K SLoC