Гистограммы не являются хорошим способом сравнения изображений, например, в черно-белых изображениях, если они имеют одинаковое количество черных пикселей, гистограммы будут одинаковыми, независимо от распределения пикселей в изображении (поэтому изображения, которые вы упомянули, классифицируются как почти равные).
Существуют лучшие способы количественно оценить разницу между изображениями, в этом посте упоминает хороший вариант:
- Загрузить оба изображения в виде массивов (scipy.misc.imread) и вычислить поэлементную (попиксельная) разницу. Рассчитайте норму разности.
редактирование:
Отвечая на некоторые вопросы:
Я принимаю, что нулевая норма на пиксель будет равна значению 0,0-1,0, а значения, близкие к 0,0, означают «изображения одинаковы», верно?
Значения, близкие к 0,0, означают, что пиксели совпадают. Чтобы сравнить изображения в целом, нужно сложить все пиксели. Если итоговое значение близко к 0.0, это означает, что изображения почти одинаковы.
что если 2 размера изображения отличаются?
это хорошо. Для расчета разницы в нормах изображения должны иметь одинаковый размер. Я вижу два способа добиться этого:
первым будет изменение размера одного изображения до формы другого, проблема в том, что это может вызвать искажение изображения.
вторая будет заполнять меньшие изображения нулями, пока размеры не совпадут.
obs: при суммировании по пиксельной норме у вас будет значение от нуля до количества пикселей в изображении. Это может сбивать с толку, если вы сравниваете несколько изображений. Например, предположим, что вы сравниваете изображения A и B, и оба имеют форму 50x50 (следовательно, изображения имеют 2500 пикселей); значения, близкие к 2500, означают, что изображения совершенно разные. Теперь предположим, что вы сравниваете изображения C и D, и оба имеют форму 1000x1000, в этом случае такие значения, как 2500, означают, что изображения похожи. Чтобы преодолеть эту проблему, вы можете разделить попиксельную сумму на количество пикселей в изображении, это приведет к значению от 0,0 до 1,0, 0,0 означает, что изображения одинаковы, а 1,0 означает, что они совершенно разные.
да вот ошибка, которую я получил при сравнении 2 изображений с разным размером diff = image1 - image2 ValueError: operands could not be broadcast together with shapes (850,534) (663,650)
Это происходит потому, что изображения имеют разные формы. Изменение размера или заполнение могут избежать этой ошибки (как упомянуто выше).