由于欧氏距离,许多图像被错误地识别为相同

As a result of the Euclidean distance many images are mistakenly identified as identical

抱歉我的英语不好,我有一个包含照片散列的小型数据库, 当我尝试查找与以下相似的照片时:

为其计算了以下哈希值:“0f3f2764ecc482c2”,使用方法 average_hash()

imagehash.average_hash(Image.open(imagePath))

系统发现大量碰撞,以下是被识别为完全相同的照片示例:

我存储照片哈希的 table:

CREATE TABLE IF NOT EXISTS photos(id_photo BIGINT PRIMARY  KEY,  photo_hash TEXT,  FOREIGN KEY (id_photo) REFERENCES users (id));

添加哈希:

cur.execute('''INSERT INTO photos(id_photo, photo_hash) VALUES(%s, %s)''', id, str(result_image_recognition['photo_hash'])])

SQL 计算我的散列和存储的散列之间的欧氏距离的查询:

SELECT id_photo, BIT_COUNT(photo_hash ^ '0f3f2764ecc482c2') FROM photos;

照片table包含7889张照片,其中959张被本次查询错误判定为完全相同(欧氏距离为0)。大约一个星期我无法解决这个问题请有人帮助我。

在进行异或运算之前,您需要将十六进制字符串转换为整数

SELECT id_photo, BIT_COUNT(CONV(photo_hash, 16, 10) ^ CONV('0f3f2764ecc482c2', 16, 10)) FROM photos;

因为所有第一个字符不是1-9的字符串都被转换为0。

mysql> select 'abc' ^ 'def'; # -> 0
mysql> select CONV('abc', 16, 10) ^ CONV('def', 16, 10);  # -> 1875