gpt4 book ai didi

python - PIL 图像的简单哈希

转载 作者:太空狗 更新时间:2023-10-30 02:53:23 24 4
gpt4 key购买 nike

背景

我想将 PIL 图像的信息存储在键值存储中。为此,我对图像进行哈希处理并将哈希用作 key 。

我尝试了什么

我一直在使用以下代码来计算哈希:

def hash(img):
return hashlib.md5(img.tobytes()).hexdigest()

不过好像不太稳定。我还没有弄清楚为什么,但是对于不同机器上的相同图像,我得到不同的哈希值。

问题

是否有一种简单的仅依赖于图像本身(而不是时间戳、系统架构等)的图像散列方法?

请注意,我不需要类似的图像来获得类似/相同的哈希值,如 image hashing .事实上,我希望不同的图像具有不同的哈希值,例如改变图像的亮度应该改变它的散列。

最佳答案

我猜你的目标是在 Python 中执行图像散列(这与经典散列有很大不同,因为图像的字节表示取决于格式、分辨率等)

图像哈希技术之一是平均哈希。请确保这不是 100% 准确,但在大多数情况下都可以正常工作。


首先我们通过减小图像的大小和颜色来简化图像,降低图像的复杂性极大地有助于其他图像之间比较的准确性:

减小尺寸:

img = img.resize((10, 10), Image.ANTIALIAS)

减少颜色:

img = img.convert("L")

然后,我们找到图像的平均像素值(这显然是平均散列的主要组成部分之一):

pixel_data = list(img.getdata())
avg_pixel = sum(pixel_data)/len(pixel_data)

最后计算哈希值,我们将图像中的每个像素与平均像素值进行比较。如果像素大于或等于平均像素,则我们得到 1,否则为 0。然后我们将这些位转换为 base 16 表示:

bits = "".join(['1' if (px >= avg_pixel) else '0' for px in pixel_data])
hex_representation = str(hex(int(bits, 2)))[2:][::-1].upper()

如果您想将此图像与其他图像进行比较,您可以执行上述操作,并找到平均散列图像的十六进制表示之间的相似性。您可以使用像 hamming distance 这样简单的东西或更复杂的算法,例如 Levenshtein distance , Ratcliff/Obershelp pattern recognition (序列匹配器),Cosine Similarity

关于python - PIL 图像的简单哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49689550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com