思路构建
分析上述功能需求可以用以下两种思路进行构建删除重复图像功能:
- 使用聚类,对所有图像进行聚类,根据聚类结果进行剔重(类别数不易算,整体耗时长);
- 使用基准图像进行对全部图像进行查找相似性。
在这里简单实现一下根据原图像进行查找相似的图像(这个里面的相似还有一层含义就是相同,道理同 相似三角形也是全等三角形)
示意图:
项目搭建
在这里我例举4类常见的比较相似图像的方法:
- 计算图像的欧几里得距离进行判断;
- 使用结构相似性度量(SSIM)进行判断;
- 计算两张图像的哈希值进行计算判断
- 图像的余弦相似性
欧几里得距离
import numpy as np from scipy.spatial import distance from PIL import Image image1 = Image.open("1.jpg") image2 = Image.open("2.jpg") value_image1 = np.array(image1).flatten() value_image2 = np.array(image2).flatten() value_euclidean = distance.euclidean(value_image1, value_image2) image1_value = np.array(image1) image2_value = np.array(image2) value_linalg = np.linalg.norm(image1_value - image2_value) 复制代码
SSIM
在2004年的一篇论文中指出使用SSIM计算给定的两图像之间的相似性是界定在 0-1之间的值
from SSIM_PIL import compare_ssim from PIL import Image image1 = Image.open("1.jpg") image2 = Image.open("2.jpg") value = compare_ssim(image1, image2, GPU=False) 复制代码
计算哈希值
哈希是大家的老朋友了,网上关于哈希值的计算也很多,在github上关于图像哈希值的计算例子和讲解也很多,大家可以参考网上其他大神关于图像哈希值的计算讲解,在这里我就只举例子平均哈希的计算。 比较两幅图像的步骤如下:
- 构造每个图像的哈希
- 计算汉明距离。零距离表示相同的图像。
import imagehash from PIL import Image image1 = Image.open("1.jpg") image2 = Image.open("2.jpg") hash1 = imagehash.average_hash(image1) hash2 = imagehash.average_hash(image2) value = hash1-hash2 复制代码
计算图像的余弦相似性
from torch import nn from PIL import Image from torchvision import transforms image1 = Image.open("1.jpg") image2 = Image.open("2.jpg") image1_tensor = transforms.ToTensor()(image1).reshape(1, -1).squeeze() image2_tensor = transforms.ToTensor()(image2).reshape(1, -1).squeeze() cos = nn.CosineSimilarity(dim=0) value = float(cos(image1_tensor, image2_tensor))