两帧图像相似

图像相似

图片相似度计算的几种方法

  1. 欧式距离[欧几里得距离(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)=[(aibi)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))
      
  2. 余弦距离

    • 余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。两个向量越相似夹角越小,余弦值越接近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)
      
  3. 汉明距离(效率高,计算速度快)

    • 汉明距离表示两个(相同长度)字对应位不同的数量,我们以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)
      

    参考博客

  4. 马氏距离

    • 马氏距离(Mahalanobis Distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。有时也被称为马哈拉诺比斯距离。
    • 它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。
  1. 传统方法对图片进行相似度检测
    1. 获取灰度像素的比较数组、获取两个图的汉明距离、通过汉明距离计算相似度,取值范围 [0.0, 1.0]
    2. 通过 所谓图形学当中的直方图的概念比较
    3. 将图片转为二进制码,比较像素
    4. 感知哈希算法(均值哈希算法)比较两图的相似性
  2. 深度学习的方法对对图片进行相似度检测

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小兮风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值