赞
踩
大纲:目标跟踪基础:两张图片相似度算法-腾讯云开发者社区-腾讯云 (tencent.com)
[三维重建] [机器学习] 图片相似度_评价两张图片相似度或差异度的指标是-CSDN博客
- import numpy as np
-
- def 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)
缺点:只考虑了像素差异,没有考虑位置和形状。
- from PIL import Image
-
- from numpy import average, linalg, dot
-
-
-
-
-
- def get_thumbnail(image, size=(1200, 750), greyscale=False):
-
- image = image.resize(size, Image.ANTIALIAS)
-
- if greyscale:
-
- image = image.convert('L')
-
- return image
-
-
-
-
-
- def 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 = vectors
-
- a_norm, b_norm = norms
-
- res = dot(a / a_norm, b / b_norm)
-
- return res
-
-
-
-
-
- image1 = Image.open('1.jpg')
-
- image2 = Image.open('2.jpg')
-
- cosin = image_similarity_vectors_via_numpy(image1, image2)
-
-
-
- print(cosin)
详细步骤 + 代码 :图像相似度中的Hash算法 - Yumeka - 博客园 (cnblogs.com)
此算法是基于比较灰度图每个像素与平均值来实现的
一般步骤:
1.缩放图片,一般大小为8*8,64个像素值。
2.转化为灰度图
3.计算平均值:计算进行灰度处理后图片的所有像素点的平均值,直接用numpy中的mean()计算即可。
4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.
5.得到信息指纹:组合64个bit位,顺序随意保持一致性。
6.最后比对两张图片的指纹,获得汉明距离即可。
- #均值哈希算法
-
- def aHash(img):
-
- #缩放为8*8
-
- img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)
-
- #转换为灰度图
-
- gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
-
- #s为像素和初值为0,hash_str为hash值初值为''
-
- s=0
-
- hash_str=''
-
- #遍历累加求像素和
-
- for i in range(8):
-
- for j in range(8):
-
- s=s+gray[i,j]
-
- #求平均灰度
-
- avg=s/64
-
- #灰度大于平均值为1相反为0生成图片的hash值
-
- for i in range(8):
-
- for j in range(8):
-
- if gray[i,j]>avg:
-
- hash_str=hash_str+'1'
-
- else:
-
- hash_str=hash_str+'0'
-
- return hash_str
平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法
一般步骤:
1.缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
2.转化为灰度图
3.计算DCT:利用Opencv中提供的dct()方法,注意输入的图像必须是32位浮点型,所以先利用numpy中的float32进行转换
4.缩小DCT:DCT计算后的矩阵是32 * 32,保留左上角的8 * 8,这些代表的图片的最低频率
5.计算平均值:计算缩小DCT后的所有像素点的平均值。
6.进一步减小DCT:大于平均值记录为1,反之记录为0.
7.得到信息指纹:组合64个信息位,顺序随意保持一致性。
8.最后比对两张图片的指纹,获得汉明距离即可。
- import cv2
-
- import numpy as np
-
- from compiler.ast import flatten
-
- import sys
-
-
-
- def pHash(imgfile):
-
- """get image pHash value"""
-
- #加载并调整图片为32x32灰度图片
-
- img=cv2.imread(imgfile, 0)
-
- img=cv2.resize(img,(64,64),interpolation=cv2.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变成一维list
-
- img_list=flatten(vis1.tolist())
-
-
-
- #计算均值
-
- avg = sum(img_list)*1./len(img_list)
-
- avg_list = ['0' if i<avg else '1' for i in img_list]
-
-
-
- #得到哈希值
-
- return ''.join(['%x' % int(''.join(avg_list[x:x+4]),2) for x in range(0,32*32,4)])
-
-
-
- '''
- cv2.imread
- flags>0时表示以彩色方式读入图片
- flags=0时表示以灰度图方式读入图片
- flags<0时表示以图片的本来的格式读入图片
- interpolation - 插值方法。共有5种:
- 1)INTER_NEAREST - 最近邻插值法
- 2)INTER_LINEAR - 双线性插值法(默认)
- 3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
- 4)INTER_CUBIC - 基于4x4像素邻域的3次插值法
- 5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
- def dHash(img):
-
- #缩放8*8
-
- img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)
-
- #转换灰度图
-
- gray=cv2.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,j+1]:
-
- hash_str=hash_str+'1'
-
- else:
-
- hash_str=hash_str+'0'
-
- return hash_str
图像均值(ahash)哈希本质上是对像素(颜色)的比较
图像感知(phash)哈希由于做了离散余弦变换操作,本质上是对频率的比较
图像差异(dhash)哈希本质上是基于变化的感知,更关注图片的像素值的变化
直方图是描述一个图片中,颜色出现的次数(或频率)的一种统计图象,因为只关心某个像素值出现的次数,不关注像素值的位置,所以具有旋转、平移、缩放等不变性。且计算代价较小,只需要遍历整个图像就能得到。
直方图的横坐标为某个像素值,纵坐标为像素值在图片内出现的次数,如下图所示的图片矩阵中,像素值“1”出现了两次,所以该图片的直方图中,像素值“1”对应的纵坐标就该是2。
有时候为了避免图片分辨率造成的影响,(分辨率高的图像,像素个数肯定多,出现次数肯定多),会将出现次数除以图片的总像素个数,转化成出现概率。如上图中的图片矩阵的总像素个数是9,像素值“1”的出现次数是2,它的出现概率为 2 / 9。
直方图分为灰度直方图与RGB直方图
灰度直方图:对于灰度直方图,只需要维护一个长度为256的数组Gray[256],遍历图片矩阵,假设矩阵内某个位置的像素值为124,则Gray[124]++。
RGB直方图:如果每种原色都可以取256个值,那么整个颜色空间共有1600万种颜色(256的三次方)。针对这1600万种颜色比较直方图,计算量实在太大了,因此可以通过划分bin的方式进行简化。可以将0~255分成四个区:0~63为第0区,64~127为第1区,128~191为第2区,192~255为第3区。这意味着红绿蓝分别有4个区,总共可以构成64种组合(4的3次方)。再根据图片矩阵中某个位置的RGB值,决定直方图内哪个bin值加一。
直方图最终也可以表示成一个向量的形式,向量维数为直方图横坐标的个数,向量中的值为直方图纵坐标的值。A=(2,3,2,1,0,1)
opencv 简单的图片相似度匹配_opencv 图片相似度-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。