我正在尝试使用Python 2.6和PIL 计算两个图像的相似度(读取:Levenshtein距离).
我计划用python-levenshtein库进行快速比较.
主要问题:
比较图像的好策略是什么?我的想法是这样的:
当然,这不会处理镜像图像,裁剪图像等情况.但是对于基本比较,这应该是有用的.
在某处记录了更好的策略吗?
编辑: Aaron H对速度问题是正确的.对于大于几百乘几百像素的图像,计算Levelshtein需要永远.但是,在我的示例中缩小到100x100和200x200之后的结果之间的差异小于1%,因此将最大图像大小设置为~100px左右可能是明智的...
编辑:感谢PreludeAndFugue,这个问题就是我想要的.
顺便说一句,Levenshtein的距离似乎可以优化,但它给了我一些非常糟糕的结果,也许是因为背景中有很多冗余元素.要看一些其他算法.
EIDT:均方根偏差和峰值信噪比似乎是另外两个选项,不是很难实现,看起来不是很昂贵.但是,似乎我需要某种上下文分析来识别形状等.
无论如何,感谢所有的链接,并指出朝向NumPy/SciPy的方向.
所以我有一个图像让我们说small.png和一个更大的图像big.png.小图像在较大的图像中出现2次,我希望找到它的位置.
我尝试使用numpy和Image但是出错了
'JpegImageFile' object has no attribute '__getitem__'我之前有png格式,它给出了同样的错误.
是否有任何其他模块或方法来完成这一点.我对任何人开放.
现在抛出错误的代码是
import numpy
from PIL import Image
here = Image.open(r"/Users/vks/Desktop/heren.jpg")
big = Image.open(r"/Users/vks/Desktop/Settingsn.jpg")
print here,big
herear = numpy.asarray(here)
bigar = numpy.asarray(big)
herearx = herear.shape[0]
hereary = herear.shape[1]
bigarx = bigar.shape[0]
bigary = bigar.shape[1]
print herearx , hereary , bigarx, bigary
stopx = bigarx - herearx + 1
stopy = bigary - hereary + 1
for x in range(0, stopx):
for y in range(0, stopy): …Run Code Online (Sandbox Code Playgroud) 我不知道如何扩展二维数组.鉴于下面的数组,其尺寸为8x10,说我需要将其缩放到5x6 - 我在维基百科上寻找了具体的例子,但是在矩阵数学中没有多少基础我有点迷失.如果有人能指出我正确的方向,我真的很感激!
[
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, …Run Code Online (Sandbox Code Playgroud) 我想将PIL图像转换为numpy数组.Numpy的asarray功能只是将图像放在一个0维数组中.
(Pdb) p img
<PIL.Image._ImageCrop image mode=RGB size=1024x0 at 0x106953560>
(Pdb) img.getdata()
<ImagingCore object at 0x104c97b10>
(Pdb) np.asarray(img.getdata())
array([], dtype=float64)
(Pdb) np.asarray(img)
array(<PIL.Image._ImageCrop image mode=RGB size=1024x0 at 0x106953560>, dtype=object)
(Pdb) np.asarray(img).shape
()
(Pdb) np.asarray(img, np.uint8)
*** SystemError: error return without exception set
Run Code Online (Sandbox Code Playgroud)
关于类似SO问题的解决方案不起作用.