图像相似
图片相似度计算的几种方法
-
欧式距离[欧几里得距离(Euclidean Distance)]
-
欧氏距离是最常见的距离度量(用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大),衡量的是n维空间中两个点之间的实际距离。
-
A = ( a 1 , a 2 , . . . a n ) , B = ( b 1 , b 2 , . . . b n ) A=(a_1,a_2,...a_n),B=(b_1,b_2,...b_n) A=(a1,a2,...an),B=(b1,b2,...bn)
-
d ( A , B ) = [ ∑ ( a i − b i ) 2 ] ] ( i = 1 , 2 , . . . , n ) d(A,B)=\sqrt{[\sum(a_i-b_i)^2]]}(i=1,2,...,n) d(A,B)=[∑(ai−bi)2]](i=1,2,...,n)
-
#代码实现方法一 import math # 计算两点之间的距离 def eucliDist(A,B): return math.sqrt(sum([(a - b)**2 for (a,b) in zip(A,B)])) X = [1,2,3,4] Y = [0,1,2,3] print(eucliDist(X,Y)) #代码实现方法二 import numpy as np def eucliDist(A,B): return np.sqrt(sum(np.power((A - B), 2))) # return math.sqrt(sum([(a - b)**2 for (a,b) in zip(A,B)])) X = np.array([1,2,3,4]) Y = np.array([0,1,2,3]) print(eucliDist(X,Y))
-
-
余弦距离
-
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。两个向量越相似夹角越小,余弦值越接近1。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。
-
A = ( a 1 , a 2 , . . . a n ) , B = ( b 1 , b 2 , . . . b n ) A=(a_1,a_2,...a_n),B=(b_1,b_2,...b_n) A=(a1,a2,...an),B=(b1,b2,...bn)
-
cos θ = ∑ 1 n ( a i × b i ) ∑ 1 n a i 2 × ∑ 1 n b i 2 \cos\theta= \frac {\sum_1^n(a_i \times b_i)}{\sqrt{\sum_1^n a_i^2\times \sqrt{\sum_1^nb_i^2}}} cosθ=∑1nai2×∑1nbi2∑1n(ai×bi)
-
import numpy as np from scipy.spatial.distance import pdist x=np.random.random(10) y=np.random.random(10) # 代码实现方法一 dist1 = 1 - np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y)) # 代码实现方法二 dist2 = pdist(np.vstack([x,y]),'cosine') print('x',x) print('y',y) print('dist1',dist1) print('dist2',dist2)
-
-
汉明距离(效率高,计算速度快)
-
汉明距离表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。
-
向量相似度越高,对应的汉明距离越小。如10001001和10010001有2位不同。
-
#比较两张图片的相似度 from PIL import Image from functools import reduce import time # 计算Hash def phash(img): img = img.resize((8, 8), Image.ANTIALIAS).convert('L') avg = reduce(lambda x, y: x + y, img.getdata()) / 64. return reduce( lambda x, y: x | (y[1] << y[0]), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0 ) # 计算汉明距离 def hamming_distance(a, b): return bin(a ^ b).count('1') # 计算图片相似度 def is_imgs_similar(img1, img2): return True if hamming_distance(phash(img1), phash(img2)) <= 5 else False if __name__ == '__main__': img1_path = 'F:\\project_py\\my_study\\Image\\003.jpg' img2_path = "F:\\project_py\\my_study\\Image\\006.jpg" img1 = Image.open(img1_path) img2 = Image.open(img2_path) start_time =time.time() a = is_imgs_similar(img1, img2) end_time = time.time() print(a,end_time-start_time)
-
-
马氏距离
- 马氏距离(Mahalanobis Distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。有时也被称为马哈拉诺比斯距离。
- 它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。
- 传统方法对图片进行相似度检测
- 获取灰度像素的比较数组、获取两个图的汉明距离、通过汉明距离计算相似度,取值范围 [0.0, 1.0]
- 通过 所谓图形学当中的直方图的概念比较
- 将图片转为二进制码,比较像素
- 感知哈希算法(均值哈希算法)比较两图的相似性
- 深度学习的方法对对图片进行相似度检测