伪原创相似度查询工具(之相似度计算融合算法的原理及核心算法介绍)
优采云 发布时间: 2021-10-17 15:02伪原创相似度查询工具(之相似度计算融合算法的原理及核心算法介绍)
核心算法:
一、分别自定义三种计算图像相似度的算法
1)计算图像相似度算法ORB算法
优势:
ORB 功能具有以下优点:
1、特征提取速度快;
2、 大多数情况下,去重效果可以等于SIFT/SURF;
3、 提取的特征直接采用二进制编码的形式,可以直接使用汉明距离快速计算相似度,无需使用hash学习方法。
参考【python图像相似度】OpenCV图像相似度ORB算法-相似图像去重
2)本地敏感哈希phash算法
参考:文档相似度(3)--局部敏感哈希算法分析很透彻
3)传统直方图计算相似度算法
参考:图像处理中相似图片的识别(直方图应用)
2、 将融合相似度阈值定义为 0.70。如果三种算法计算出的最大相似度大于等于0.70,则取最大值作为融合算法后的相似度。
否则,取三种算法计算出的最小相似度作为融合算法的后续相似度。
3、定义最终相似度较高的判断阈值为0.95。如果融合后的相似度值达到0.95,则认为图片非常相似。
4、具有相似图片的图片被复制到一个文件夹中。
下面是具体的实现
函数文件 image_similarity_function.py
# -*- encoding=utf-8 -*-
# 导入包
import cv2
from functools import reduce
from PIL import Image
# 计算两个图片相似度函数ORB算法
def ORB_img_similarity(img1_path,img2_path):
"""
:param img1_path: 图片1路径
:param img2_path: 图片2路径
:return: 图片相似度
"""
try:
# 读取图片
img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)
# 初始化ORB检测器
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
# 提取并计算特征点
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
# knn筛选结果
matches = bf.knnMatch(des1, trainDescriptors=des2, k=2)
# 查看最大匹配点数目
good = [m for (m, n) in matches if m.distance < 0.75 * n.distance]
similary = len(good) / len(matches)
return similary
except:
return '0'
# 计算图片的局部哈希值--pHash
def phash(img):
"""
:param img: 图片
:return: 返回图片的局部hash值
"""
img = img.resize((8, 8), Image.ANTIALIAS).convert('L')
avg = reduce(lambda x, y: x + y, img.getdata()) / 64.
hash_value=reduce(lambda x, y: x | (y[1] threshold1:
result=max_three_similarity
else:
result=min_three_similarity
return round(result,3)
if __name__ == '__main__':
# 搜索文件夹
filepath = 'D:/test/'
# 相似图片存放路径
newfilepath = 'F:/same_pic_new/'
for parent, dirnames, filenames in os.walk(filepath):
for srcfilename in filenames:
img1_path = filepath + srcfilename
for parent, dirnames, filenames in os.walk(filepath):
for filename in filenames:
# 全量的比对效率差,所以形成图片时在名称上做了标记,下划线后面相同的进行比对
name1 = srcfilename.split('_')[1]
# 第二张照片对应的标记
name2 = filename.split('_')[1]
img2_path = filepath + filename
# 取两张照片是否是同名
if name1 == name2 :
# 相同非同一张图片的则比较
if img1_path != img2_path:
kk = calc_image_similarity(img1_path, img2_path)
try:
if kk >= threshold2:
# 将两张照片同时拷贝到指定目录(存在冗余操作,待优化)
shutil.copy(img1_path, newfilepath)
shutil.copy(img2_path, newfilepath)
except Exception as e:
# print(e)
pass
上述函数可以实现对指定文件夹中所有具有相同标记的照片进行相似度比较,并将比较结果输出到指定路径。
初图对比还有很多不足,还望大神指教!
感谢以下博主文章:
【Python按图片搜索图片】三种图片相似度计算融合算法
原文链接:
参考:图像处理中相似图片的识别(直方图应用)
参考:文档相似度(3)--局部敏感哈希算法分析很透彻
参考【python图像相似度】OpenCV图像相似度ORB算法-相似图像去重