人对图像的感知能力很强,所以图文很多,但是我们的认知却更多的用文字去传达;所以我们常常苦恼:
- 如何将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
代码语言:javascript复制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
代码语言:javascript复制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%,已经很完美了。我想这样一个小程序应该能帮我们解决很多问题了。
代码语言:javascript复制import pytesseractfrom PIL
import Image
import 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)
有问题的小伙伴,可以私聊哦,创作不易,喜欢点赞