我正试图找出一种比较两种图像颜色的好方法。我的一个想法是获取两个图像的平均颜色并减去该数量以获得“颜色距离”。无论两个图像具有最小颜色距离都是匹配的。这似乎是从图像数据库中识别图像的可行选择吗?
理想情况下,我想用它来识别通过图像扫描仪的扑克牌。
例如,如果我要将this card的真实版本扫描到我的计算机上,我希望能够将其与我数据库中的所有图像进行比较,以找到最接近的图像。
更新 我忘了提到我的具体问题所涉及的挑战。
更新2: 这是我想象的一个例子。
要识别的图像= A
数据库中的图像= {D 1 ,D 2 }
图像的平均颜色A = avg(A)=#8ba489
数据库中图像的平均颜色= {#58727a,#8ba489}
D 2 与图像A匹配,因为#8ba489 - #8ba489小于#8ba489 - #58727a。
当然,测试图像不会与任何图像完全匹配,因为它会被扫描;但是,我正在努力寻找最接近的匹配。
答案 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)。
答案 3 :(得分:0)
你的色彩平均方法很可能会失败,正如@Heejin已经解释过的那样。
你可以用不同的方式尝试。将所有图像缩小到任意大小,然后从所有已知图像中减去未知图像,差异最小的图像是您要查找的图像。这是一种非常简单的方法,它不会比平均值慢。
另一种选择是使用一些更智能的算法:
http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
我过去使用过这种方法,结果还可以。 Ir非常适合寻找相同的图像,不太适合寻找siilar图像。