python检索_【图片搜索神器】教你用Python通过图片上的文字内容做检索

文:同和君

项目地址:

这件事起源于某天傍晚,大家都知道同和君是个很爱讲故事的人,当时呢也是想分享一个发生在高中时期特别搞(jin)笑(bao)的事情给朋友听,可惜其中有一个很重要的地方我记不太清楚了,只记得那件事我以前和别人也聊过,还截了图存到硬盘里。没那个情节的话整个故事也会变得索然无味……只好先拒绝了朋友(其实是想偷懒直接发截图给她看),等找到了那张图恢复了记忆再来讲述。

b31d-ifvwftk9520615.png

可正当我打算开始找那张截图的时候,我才反应过来,这基本上等同于大海捞针:

89c2-ifvwftk9520633.png

就算定位到了具体的年份,也还是有很多图片需要逐张查找……

aad4-ifvwftk9520652.png

其实类似这样的事情发生过很多次,写专栏或者做视频有的时候需要用到过去的资料,还是得找上半天……

879b-ifvwftk9520664.png

所以到底有没有什么好方法来解决这个问题呢?答案当然是有的,那就是:

只有机器才能对抗机器——艾伦·图灵

57e5-ifvwftk9520683.png

由于我之前写过一个用来自动输入校园网登陆验证码的脚本,其中自动识别验证码一项用到了谷歌的OCR工具「tesseract」(详细安装与使用教程见:https://blog.csdn.net/showgea/article/details/82656515,注意安装后重启计算机),所以我想到了要是能将图片识别出来的字段存入该图片的数据结构中,然后通过某种手段来检索,就会大大提高工作的效率了。

深入了解我发现无论是jpg还是png,常用的这些图片格式里,都存在一种叫Exif的数据结构,它用来存储照片的相关信息(元数据),比如拍摄日期、修改日期、拍摄经纬度、ISO、相机品牌等等。而这其中有一个叫「ImageDescription」的字段,即「图片描述」:

9c11-ifvwftk9520693.png

我查了很多资料都没查出来这个字段的上限究竟是多少,不过经极限测试,可以成功写入2万汉字,也就是说ocr识别出的汉字少于2w都可以写入,暂时不必担心数据溢出。

重头戏来了,如何把数据批量识别并写入呢?用Python写一个简单的脚本即可:

import os,re,time,pyexiv2from PIL import Imageimport pytesseract class exif(): def imgSave(self,dirname): for filename in os.listdir(dirname): path = dirname + filename if os.path.isdir(path): path += '/' self.imgSave(path) else: self.imgExif(path) def imgExif(self,path): try: text = pytesseract.image_to_string(Image.open(path), lang='chi_sim') string = re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+","",text) print(string) img_tag = pyexiv2.Image(path) img_tag.modify_exif({"Exif.Image.ImageDescription":string}) #img_tag.modify_iptc({"Iptc.Application2.Caption":string}) print('图片'+path+'写入成功') except: print('图片'+path+'写入失败') def start(self): _path = input("请输入图片路径:").strip() self.imgSave(_path+'\\')Exif_info = exif()Exif_info.start()

其中,有一个很重要的模块「pyexiv2」被引入,它是一个基于Exiv2的Python库,可以读写图片的元数据,用法如下:

afe4-ifvwftk9520700.png

接着整合OCR和修改元数据两个功能,再通过imgSave模块批处理,就能对数据库中所有文件进行批量修改了。

f9f1-ifvwftk9520710.png

修改完后,具体如何查找呢?因为有现成的工具「Adobe Bridge」,所以就不用再另写查找脚本了,处理完后直接搜索即可:

8b26-ifvwftk9520726.png

测试完成后再部署到我整个影像资料库里:

f045-ifvwftk9520740.png

OK,现在来找找我们所需要的数据吧~

340a-ifvwftk9520747.png

好了,继续和朋友开开心心地吹水吧~

1b70-ifvwftk9520755.png

很遗憾,因为审核问题关键图片没法放上来给大家看……

7bf1-ifvwftk9520768.png

虽然解决了目前的需求,不过还是存在一些问题:

谷歌识别的准确率大约为80%左右,精度还需要提高;

因为精度不高,所以还需要加入模糊搜索功能,这就需要自己编写搜索工具了;

部分png不支持exif,即使写入了数据,bridge里也检测不到(但数据确实已经写入,用pyexiv2能查到写入的字段);

单线程OCR效率太低,可以多上几个线程。

TODO LIST:

写一个支持模糊搜索的图片搜索引擎

5502-ifvwftk9520776.png

特别声明:以上文章内容仅代表作者本人观点,不代表新浪网观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与新浪网联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值