使用Python和PIL的两个图像之间的均方根差

pyt*_*der 5 python image-processing

我需要具有一个类似于此处的函数:http : //effbot.org/zone/pil-comparing-images.htm,该函数计算两个图像之间的均方根差。代码如下:

import ImageChops
import math, operator

def rmsdiff(im1, im2):
    "Calculate the root-mean-square difference between two images"

    h = ImageChops.difference(im1, im2).histogram()

    # calculate rms
    return math.sqrt(reduce(operator.add,
        map(lambda h, i: h*(i**2), h, range(256))
        ) / (float(im1.size[0]) * im1.size[1]))
Run Code Online (Sandbox Code Playgroud)

尝试运行此代码会导致以下错误:TypeError:**或pow()不支持的操作数类型:'NoneType'和'int'。就是这样吗?

Odd*_*ing 5

问题是它正在创建一个没有值(或实际上没有值)的直方图,其中没有相应的像素值。

即,当您找到两个图像的差异时,生成的图像没有任何相距 43 个单位的像素,因此 h[43] = None。

稍后,您尝试访问范围 (256) 中每个亮度的像素数,并将其平方,这导致它对 None**2 应该是什么感到困惑。

考虑更改range(256)h.keys().

此外,您使用 h 来表示两个不同的事物,请考虑将其中一个的名称更改为有意义的名称,或者更好的是,将它们都更改为有意义的名称。


Dav*_*d Z 2

这里大胆猜测,但在最后一行尝试一下,看看它是否有效:

return math.sqrt(sum(h*(i**2) for i, h in enumerate(h))) / (float(im1.size[0]) * im1.size[1]))
Run Code Online (Sandbox Code Playgroud)

我不确定为什么你会得到TypeError你所描述的,但如果你使用上面的代码行并继续得到它,就会发生一些非常奇怪的事情。