平方差之和(SSD)(单位:numpy/scipy)

2024-09-20 07:41:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python和Numpy/Scipy来实现一个图像处理算法。profiler告诉我在下面的函数中花费了很多时间(经常调用),它告诉我两个图像之间的平方差之和

def ssd(A,B):
    s = 0
    for i in range(3):
        s += sum(pow(A[:,:,i] - B[:,:,i],2))
    return s

我怎样才能加快速度?谢谢。


Tags: 函数in图像numpy算法fordef时间
3条回答

我不明白你为什么要服用i in range(3)。这应该是整个阵列,还是只是一部分?

总的来说,您可以用在numpy中定义的操作替换大部分:

def ssd(A,B):
    squares = (A[:,:,:3] - B[:,:,:3]) ** 2
    return numpy.sum(squares)

这样,您可以执行一个操作而不是三个操作,并且使用numpy.sum可以比内置的sum更好地优化加法。

只是

s = numpy.sum((A[:,:,0:3]-B[:,:,0:3])**2)

(如果形状总是(,3),我希望它可能只是sum((A-B)**2)

也可以使用sum方法:((A-B)**2).sum()

对吧?

我不知道power 2的pow()函数是否会很快。尝试:

def ssd(A,B):
    s = 0
    for i in  range(3):
        s += sum((A[:,:,i] - B[:,:,i])*A[:,:,i] - B[:,:,i])
    return s

相关问题 更多 >