前言
今天在清理手机内存的时候,发现图库内的数据占用内存较大,在清理图像内存的时候发现这个功能挺好用的,总计起来有如下特点:
- 能够搜索所有的图像数据
- 能够对搜到到的图像找到相似的图像
- 对找到相似的图像进行分组
思路构建
分析上述功能需求可以用以下两种思路进行构建删除重复图像功能:
- 使用聚类,对所有图像进行聚类,根据聚类结果进行剔重(类别数不易算,整体耗时长);
- 使用基准图像进行对全部图像进行查找相似性。
在这里简单实现一下根据原图像进行查找相似的图像(这个里面的相似还有一层含义就是相同,道理同 相似三角形也是全等三角形)
示意图:
项目搭建
在这里我例举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))
结束语
在这里给大家带来手机文件管理系统中删除重复图像功能点的核心部分,如有讲述不周到之处还望各路大神指点一二。
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情