图片相似度

  1. 1.哈希算法
  2. 2.均方差

1.哈希算法

    # 感知哈希算法(Perceptual Hashing),它将图像转换为一系列数字特征,然后比较这些特征的差异来判断相似性
    # 我们使用PIL库打开并调整图像大小为8x8像素,并将其转换为灰度图像。然后,我们使用imagehash模块计算图像的感知哈希值。
    # 感知哈希算法将图像转换为一串二进制数字,表示图像的特征。接下来,我们计算两个图像的汉明距离,即感知哈希值之间的差异。
    # 汉明距离是指两个等长字符串之间对应位置上不同字符的个数。我们通过归一化差异值来得到相似度,数值越接近1表示越相似。

    # *_*coding:utf-8
    from PIL import Image
    import imagehash
    
    def calculate_similarity(image1_path, image2_path):
        # 打开并调整图像大小
        img1 = Image.open(image1_path).resize((8, 8)).convert('L')
        img2 = Image.open(image2_path).resize((8, 8)).convert('L')
    
        # 计算感知哈希值
        hash1 = imagehash.average_hash(img1)
        hash2 = imagehash.average_hash(img2)
    
        # 计算汉明距离(Hamming distance)
        similarity = 1 - (hash1 - hash2) / len(hash1.hash) ** 2
        return similarity
    
    # 比较两张图片的相似度
    image1_path = './img/1.jpg'
    image2_path = './img/2.jpg'
    similarity = calculate_similarity(image1_path, image2_path)
    
    # 设置相似度阈值判断是否相似
    threshold = 0.9  # 自定义阈值,根据需求调整,数值越接近1表示越相似。
    print(similarity)
    if similarity > threshold:
        print("图片相似")
    else:
        print("图片不相似")

2.均方差

    # 我们使用PIL库打开并调整图像大小为相同尺寸(256x256像素),然后将图像转换为RGB模式。
    # 接下来,我们将图像转换为像素列表,并使用均方差公式计算图像之间的差异。最后,我们可以根据设定的阈值来判断图像是否相似。
    # 阈值可以根据具体需求进行调整,较小的均方差值表示两张图片更相似。
    
    # *_*coding:utf-8
    from PIL import Image

    def calculate_mse(image1, image2):
        # 打开并调整图像大小为相同尺寸
        img1 = Image.open(image1).resize((256, 256)).convert('RGB')
        img2 = Image.open(image2).resize((256, 256)).convert('RGB')
    
        # 转换图像为像素列表
        pixels1 = list(img1.getdata())
        pixels2 = list(img2.getdata())
    
        # 计算均方差
        mse = sum([(r1 - r2) ** 2 + (g1 - g2) ** 2 + (b1 - b2) ** 2 for ((r1, g1, b1), (r2, g2, b2)) in
                   zip(pixels1, pixels2)]) / len(pixels1)
        return mse
    
    # 比较两张图片的相似度
    image1_path = './img/1.jpg'
    image2_path = './img/2.jpg'
    mse = calculate_mse(image1_path, image2_path)
    
    # 设置阈值判断是否相似
    threshold = 100  # 自定义阈值,根据需求调整
    print(mse)
    # 均方误差 MSE的值越小表示两张图片越相似,值为0表示完全相同。
    if mse < threshold:
        print("图片相似")
    else:
        print("图片不相似")

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:图片相似度

本文作者:伟生

发布时间:2024-02-22, 22:18:23

最后更新:2024-02-22, 22:28:55

原始链接:http://yoursite.com/2024/02/22/basic_18_img/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏