Среднеквадратичное различие между двумя изображениями с помощью Python и PIL

У меня должна быть функция как та, найденная здесь: 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]))

Попытка выполнить этот код приводит к следующей ошибке: TypeError: неподдерживаемый тип (типы) операнда для ** или голова (): 'NoneType' и 'интервал'. Это - вопрос с ним?

5
задан pythoncoder 23 June 2010 в 01:50
поделиться

2 ответа

Дикое предположение, но попробуйте это в своей последней строке и посмотрите, сработает ли это:

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

Я не совсем уверен, почему вы получите описываемую TypeError , но если вы используйте приведенную выше строку кода и продолжайте получать ее, происходит что-то серьезно странное.

2
ответ дан 14 December 2019 в 04:30
поделиться

Проблема в том, что создается гистограмма, которая не имеет значений (или действительно не имеет значений), где нет соответствующего значения пикселя.

Например, когда вы находите разницу между двумя изображениями, результирующее изображение не имеет пикселей, которые находятся, скажем, на расстоянии 43 единиц друг от друга, поэтому h[43] = None.

Позже вы пытаетесь получить доступ к количеству пикселей каждой яркости в диапазоне(256) и возвести его в квадрат, что приводит к путанице в том, что должно быть None**2.

Рассмотрите возможность замены range(256) на h.keys().

Кроме того, вы используете h для обозначения двух разных вещей, подумайте о том, чтобы изменить имя одной или, что еще лучше, обеих из них на осмысленные имена.

4
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: