На моем локальном жестком диске у меня есть каталог с тысячами изображений. У меня есть крошечное изображение (например, 200x100 пикселей). Я должен найти все изображения, которые содержат этот фрагмент. Как я могу это сделать? Инструменты, предложенные в подобных вопросах - например, в Локальном поиске изображения по исходному изображению? - не работают в моем случае, потому что (насколько я понимаю) они ищут похожие изображения целиком, в то время как я хочу найти изображения, содержащие данный фрагмент.
1 ответ
1
Поскольку ответов пока нет, я предоставлю возможное решение (заметьте, однако, что это вычислительно дорого).
Вы можете установить OpenCV и скомпилировать программу для выполнения такой задачи.
Для получения более подробной информации, обратитесь https://stackoverflow.com/a/29669787/8055533
Соответствующий код ниже:
def find_image(im, tpl):
im = np.atleast_3d(im)
tpl = np.atleast_3d(tpl)
H, W, D = im.shape[:3]
h, w = tpl.shape[:2]
# Integral image and template sum per channel
sat = im.cumsum(1).cumsum(0)
tplsum = np.array([tpl[:, :, i].sum() for i in range(D)])
# Calculate lookup table for all the possible windows
iA, iB, iC, iD = sat[:-h, :-w], sat[:-h, w:], sat[h:, :-w], sat[h:, w:]
lookup = iD - iB - iC + iA
# Possible matches
possible_match = np.where(np.logical_and(*[lookup[..., i] == tplsum[i] for i in range(D)]))
# Find exact match
for y, x in zip(*possible_match):
if np.all(im[y+1:y+h+1, x+1:x+w+1] == tpl):
return (y+1, x+1)
raise Exception("Image not found")
а также
>>> from skimage import data
>>> im = gray2rgb(data.coins())
>>> tpl = im[170:220, 75:130].copy()
>>> fig, ax = plt.subplots()
>>> imshow(im)
>>> rect = Rectangle((x, y), tpl.shape[1], tpl.shape[0], edgecolor='r', facecolor='none')
>>> ax.add_patch(rect)