-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathsearchbyt.py
397 lines (307 loc) · 10.1 KB
/
searchbyt.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
import asyncio
import csv
from time import ctime
from ColourMoments import *
import cv2
import joblib
from scipy.cluster.vq import *
from sklearn import preprocessing
from pylab import *
from colorFeature import ColorDescriptor
from GLCM import *
from ShapeHistogram import *
import hashing
# 根据颜色特征搜索相关图像
def searchByColor(search_image):
# 颜色特征描述符初始化
cd = ColorDescriptor((8, 12, 3))
# 加载图片
im = cv2.imread(search_image)
# 计算获取被检索图像的颜色特征描述符
features = list(np.array(cd.describe(im)))
# 获得检索结果
results= find_img(features)
path_list=[]
# 获取结果的图片地址
for distance,imageID in results:
path_list.append(imageID)
# 返回检索结果
return path_list
# 根据颜色矩搜索相关图像
def searchByCM(search_image):
# 颜色特征描述符初始化
# 加载图片
# 计算获取被检索图像的颜色特征描述符
features = list(np.array(color_moments(search_image)))
# 获得检索结果
results= find_img2(features)
path_list=[]
# 获取结果的图片地址
for distance,imageID in results:
path_list.append(imageID)
# 返回检索结果
return path_list
# 根据纹理特征搜索相关图像(灰度共生矩阵)
def searchByGLCM(search_image):
# 颜色特征描述符初始化
# 加载图片
im = cv2.imread(search_image)
# 计算获取被检索图像的颜色特征描述符
features = list(np.array(getglcm(im)))
# 获得检索结果
results= find_img3(features)
path_list=[]
# 获取结果的图片地址
for distance,imageID in results:
path_list.append(imageID)
# 返回检索结果
return path_list
# 根据边缘特征搜索相关图像
def searchbyShape(search_image):
# 颜色特征描述符初始化
# 加载图片
im = cv2.imread(search_image)
# 计算获取被检索图像的颜色特征描述符
features = list(np.array(ft(im)))
# 获得检索结果
results= find_img4(features)
path_list=[]
# 获取结果的图片地址
for distance,imageID in results:
path_list.append(imageID)
# 返回检索结果
return path_list
def cos_sim(a, b):
vector_a = np.mat(a)
vector_b = np.mat(b)
# num = float(vector_a * vector_b.T)
# denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
# sim = num / denom
sim = np.dot(vector_a, vector_b.T) # T转置,类似numpy.transpose,矩阵的点积
return sim
def find_img(queryFeatures, limit = 10):
# 初始化我们的结果字典
results = {}
# 打开索引文件进行读取
with open("Feature Library/colorhis.csv") as f:
# 初始化 CSV 阅读器
reader = csv.reader(f)
# 遍历索引文件中的每一行
for row in reader:
# 解析出图像 ID 和特征,然后计算
# 计算被检索的图像特征与索引文件中的每行的特征的距离
features = [float(x) for x in row[1:]]
d = distance(features, queryFeatures)
print(d)
# 将计算结果存储
results[row[0]] = d
# 关闭阅读器
f.close()
results = sorted([(v, k) for (k, v) in results.items()])
# 返回结果
# print(len(results))
return results[:limit]
def find_img2(queryFeatures, limit = 10):
# 初始化我们的结果字典
results = {}
# 打开索引文件进行读取
with open("Feature Library/colormoment.csv") as f:
# 初始化 CSV 阅读器
reader = csv.reader(f)
# 遍历索引文件中的每一行
for row in reader:
# 解析出图像 ID 和特征,然后计算
# 计算被检索的图像特征与索引文件中的每行的特征的距离
features = [float(x) for x in row[1:]]
d = distance(features, queryFeatures)
print(d)
# 将计算结果存储
results[row[0]] = d
# 关闭阅读器
f.close()
results = sorted([(v, k) for (k, v) in results.items()])
# 返回结果
# print(len(results))
return results[:limit]
def find_img3(queryFeatures, limit = 10):
# 初始化我们的结果字典
results = {}
# 打开索引文件进行读取
with open("Feature Library/GLCM.csv") as f:
# 初始化 CSV 阅读器
reader = csv.reader(f)
# 遍历索引文件中的每一行
for row in reader:
# 解析出图像 ID 和特征,然后计算
# 计算被检索的图像特征与索引文件中的每行的特征的距离
features = [float(x) for x in row[1:]]
d = distance(features, queryFeatures)
print(d)
# 将计算结果存储
results[row[0]] = d
# 关闭阅读器
f.close()
results = sorted([(v, k) for (k, v) in results.items()])
# 返回结果
# print(len(results))
return results[:limit]
def find_img4(queryFeatures, limit = 10):
# 初始化我们的结果字典
results = {}
# 打开索引文件进行读取
with open("Feature Library/ShapeHis.csv") as f:
# 初始化 CSV 阅读器
reader = csv.reader(f)
# 遍历索引文件中的每一行
for row in reader:
# 解析出图像 ID 和特征,然后计算
# 计算被检索的图像特征与索引文件中的每行的特征的距离
features = [float(x) for x in row[1:]]
d = distance(features, queryFeatures)
print(d)
# 将计算结果存储
results[row[0]] = d
# 关闭阅读器
f.close()
results = sorted([(v, k) for (k, v) in results.items()])
# 返回结果
# print(len(results))
return results[:limit]
# 根据哈希特征搜索相关图像
def searchBydhash(search_image):
im = cv2.imread(search_image)
# 计算获取被检索图像的颜色特征描述符
features = hashing.convert_hash(hashing.dhash(im))
# 获得检索结果
results= find_dhash(features)
path_list=[]
# 获取结果的图片地址
for distance,imageID in results:
path_list.append(imageID)
# 返回检索结果
return path_list
def find_dhash(queryFeatures, limit = 10):
# 初始化我们的结果字典
results = {}
# 打开索引文件进行读取
with open("Feature Library/dhash.csv") as f:
# 初始化 CSV 阅读器
reader = csv.reader(f)
# 遍历索引文件中的每一行
for row in reader:
# 解析出图像 ID 和特征,然后计算
# 计算被检索的图像特征与索引文件中的每行的特征的距离
features = [float(x) for x in row[1:]]
d = hashing.hamming(features[0], queryFeatures)
print(d)
# 将计算结果存储
results[row[0]] = d
# 关闭阅读器
f.close()
results = sorted([(v, k) for (k, v) in results.items()])
# 返回结果
# print(len(results))
return results[:limit]
# 根据哈希特征搜索相关图像
def searchByphash(search_image):
im = cv2.imread(search_image)
# 计算获取被检索图像的颜色特征描述符
features = hashing.convert_hash(hashing.pHash(im))
# 获得检索结果
results= find_phash(features)
path_list=[]
# 获取结果的图片地址
for distance,imageID in results:
path_list.append(imageID)
# 返回检索结果
return path_list
def find_phash(queryFeatures, limit = 10):
# 初始化我们的结果字典
results = {}
# 打开索引文件进行读取
with open("Feature Library/phash.csv") as f:
# 初始化 CSV 阅读器
reader = csv.reader(f)
# 遍历索引文件中的每一行
for row in reader:
# 解析出图像 ID 和特征,然后计算
# 计算被检索的图像特征与索引文件中的每行的特征的距离
features = [float(x) for x in row[1:]]
d = hashing.hamming(features[0], queryFeatures)
print(d)
# 将计算结果存储
results[row[0]] = d
# 关闭阅读器
f.close()
results = sorted([(v, k) for (k, v) in results.items()])
# 返回结果
# print(len(results))
return results[:limit]
# 根据哈希特征搜索相关图像
def searchByahash(search_image):
im = cv2.imread(search_image)
# 计算获取被检索图像的颜色特征描述符
features = hashing.convert_hash(hashing.aHash(im))
# 获得检索结果
results= find_ahash(features)
path_list=[]
# 获取结果的图片地址
for distance,imageID in results:
path_list.append(imageID)
# 返回检索结果
return path_list
def find_ahash(queryFeatures, limit = 10):
# 初始化我们的结果字典
results = {}
# 打开索引文件进行读取
with open("Feature Library/ahash.csv") as f:
# 初始化 CSV 阅读器
reader = csv.reader(f)
# 遍历索引文件中的每一行
for row in reader:
# 解析出图像 ID 和特征,然后计算
# 计算被检索的图像特征与索引文件中的每行的特征的距离
features = [float(x) for x in row[1:]]
d = hashing.hamming(features[0], queryFeatures)
print(d)
# 将计算结果存储
results[row[0]] = d
# 关闭阅读器
f.close()
results = sorted([(v, k) for (k, v) in results.items()])
# 返回结果
# print(len(results))
return results[:limit]
def distance(histA, histB, eps = 1e-10):
# 计算卡方距离
d = 0.5 * np.sum([((a - b) ** 2) / (a + b + eps)
for (a, b) in zip(histA, histB)])
# 返回卡方距离
return d
# 根据sift特征搜索相关图像
def searchBySift(search_image):
# 加载分类器、类名、缩放器、簇数和词汇
im_features, image_paths, idf, numWords, voc = joblib.load("Feature Library/bow.pkl")
# 创建特征提取和关键点检测器对象
sift_det = cv2.SIFT_create()
# 列出所有描述符的存储位置
des_list = []
im = cv2.imread(search_image)
gray = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)
kp, des = sift_det.detectAndCompute(gray, None)
des_list.append((search_image, des))
# 将所有描述符垂直堆叠在一个 numpy 数组中
descriptors = des_list[0][1]
test_features = np.zeros((1, numWords), "float32")
words, distance = vq(descriptors, voc)
for w in words:
test_features[0][w] += 1
# 执行 Tf-Idf 矢量化和 L2 归一化
test_features = test_features * idf
test_features = preprocessing.normalize(test_features, norm='l2')
score = np.dot(test_features, im_features.T)
rank_ID = np.argsort(-score)
result_list=[]
for i, ID in enumerate(rank_ID[0][0:10]):
result_list.append(image_paths[ID])
return result_list