判断两张图片是否完全一致

判断两张图片是否为完全相同的图片

  1. 批量判断尺寸 大小 图像展示内容体是否完全一致的图片
import os
import hashlib
from PIL import Image


def check_img_repeat(directory):
    """
    批量对图片进行重复性校验是检查一组图像中是否有相同或几乎相同的图像副本。
    一个简单的方法是计算图像文件的哈希值,并比较这些哈希以查找重复项。哈希值是根据文件内容计算得到的,所以即使文件名不同,相同内容的图像将具有相同的哈希值
    批量校验图片是否重复
    @return:
    """

    def file_hash(file_path):
        with open(file_path, "rb") as f:
            return hashlib.md5(f.read()).hexdigest()

    # 存储文件及文件路径的字典
    hashes = {}
    # 遍历给定目录下文件
    for file_name in os.listdir(directory):
        if file_name.endswith((".png", ".jpg", ".bmp")):
            file_path = os.path.join(directory, file_name)
            # 计算文件的hash值
            img_hash = file_hash(file_path)
            if img_hash in hashes:
                print(f"存在相同的照片:{img_hash}{file_path}")
            else:
                hashes[img_hash] = file_path
                print(f"图片-{file_path}-未重复")


check_img_repeat("XXXX")
  1. 若图像有轻微修改,如尺寸变化,裁剪或者质量差异,MD5哈希值会改变。要检测这类相似图像的重复性,就需要更为复杂的图像处理算法,常见的有感知哈希算法(如pHash)。
def check_img_repeat():
    """
    感知哈希算法(Perceptual Hashing Algorithm,简称pHash)能够生成图像的“指纹”,即使在图像质量变化、缩放或其他形式的处理后,只要内容不变,
    生成的指纹也会相似。这种算法常用于图像的相似性比较。
    @param directory:
    @return:
    """

    def dhash(img, hash_size=8):
        # 图像转成灰度图
        img = img.convert('L').resize(
            (hash_size + 1, hash_size),
            Image.ANTIALIAS,
        )
        # 图像转为数组
        pixels = np.array(img)
        # 比相邻元素
        diff = pixels[:, 1:] > pixels[:, :-1]
        # 基于比较结果创建哈希串
        return sum([2 ** i for (i, v) in enumerate(diff.flatten()) if v])

    # 比较两个图像哈希值的汉明距离,即不同位的数量
    def hamming_distance(hash1, hash2):
        return bin(hash1 ^ hash2).count('1')

    img_1 = Image.open("1.png")
    img_2 = Image.open("2.png")
    # 计算每张图片的dhash值
    hash1 = dhash(img_1)
    hash2 = dhash(img_2)
    distance = hamming_distance(hash1, hash2)
    # 根据汉明距离判断图片的相似性
    print(f"Hamming distance between the images: {distance}")
    if distance <= 5:
        print("Images are similar.")
    else:
        print("Images are not similar.")

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Enougme

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值