Java的图像比较技术

我正在寻找几种方法来比较两个图像,看看它们有多相似。 目前我计划将百分比作为“相似性指数”的最终结果。 我的计划大纲是这样的:

  1. 用户选择2个图像进行比较。
  2. 使用按钮,可以使用多种不同的方法比较图像。
  3. 最后,每个方法旁边都有一个百分比,表示图像基于该方法的相似程度。

我最近做了很多阅读,我读过的一些东西似乎非常复杂和先进,而不是像我这样只有大约一年的Java经验的人。 到目前为止,我读过:

  • 傅立叶变换 – 我发现这在Java中实现相当混乱,但显然Java Advanced Imaging API有一个类。 虽然我不确定如何将输出转换为实际结果

  • SIFT算法 – 看起来非常复杂

  • 直方图 – 可能是迄今为止最简单的直方图

  • 像素抓取 – 似乎可行,但如果两个图像之间有相当大的变化,它看起来不会产生任何类型的准确结果。 我可能错了?

我还想先使用Sobel滤波器预处理图像,然后进行比较。 问题是实际的比较部分。

所以,是的,我想看看是否有人有想法比较Java中的图像。 希望以前有人在这里做过类似的项目。 我只想获得一些关于可行的比较技术的输入,这些技术在Java中难以实现。

提前致谢

  • 傅立叶变换 – 这可用于有效地计算互相关 ,这将告诉您如何对齐两个图像以及它们在最佳对齐时的相似程度。
  • 筛选描述符 – 这些可用于比较本地特征。 它们通常用于对应分析和对象识别。 (另见SURF )
  • 直方图 – 标准化的互相关通常可以在全局水平上比较图像时产生良好的结果。 但由于你只是在比较颜色分布,你最终可能会宣布一个有很多雪的室外场景,就像一个有很多白色壁纸的室内场景……
  • 像素抓取 – 不知道这是什么……

您可以从本文中获得一个很好的概述。 您可能要研究的另一个领域是基于内容的图像检索(CBIR) 。

很抱歉没有特定于Java。 HTH。

作为简单像素抓取的更好替代方案,请尝试SSIM 。 但是,它确实要求您的图像基本上来自同一角度的相同对象。 例如,如果您要比较使用不同算法压缩的图像(例如JPEG与JPEG2000),这将非常有用。 此外,这是一种相当简单的方法,您应该能够合理快速地实现以查看一些结果。

我不知道Java实现,但是有一个使用OpenCV的C ++实现 。 您可以尝试重新使用它(通过像javacv这样的东西 )或者从头开始编写它。 算法本身并不复杂,所以你应该能够直接实现它。