【问题标题】:Optimize performance for calculation of euclidean distance between two images优化计算两幅图像之间欧式距离的性能
【发布时间】:2016-01-15 18:48:44
【问题描述】:

我在 python 中实现了 k-nearest-neighbours 算法,以对来自 mnist 数据库的一些随机选取的图像进行分类。但是我发现我的距离函数非常慢:针对 10k 图像的训练集分析 10 幅测试图像大约需要 2 分钟。图像的分辨率为 28x28 像素。由于我是 python 新手,我觉得这可能会更快。该函数应该计算两个相同大小的灰度图像之间的欧式距离。

def calculateDistance(image1, image2):
    distance = 0
    for i in range(len(image1)):
        for j in range(len(image1)):
            distance += math.pow((image1[i][j]-image2[i][j]),2)
    distance = numpy.sqrt(distance)
    return distance

【问题讨论】:

标签: python algorithm image-processing matrix euclidean-distance


【解决方案1】:

1) 将两个图像之间的差异计算为一个临时变量,然后将该变量自身相乘(整数运算),而不是执行 Math.pow 浮点运算 2)如果你只是比较距离,例如找到距离最小的一对,不要在最后打扰sqrt'ing(这实际上不会加快速度,因为它不在循环中但仍然没有您需要的只是将结果用于相对比较)

【讨论】:

  • 我试过这个,但由于我不知道的某种原因,它导致分类不太成功。它也没有加快计算时间 - 花费了更多时间(大约 10 分钟)。
【解决方案2】:

如果您使用 numpy 数组来表示图像,则可以使用以下代码:

def calculateDistance(i1, i2):
    return numpy.sum((i1-i2)**2)

这应该快得多,因为它使用快速的 C 实现来完成繁重的工作。还可以考虑使用缓存来避免两次计算两个图像的差异。

【讨论】:

  • 是的!这给了我一个巨大的加速!现在需要大约 8 秒来对 10 个测试图像进​​行分类。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多