使用色差比较图像

时间:2013-07-09 16:16:07

标签: java database image-processing

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

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

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

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

  1. 卡片的扫描图像和卡片的原始图像很可能会有不同的尺寸(宽度和高度)。
  2. 我需要尽可能提高效率。我打算一次使用它来扫描/识别数百张卡片。我认为找到(并存储)每个图像的单个平均颜色值比比较数据库中每个图像的各个像素(数据库有超过10,000个图像)对于需要识别的每个扫描卡要有效得多。我之所以问这个问题的原因是为了看看是否有人试图比较之前的平均颜色值作为图像识别的手段。由于色值精度和准确度都存在问题,我觉得它可能无法实现。
  3. 更新2: 这是我想象的一个例子。

    要识别的图像= A

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

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

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

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

    当然,测试图像不会与任何图像完全匹配,因为它会被扫描;但是,我正在努力寻找最接近的匹配。

4 个答案:

答案 0 :(得分:2)

基于内容的图像检索(CBIR)可以帮助您。有LIRE,一个java库。您甚至可以首先尝试使用不同颜色的图像功能和演示的几种方法。有关下载内容,请参阅https://code.google.com/p/lire/&资源。还有“简单应用程序”,它可以让您开始快速编制索引和搜索。

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

答案 1 :(得分:2)

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

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

您可以使用Catalano Framework,

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);

答案 2 :(得分:0)

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

  

enter image description here

     

enter image description here

     

enter image description here

     

enter image description here

     

enter image description here

答案 3 :(得分:0)

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

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

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

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

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