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

2022-04-27 19:18:49 浏览数 (1)

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

  • 如何将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)

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

0 人点赞