我正在考虑针对以下问题的快速算法。
给定目标图像G和两个图像A和B,确定A或B中哪一个与G更相似。注意图像A,B和G都是相同的维度。
更相似的是,我的意思是它看起来更像图像G。
算法的任何想法?我在Objective-C中这样做,并且能够扫描图像A,B和G中的每个像素。
我实现了以下内容:扫描每个像素,确定A到G和B到G的红色,绿色和蓝色值的绝对误差。误差较小的值更相似。它运作正常,但速度非常慢。
答案 0 :(得分:1)
不可能比X*Y
做得更好,其中X,Y是图像尺寸。因为你需要扫描输入的每个像素。
但是,您可以尝试的一种技术是扫描图像中的随机像素并找出差异。一旦您看到与A或B非常相似或不相似的图像,您就可以停止。
# X, Y are the dimensions
sim_A = 0
sim_B = 0
while( abs(sim_A - sim_B) > MAX_DISSIMILARITY):
rand_x = random(X)
rand_y = random(Y)
sim_A += dissimilar(img_G, img_A, rand_X, rand_Y)
sim_B += dissimilar(img_G, img_B, rand_X, rand_Y)
答案 1 :(得分:1)
您可以尝试使用SIFT算法(Scale Invariant Feature Transform)。正如您刚才提到的那样,您想要找到哪个图像与目标图像更相似,那么我想这是最好的算法。它基本上提取了图像的不变特征(不随发光强度,比例,透视等变化而变化的特征),然后创建这些特征向量。然后,您可以使用此特征向量将其与其他图像进行比较。您可以查看this和this以获取进一步的参考。 理想情况下,有计算机视觉库使事情变得更简单(我想在目标C中读取和写入图像可能很困难,没有任何计算机视觉库)。 OpenCV(开源计算机视觉库)最适合这些东西。它有许多内置功能来处理图像/视频的常见内容。 希望这会有所帮助:)
答案 2 :(得分:0)
我建议您查看OpenCV,它是一个图像处理库。我不认为它有Objective-C支持,但我认为这是一个比编写自己的算法更好的起点。通常最好不要重新发明轮子,除非你是为了个人练习。
答案 3 :(得分:0)
我发现最好的方法是做以下事情。
首先,反转图像上的所有像素,使其与图像相反。这是最不相似的形象。
然后,要将图像与目标图像进行比较,请计算它与最不相似图像的距离。如果它更远,它是一个更好的形象。