Как проверить сходство двух изображений с разной пикселизацией

Я использую код Python для проверки сходства фотографий профилей пользователей Quora и Twitter, но я не получаю положительного результата, когда изображения совпадают.

Это код для сравнения двух изображений:

path_photo_quora= "/home/yousuf/Desktop/quora_photo.jpg"
path_photo_twitter="/home/yousuf/Desktop/twitter_photo.jpeg"
if open(path_photo_quora,"rb").read() == open(path_photo_twitter,"rb").read():
     print('photos profile are identical')

несмотря на то, что изображения одинаковы, консоль не печатает «профиль фотографий идентичен», что я могу сделать?


person Youcef    schedule 10.10.2018    source источник
comment
Возможный дубликат Проверка изображений на сходство с OpenCV   -  person planetmaker    schedule 10.10.2018


Ответы (2)


Вы можете использовать библиотеку imagehash для сравнения похожих изображений.

from PIL import Image
import imagehash
hash0 = imagehash.average_hash(Image.open('quora_photo.jpg')) 
hash1 = imagehash.average_hash(Image.open('twitter_photo.jpeg')) 
cutoff = 5  # maximum bits that could be different between the hashes. 

if hash0 - hash1 < cutoff:
  print('images are similar')
else:
  print('images are not similar')

Поскольку изображения не совсем одинаковые, будут некоторые различия, поэтому мы используем значение отсечки с приемлемой максимальной разницей. Эта разница между хеш-объектами заключается в количестве перевернутых битов. Но imagehash будет работать, даже если изображения изменены, сжаты, имеют разные форматы файлов или с отрегулированным контрастом или цветами.

Хэш (или отпечаток пальца) получается из монохромной миниатюры изображения размером 8x8. Но даже при такой уменьшенной выборке сравнения по сходству дают достаточно точные результаты. Отрегулируйте отсечку, чтобы найти приемлемый баланс между ложными положительными и ложными отрицательными результатами.

Для 64-битных хэшей разница в 0 означает, что хэши идентичны. Разница в 32 означает, что сходства нет вообще. Разница в 64 означает, что один хеш является отрицательным значением другого.

person Håken Lid    schedule 10.10.2018
comment
Есть ли способ манипулировать этими изображениями онлайн, не загружая их? то есть предоставление URL-адреса изображения кода вместо локального пути? - person Youcef; 10.10.2018
comment
Не в самой библиотеке. Вы должны использовать что-то вроде requests для загрузки изображений через http. Это всего несколько строк кода. stackoverflow.com/a/32859290/1977847 - person Håken Lid; 10.10.2018
comment
я не хочу загружать изображения на свой локальный компьютер, потому что это займет слишком много места при работе с миллионами изображений - person Youcef; 10.10.2018
comment
Если вы используете код, на который я ссылаюсь, изображения будут обрабатываться только в памяти. Они не будут сохранены на вашем диске, если вы не сделаете это явно. - person Håken Lid; 10.10.2018
comment
@MDP, да. Потому что перед хешированием изображения изменяются до такого же крошечного размера. Обычно 8x8 пикселей. - person Håken Lid; 23.02.2019
comment
@HåkenLid Как вы определили пороговое значение? - person Life is complex; 06.08.2019
comment
@HåkenLid - я предполагал, что отсечка изменилась в зависимости от оцениваемых изображений. Я просто пытаюсь определить, будет ли 20 считаться высоким. - person Life is complex; 06.08.2019
comment
Если я правильно помню, ожидаемая разница между двумя случайно выбранными изображениями составляет примерно 32. Таким образом, отсечка в 20, вероятно, даст вам слишком много ложноположительных совпадений. - person Håken Lid; 07.08.2019
comment
Как можно интерпретировать отсечку? Означает ли 5, что 5% изображения похожи, или это следует интерпретировать как-то иначе? - person lepton; 17.02.2021
comment
Для хэша/отпечатка пальца/битовой карты размером 8x8 пикселей или 64 бита расстояние 5 означает, что 5 из 64 битов в двух хэшах различны. Вот статья, которая объясняет, как работают алгоритмы хеширования изображений, и включает примеры изображений. content-blockchain.org/research/ - person Håken Lid; 17.02.2021
comment
так что более высокое значение отсечки означает меньшую чувствительность? - person Earlee; 28.04.2021
comment
Ага. То, что я называю отсечкой, — это максимальное количество различных битов в хэшах. - person Håken Lid; 28.04.2021

Два изображения НЕ одинаковы - только то, что изображено. Изображения явно разного размера, как вы сами заметили. Таким образом, сравнение должно быть неудачным.

Вам нужно будет использовать какую-то проверку подобия. Первый шаг — увеличить меньшее изображение до большего. Затем вам нужно использовать некоторые средства обнаружения и определения сходства. Для этого есть разные способы и методы, и любая их комбинация может быть верной.

Например, см. Проверка изображений на сходство с OpenCV

person planetmaker    schedule 10.10.2018