申请网站空间就是申请域名,工程信息网哪个好,wordpress xss,网站优化是什么意思大纲#xff1a;目标跟踪基础#xff1a;两张图片相似度算法-腾讯云开发者社区-腾讯云 (tencent.com)
目标跟踪基础#xff1a;两张图片相似度算法 (qq.com)
一、传统方法
1.欧式距离#xff08;用于判断是否完全相同#xff09;
[三维重建] [机器学习] 图…大纲目标跟踪基础两张图片相似度算法-腾讯云开发者社区-腾讯云 (tencent.com)
目标跟踪基础两张图片相似度算法 (qq.com)
一、传统方法
1.欧式距离用于判断是否完全相同
[三维重建] [机器学习] 图片相似度_评价两张图片相似度或差异度的指标是-CSDN博客 import numpy as npdef euclidean_distance(image1, image2):# 将图片展平为一维向量vector1 image1.flatten()vector2 image2.flatten()# 计算欧式距离distance np.linalg.norm(vector1 - vector2)return distance# 示例用法
image1 np.array([[1, 2, 3], [4, 5, 6]])
image2 np.array([[4, 5, 6], [7, 8, 9]])
distance euclidean_distance(image1, image2)
print(distance) 缺点只考虑了像素差异没有考虑位置和形状。 2.余弦相似度 from PIL import Imagefrom numpy import average, linalg, dotdef get_thumbnail(image, size(1200, 750), greyscaleFalse):image image.resize(size, Image.ANTIALIAS)if greyscale:image image.convert(L)return imagedef image_similarity_vectors_via_numpy(image1, image2):image1 get_thumbnail(image1)image2 get_thumbnail(image2)images [image1, image2]vectors []norms []for image in images:vector []for pixel_tuple in image.getdata():vector.append(average(pixel_tuple))vectors.append(vector)norms.append(linalg.norm(vector, 2))a, b vectorsa_norm, b_norm normsres dot(a / a_norm, b / b_norm)return resimage1 Image.open(1.jpg)image2 Image.open(2.jpg)cosin image_similarity_vectors_via_numpy(image1, image2)print(cosin) 3.哈希算法/汉明距离
详细步骤 代码 图像相似度中的Hash算法 - Yumeka - 博客园 (cnblogs.com) 1ahashAverage Hash均值哈希算法
此算法是基于比较灰度图每个像素与平均值来实现的
一般步骤
1.缩放图片一般大小为8*864个像素值。
2.转化为灰度图
3.计算平均值计算进行灰度处理后图片的所有像素点的平均值直接用numpy中的mean()计算即可。
4.比较像素灰度值遍历灰度图片每一个像素如果大于平均值记录为1否则为0.
5.得到信息指纹组合64个bit位顺序随意保持一致性。
6.最后比对两张图片的指纹获得汉明距离即可。 #均值哈希算法def aHash(img):#缩放为8*8imgcv2.resize(img,(8,8),interpolationcv2.INTER_CUBIC)#转换为灰度图graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#s为像素和初值为0hash_str为hash值初值为s0hash_str#遍历累加求像素和for i in range(8):for j in range(8):ssgray[i,j]#求平均灰度avgs/64#灰度大于平均值为1相反为0生成图片的hash值for i in range(8):for j in range(8):if gray[i,j]avg:hash_strhash_str1else:hash_strhash_str0 return hash_str
2phashPerceptual Hash感知哈希算法
平均哈希算法过于严格不够精确更适合搜索缩略图为了获得更精确的结果可以选择感知哈希算法它采用的是DCT离散余弦变换来降低频率的方法
一般步骤
1.缩小图片32 * 32是一个较好的大小这样方便DCT计算
2.转化为灰度图
3.计算DCT利用Opencv中提供的dct()方法注意输入的图像必须是32位浮点型所以先利用numpy中的float32进行转换
4.缩小DCTDCT计算后的矩阵是32 * 32保留左上角的8 * 8这些代表的图片的最低频率
5.计算平均值计算缩小DCT后的所有像素点的平均值。
6.进一步减小DCT大于平均值记录为1反之记录为0.
7.得到信息指纹组合64个信息位顺序随意保持一致性。
8.最后比对两张图片的指纹获得汉明距离即可。
import cv2import numpy as npfrom compiler.ast import flattenimport sysdef pHash(imgfile):get image pHash value#加载并调整图片为32x32灰度图片imgcv2.imread(imgfile, 0)imgcv2.resize(img,(64,64),interpolationcv2.INTER_CUBIC)#创建二维列表h, w img.shape[:2]vis0 np.zeros((h,w), np.float32)vis0[:h,:w] img #填充数据#二维Dct变换vis1 cv2.dct(cv2.dct(vis0))#cv.SaveImage(a.jpg,cv.fromarray(vis0)) #保存图片vis1.resize(32,32)#把二维list变成一维listimg_listflatten(vis1.tolist())#计算均值avg sum(img_list)*1./len(img_list)avg_list [0 if iavg else 1 for i in img_list]#得到哈希值return .join([%x % int(.join(avg_list[x:x4]),2) for x in range(0,32*32,4)])
cv2.imread
flags0时表示以彩色方式读入图片
flags0时表示以灰度图方式读入图片
flags0时表示以图片的本来的格式读入图片
interpolation - 插值方法。共有5种
INTER_NEAREST - 最近邻插值法
INTER_LINEAR - 双线性插值法默认
INTER_AREA - 基于局部像素的重采样resampling using pixel area relation。对于图像抽取image decimation来说这可能是一个更好的方法。但如果是放大图像时它和最近邻法的效果类似。
INTER_CUBIC - 基于4x4像素邻域的3次插值法
INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
3dhashDifference Hash差异哈希算法 def dHash(img):#缩放8*8imgcv2.resize(img,(9,8),interpolationcv2.INTER_CUBIC)#转换灰度图graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)hash_str#每行前一个像素大于后一个像素为1相反为0生成哈希for i in range(8):for j in range(8):if gray[i,j]gray[i,j1]:hash_strhash_str1else:hash_strhash_str0return hash_str
总结:
图像均值ahash哈希本质上是对像素颜色的比较 图像感知phash哈希由于做了离散余弦变换操作本质上是对频率的比较 图像差异dhash哈希本质上是基于变化的感知更关注图片的像素值的变化 4.直方图 巴氏系数
1直方图
直方图是描述一个图片中颜色出现的次数或频率的一种统计图象因为只关心某个像素值出现的次数不关注像素值的位置所以具有旋转、平移、缩放等不变性。且计算代价较小只需要遍历整个图像就能得到。
直方图的横坐标为某个像素值纵坐标为像素值在图片内出现的次数如下图所示的图片矩阵中像素值“1”出现了两次所以该图片的直方图中像素值“1”对应的纵坐标就该是2。 有时候为了避免图片分辨率造成的影响分辨率高的图像像素个数肯定多出现次数肯定多会将出现次数除以图片的总像素个数转化成出现概率。如上图中的图片矩阵的总像素个数是9像素值“1”的出现次数是2它的出现概率为 2 / 9。 直方图分为灰度直方图与RGB直方图
灰度直方图对于灰度直方图只需要维护一个长度为256的数组Gray[256]遍历图片矩阵假设矩阵内某个位置的像素值为124则Gray[124]。
RGB直方图如果每种原色都可以取256个值那么整个颜色空间共有1600万种颜色256的三次方。针对这1600万种颜色比较直方图计算量实在太大了因此可以通过划分bin的方式进行简化。可以将0255分成四个区063为第0区64127为第1区128191为第2区192255为第3区。这意味着红绿蓝分别有4个区总共可以构成64种组合4的3次方。再根据图片矩阵中某个位置的RGB值决定直方图内哪个bin值加一。
直方图最终也可以表示成一个向量的形式向量维数为直方图横坐标的个数向量中的值为直方图纵坐标的值。A(2,3,2,1,0,1)
2巴氏系数 5.特征结构 6.互信息 7. 均方误差MSE 8.SSIM结构相似性 9.特征匹配 10.传统方法总结代码
opencv 简单的图片相似度匹配_opencv 图片相似度-CSDN博客
图像相似算法最全总结_图片相似度-CSDN博客
二、深度学习方法
1.孪生神经网络
pytorch孪生网络识别面部相似度代码解读_f.pairwise_distance-CSDN博客 孪生网络图片相似度对比神器-CSDN博客