2

我试图找出一种比较两个图像颜色的好方法。我的一个想法是取两张图像的平均颜色并减去该数量以获得“颜色距离”。无论哪两个图像具有最小的颜色距离,都将是匹配的。这似乎是从图像数据库中识别图像的可行选择吗?

理想情况下,我想用它来识别通过图像扫描仪放置的扑克牌。

例如,如果我要将这张卡的真实版本扫描到我的计算机上,我希望能够将其与我数据库中的所有图像进行比较,以找到最接近的一张。

更新: 我忘了提及我的具体问题所涉及的挑战。

  1. 卡片的扫描图像和卡片的原始图像很可能是不同的尺寸(在宽度和高度方面)。
  2. 我需要让它尽可能高效。我计划使用它一次扫描/识别数百张卡片。我认为为每张图像查找(并存储)单个平均颜色值比比较数据库中每张图像的单个像素(数据库中有超过 10,000 张图像)需要识别的每张扫描卡要高效得多. 我问这个问题的原因是看看是否有人尝试比较平均颜色值作为图像识别的一种手段。由于色值精度和准确性的问题,我感觉它可能无法像我想象的那样工作。

更新 2: 这是我所设想的一个例子。

要识别的图像 = A

数据库中的图像 = { D 1 , D 2 }

图像 A 的平均颜色 = avg(A) = #8ba489

数据库中图像的平均颜色 = { #58727a, #8ba489 }

D 2与图像 A 匹配,因为 #8ba489 - #8ba489 小于 #8ba489 - #58727a。

当然,测试图像不会与这些图像中的任何一个完全匹配,因为它会被扫描进来;但是,我正在尝试找到最接近的匹配项。

4

4 回答 4

2

如果你想像这样检查色差:

http://en.wikipedia.org/wiki/Color_difference

您可以使用 Catalano 框架,

http://code.google.com/p/catalano-framework/

它适用于 Java 和 Android。

使用色差的示例:

float[] lab = ColorConverter.RGBtoLAB(100, 120, 150, ColorConverter.CIE2_D65);
float[] lab2 = ColorConverter.RGBtoLAB(50, 80, 140, ColorConverter.CIE2_D65);

double diff = ColorDifference.DeltaC(lab, lab2);
于 2013-07-11T15:10:40.110 回答
2

基于内容的图像检索 (CBIR) 可以为您解决问题。有 LIRE,一个用于此的 java 库。您甚至可以在演示中首先尝试使用不同颜色的图像特征的几种方法。有关下载和来源,请参阅https://code.google.com/p/lire/。还有一个“简单的应用程序”可以让你快速开始索引和搜索。

根据我的经验,我建议使用 ColorLayout 功能(如果图像未旋转)、OpponentHistogram 或 AutoColorCorrelogram。CEDD 功能也可能会产生良好的效果,它是最小的,每张图像大约 60 字节的数据。

于 2013-07-10T12:53:55.337 回答
0

我认为您的想法不足以完成任务。您的方法会说下面的所有图像都是相同的(所有图像的平均颜色为 128)。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

于 2013-07-09T16:42:43.120 回答
0

正如@Heejin 已经解释的那样,您的颜色平均方法很可能会失败。

你可以尝试不同的方式。将所有图像缩小到任意大小,然后从所有已知图像中减去未知图像,差异最小的就是您要查找的图像。这是非常简单的方法,它不会比平均速度慢。

另一种选择是使用一些更智能的算法:

http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html

我过去使用过这种方法,结果还可以。Ir 非常适合查找相同的图像,但不太适合查找相似的图像。

于 2013-07-10T06:03:43.313 回答