# -*- coding:utf-8 -*-
import sys
import math
import time
import string
from opencv.cv import *
from opencv.highgui import *
Hash_1 = [1, 3, 7, 8]
Hash_2 = [2, 6, 9, 14]
Hash_3 = [3, 5, 15, 21]
Hash_4 = [12, 17, 19, 23]
#对SIFT特征向量进行归一化处理
def Make_Norm(array):
total = 0
normalization = [0] * len(array)
for i in range(len(array)):
total += array[i] ** 2
total = total ** 0.5
if total != 0:
for i in range(len(array)):
normalization[i] = float(array[i]) / total
return normalization
#得到需要的12维颜色直方图向量
def Get_vector(image):
width = image.width
height = image.height
vector = [0] * 12
index = 0
for m in range(2):
for n in range(2):
total = 0
for i in range(m * width / 2, (m+1) * width / 2):
for j in range(n * height / 2, (n+1) * height / 2):
for k in range(3):
vector[index+k] += image[j,i][k]
for k in range(3):
total += vector[index+k]
for k in range(3):
vector[index+k] = vector[index+k] / total
index += 3
return vector
#对12维向量做量化处理
def Make_character(vector):
for i in range(len(vector)):
if vector[i] < 0.3:
vector[i] = 0
elif vector[i] > 0.6:
vector[i] = 2
else:
vector[i] = 1
return vector
#对向量在相应hash函数上求投影
def Make_projection(I, vector):
section = {}
projection = ""
I.sort()
for i in range(len(I)):
tmp = (I[i] + 1) / 2
try:
section[tmp].append(I[i])
except:
section[tmp] = []
section[tmp].append(I[i])
for i in range(1, len(vector)+1):
num = 0
try:
current = section[i]
for j in range(len(current)):
if current[j] - 2 * (i - 1) <= vector[i-1]:
num += 1
projection += (num * "1" + (len(current) - num) * "0")
except:
pass
return projection
#求两个图片对应的特征向量的相似度
def Get_similarity(point1, point2):
totalSum = 0
for i in range(len(point1)):
totalSum += point1[i] * point2[i]
return totalSum
#求每个向量投影后得到的hash值
def Hash_key(image):
p = Get_vector(image)
p = Make_character(p)
tmp = []
tmp.append(Make_projection(Hash_1, p))
tmp.append(Make_projection(Hash_2, p))
tmp.append(Make_projection(Hash_3, p))
tmp.append(Make_projection(Hash_4, p))
return tmp
def main():
result = []
image = cvLoadImage("target.jpg", 1)
Object = Hash_key(image)
p = Get_vector(image)
start = time.clock()
for i in range(1, 41):
image = cvLoadImage(("%d.jpg" % i), 1)
tmp = Hash_key(image)
if tmp == Object:
result.append(i)
end = time.clock()
print end - start
start = time.clock()
if len(result) >= 1:
max = 0
for i in range(len(result)):
image = cvLoadImage(("%d.jpg" % result[i]), 1)
q = Get_vector(image)
p = Make_Norm(p)
q = Make_Norm(q)
similarity = Get_similarity(p, q)
if similarity > max:
max = similarity
picture = result[i]
print "最好的匹配是:",("%d.jpg" % picture)
else:
print "最好的匹配是:",("%d.jpg" % result[0])
end = time.clock()
print end - start
if __name__ == '__main__':
main()
没有合适的资源?快使用搜索试试~ 我知道了~
局部敏感哈希算法的代码
共1个文件
py:1个
4星 · 超过85%的资源 需积分: 32 124 下载量 105 浏览量
2014-06-08
20:38:13
上传
评论 7
收藏 1KB ZIP 举报
温馨提示
locality-sensitive hashing(局部敏感哈希),实现高位数据搜索平台
资源推荐
资源详情
资源评论
收起资源包目录
29782218LSH.zip (1个子文件)
LSH.py 4KB
共 1 条
- 1
qq_16256185
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页