![查找包含给定片段的图像](https://linux22.com/image/1536667/%E6%9F%A5%E6%89%BE%E5%8C%85%E5%90%AB%E7%BB%99%E5%AE%9A%E7%89%87%E6%AE%B5%E7%9A%84%E5%9B%BE%E5%83%8F.png)
在我的本地硬盘上,我有一个包含数千张图像(它们是扫描文档)的目录。我有一张很小的图像(例如,200x100 像素 - 这是一个人的签名)。我必须找到包含此片段(或类似片段 - 一个人的不同签名并非逐像素相同)的所有图像。我该怎么做?类似问题中建议的工具 - 例如针对源图像进行本地图像搜索?- 对我来说不起作用,因为(据我所知)他们搜索相似的整体图像,而我想找到包含给定片段的图像。
答案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)