【发布时间】:2018-01-19 19:35:45
【问题描述】:
假设我的数据库包含数千张不同形式和大小(小于 100 x 100 像素)的图像,并且保证每张图像只显示一个对象 - 符号、徽标、路标等。我想成为能够从 Internet 获取任何图像(“my_image.jpg”)并回答“my_image 是否包含我的数据库中的任何对象(对象可以调整大小,但没有变形)?” - 假设有 95% 的可靠性。为了简化 my_images 将有白色背景。
我正在尝试使用 imagehash (https://github.com/JohannesBuchner/imagehash),这将非常有帮助,但为了获得有益的结果,我认为我必须(几乎)计算 my_image 的所有可能散列 - 原因是我不知道对象大小和 my_image 上的位置:
hash_list = []
MyImage = Image.open('my_image.jpg')
for x_start in range(image_width):
for y_start in range(image_height):
for x_end in range(x_start, image_width):
for y_end in range(y_start, image_height):
hash_list.append(imagehash.phash(MyImage.\
crop(x_start, y_start, x_end, y_end)))
...然后尝试在数据库中找到类似的哈希,但是当例如 image_width = image_height = 500 时,这个循环和搜索将需要很长时间。当然我可以稍微优化一下,但对于更大的图像,它仍然看起来像 seppuku:
MIN_WIDTH = 30
MIN_HEIGHT = 30
STEP = 2
hash_list = []
MyImage = Image.open('my_image.jpg')
for x_start in range(0, image_width - MIN_WIDTH, STEP):
for y_start in range(0, image_height - MIN_HEIGHT, STEP):
for x_end in range(x_start + MIN_WIDTH, image_width, STEP):
for y_end in range(y_start + MIN_HEIGHT, image_height, STEP):
hash_list.append(...)
我想知道是否有一些很好的方法来定义 my_image 的哪些部分在计算哈希时是有利可图的——例如,切割边缘看起来是个坏主意。也许有一个更简单的解决方案?如果程序能在最多 20 分钟内给出答案,那就太好了。如有任何建议,我将不胜感激。
PS:对不起我的英语:)
【问题讨论】:
标签: image-processing computer-vision image-recognition pattern-recognition