Java的图像比较技术

时间:2010-12-01 19:22:21

标签: java image-processing comparison fft

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

  1. 用户选择2张图片进行比较。
  2. 使用按钮,可以使用多种不同的方法比较图像。
  3. 最后,每个方法旁边都有一个百分比,表示图像基于该方法的相似程度。
  4. 我最近做了很多阅读,我读过的一些东西似乎非常复杂和先进,而不是像我这样只有大约一年的Java经验的人。到目前为止,我读过:

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

    • SIFT算法 - 似乎非常复杂

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

    • 像素抓取 - 似乎可行,但如果两张图片之间存在相当大的差异,那么它看起来不会产生任何类型的准确结果。我可能错了?

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

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

    提前致谢

2 个答案:

答案 0 :(得分:4)

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

您可以从this paper获得良好的概述。您可能要研究的另一个领域是content based image retrieval (CBIR)

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

答案 1 :(得分:1)

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

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