河南南阳收割机被堵事件:官员缺德,祸患无穷

极目新闻领导公开“记者毕节采访被打”细节:他们打人后擦去指纹

突发!员工跳楼!只拿低保工资!央企设计院集体罢工!

退休后的温家宝

突发!北京某院集体罢工!

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

小妙招:让图像会说话,字字清晰

指象 数据指象 2022-07-01

人对图像的感知能力很强,所以图文很多,但是我们的认知却更多的用文字去传达;所以我们常常苦恼:

  • 如何将pdf文字转成Word文本

  • 如何快速破解验证码

  • 如何从图片中找到自己想要的关键信息

今天我们一起用一个简单的小程序,破解我们日常中的小难题;天不助人,人自助。


1,工欲善其事,必先利其器

本文的实验环境:
Mac计算机、Python3、当然更离不开Tesseract-OCR引擎
# MAC安装Tesseract-OCR引擎:brew install Tesseract #安装Python包 pip install pytesseract #安装PILLOW图像处理包 pip install Pillow

2,图片开始说话
测试Demo程序:test.py
import pytesseractfrom PIL import Imageimg_str = 'test.png'img = Image.open(img_str)a = pytesseract.image_to_string(img)for w in a.split('\n'): #格式化输出 if w.strip(): print(w)
好吧,第一版的程序,只能正确的解析图中的英文和数字“idw007”,对中文的解析,只能让人呵呵呵;但是不能灰心,遇到问题我们耐心解决,不断测试小步迭代,一定会越来越好。

第二版,兼容对中文汉字的处理,光学字符识别的原理:从图像中扫描出结果与原本的文字集合中的文字形状作对比,找出相似对最高的字;所以我们需要加载一个中文的汉字包:chi_sim.traineddata,下载后放到目录:xxx/tessdata/ 下面即可;
兼容中文汉字:test.py
import pytesseractfrom PIL import Imageimg_str = 'test.png'img = Image.open(img_str)a = pytesseract.image_to_string((img), lang='chi_sim') for w in a.split('\n'): #格式化输出 if w.strip(): print(w)

看完处理结果,准确率:100%,全部识别正确了;你是不是觉得很酷;学会这招,以后你就可以轻易的将任何无法辅助的文本,通过图片识别的方式转成文本来获取你想要的文本。

3,其实这只是开始
对于白底黑字的图片文本,识别准确率却是很高;但是,道高一尺魔高一丈,为了不让我们轻易的爬取识别图像文字,图像中通常会有错综复杂的背景,文字形状字体也会有巧妙的变化;这样我们直接用ORC识别,准确率就会很低,反而会变向增加我们的处理工作。
如下:调整了图片背景,字体;准确率只有53.92%,还不如人工一个个手动翻译了

4,我们处理图像-提高字的识别度
这里简单的使用PIL中的图像处理方法,将红色的阈值替换为白色,从而消除红色网格背景线的干扰,从而提高字体的识别度,这样我们测试了一下,处理后的图片识别的准确率高达99%,已经很完美了。我想这样一个小程序应该能帮我们解决很多问题了。
import pytesseractfrom PIL import Imageimport numpy as npdef
deal_img(img_str): img = Image.open(img_str) im = img.convert('RGBA')      data = np.array(im)     print(data) # RGBA 数据矩阵     r1,g1, b1  = [220, 58, 21]     rw, gw, bw, aw = [255, 255, 255, 255]     red, green, blue, alpha = data[:, :, 0], data[:, :, 1], data[:, :, 2], data[:, :, 3]     mask = ((red <= r1) & (green <= g1) & (blue == b1))      data[:, :, :4][mask] = [rw, gw, bw, aw]     new_im = Image.fromarray(data)     new_im.save('new_file.png')      return new_im
img_str = 'test_red.png'img=deal_img(img_str)a = pytesseract.image_to_string((img), lang='chi_sim')for w in a.split('\n'): #格式化输出       if w.strip():             print(w)

有问题的小伙伴,可以私聊哦,创作不易,喜欢点赞

推荐阅读:

SQL无处不在,无所不能

R语言,制作常用图表

ggplot2:让图表更顺滑

文章有问题?点此查看未经处理的缓存