判断两张图片是否为完全相同的图片
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")
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.")