最近在使用Python识别PNG图像中包含的文字时遇到一个问题。解决过程记录如下。

(Python使用tesserocr的安装过程不再描述。)

在使用tesserocr识别PNG图像中的文字时,如果PNG比较“干净”,背景没有噪音时,过程比较简单,代码如下:

from PIL import Image
import tesserocr image = Image.open(r'../data/demo01.png')
print(tesserocr.image_to_text(image))

输出结果为:

This is some text, written in Arial, that will be read by
Tesseract. Here are some symbols: !@#$%"&’()

效果还算可以。

但是如果PNG图片背景有些复杂,在识别之前需要对PNG做一些处理,比如针对下面这幅PNG图片:



这里使用的是简单的阈值过滤,即小于阈值的像素值均设置为黑色(0),大于阈值的像素值设置为白色(255);然后再对处理后的图像进行处理。代码如下:

from PIL import Image
import tesserocr def clear_file(file_path, new_file_path):
image = Image.open(file_path)
# 为图像设置一个阈值过滤器并保存
image = image.point(lambda x: 0 if x < 143 else 255)
image.save(new_file_path) return image image = clear_file(r'..\data\demo02.png', r'..\data\demo02_cleaned.png')
print(tesserocr.image_to_text(image))

本以为会顺利输出结果,但是执行结果却是报了一堆错误:

……
File "E:\PrivatedData\programs\python\wasp\env\lib\site-packages\PIL\Image.py", line 2212, in save
save_handler(self, fp, filename)
File "lib\site-packages\PIL\JpegImagePlugin.py", line 632, in _save
raise OSError(f"cannot write mode {im.mode} as JPEG") from e
OSError: cannot write mode RGBA as JPEG

错误非常奇怪,明明是PNG图像,怎么说要处理JPEG图像呢?

通过跟踪,发现在选择图像文件的处理方法时,有如下代码(在Image.py的save函数中):

        if save_all:
save_handler = SAVE_ALL[format.upper()]
else:
save_handler = SAVE[format.upper()]

代码的主要意图是要根据format的值来选择图片的处理函数,而此时format的值为‘JPEG’,因此Pillow就用JPEG的处理函数来处理PNG图像了,所以会出错。

很奇怪,不是根据扩展名来识别图像格式吗。我从头到尾就没有使用到JPEG图像。我不知道Pillow的Image类在什么时候、用什么方式确定format的值。

想在网上查找tesserocr的API文档,看能不能把这个format传递过去,但是没有找到。

于是尝试自己设置图像的format,看能否通过。于是有了下面的代码:

image = clear_file(r'..\data\demo02.png', r'..\data\demo02_cleaned.png')
image.format = 'PNG'
print(tesserocr.image_to_text(image))

输出结果为:

This Is some text, wntten In Arial, that will be "
Tesseract Here are some symbols: l@#$%"&

这里只是一小段练习代码。如果在正式项目中,可以根据图片文件的扩展名来给image.format赋值。当然能不使用“硬”代码更好,但我一直没有找到相关的文档,不知道问题的根本原因是什么。先把这个记录下来,其他继续研究吧。

Python使用tesserocr识别文字过程中遇到的一个问题的更多相关文章

  1. [SQL]select scope_identity()传回插入相同范围之识别资料行中的最后一个识别值

    传回插入相同范围之识别资料行中的最后一个识别值.范围是一个模组:预存程序.触发程序.函数或批次.因此,如果两个陈述式在相同预存程序.函数或批次中,它们就在相同范围中. 语法: SCOPE_IDENTI ...

  2. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  3. [debug] 解决在C++编写过程中的“找到一个或多个多重定义的符号”

    如下图: 其在 common.h 中定义了一个变量a ,然后在两个 cpp 文件中都是用它. 在这种情况下,链接时就会出现 “找到一个或多个多重定义的符号”. 解决方案: 在某个cpp文件中定义,然后 ...

  4. Python+selenium自动化脚本编辑过程中遇到的问题和小技巧

    应该也不算是问题和技巧,算是实践中学习到的Python,记录下,也不定时更新 1.通过截取url判断 实例: self.assertEqual(self.broswer.current_url[sel ...

  5. VS 2017开发ASP.NET Core Web应用过程中发现的一个重大Bug

    今天试着用VS 2017去开发一个.net core项目,想着看看.net core的开发和MVC5开发有什么区别,然后从中发现了一个VS2017的Bug. 首先,我们新建项目,ASP.NET Cor ...

  6. js:使用js过程中遇到的一个小问题

    在一个作业中使用了js,函数A调用函数B.当A和B中均含有变量i的时候,相关操作结果可能会出错. 将B中的i替换为j(j不存在于A中)后,结果正确. 目前考虑原因是两个变量i有相关性(或者说实际上就是 ...

  7. sql2012安装过程中出现个一个问题

    最近安装了一次SQLSERVER2012,遇到了一个小问题,截图如下: 就是上图中状态为失败的项,点开之后,会弹出下面的一个框: 在网上搜了之后,有了这样的答案: http://www.cnblogs ...

  8. thinkphp 使用过程中遇到的一个小函数

    1.实现导出Excel文件,并在导出的文件中显示图片 //导出 public function push(){ $goods_list=M('Dajia')->select(); $data = ...

  9. hive配置过程中出现的一个问题

    执行hive里面的insert语句的时候,报错,执行失败查看hadoop的日志文件之后发现错误的详细信息如下: 把hdfs-site.xml中的hadoop.tmp.dir这个属性添加到core-si ...

随机推荐

  1. P1189 SEARCH—搜索

    将这题加进来的原因 因为他的优化令人眼前一新! 题目传送门() 相似的题目之 血色先锋队 ↑这一题也要用到标记数组 优化!!! 对于一个位置, 如果他在同样的深度再一次被访问,那他接下来所走的路径,所 ...

  2. npm相关资料

    npm 源的配置 命令行模式 npm install XXX --registry https://registry.npmmirror.com/ 项目模式 在项目更目录新建.npmrc 文件,内容 ...

  3. java通过注解顺序通过映射导出excel

    import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.ann ...

  4. 2022-7-13 java_1 第七组 刘昀航

    @ 目录 前言 一.一些基本的指令 二.java 1.java的三个版本 2.java特点 3.运行一个java程序 三.java的数据类型 1.java基本数据类型 2.强制转换的原理 3.八种基本 ...

  5. for_in循环练习题_100到999之间的水仙花数

    水仙花数 153 == 3**3 + 5**3 + 1**3 点击查看笔者代码 for i in range(100, 1000): a = i % 10 b = i // 100 c = (i // ...

  6. vue2升级vue3指南(二)—— 语法warning&error篇

    本文总结了vue2升级vue3可能会遇到的语法警告和错误,如果想知道怎样升级,可以查看我的上一篇文章:vue2升级vue3指南(一)-- 环境准备和构建篇 Warning 1.deep /deep/和 ...

  7. Linux 系统时间同步服务器配置

    # Linux 时间同步 # 查看系统时间: date # 查看硬件日期 # ntp 软件 # chrony 软件 chrony比ntp更精确 # 利用ntp手动瞬间同步时间: ntpdate 172 ...

  8. JavaWeb过滤器Filter(附tomcat部分源码分析)

    过滤器Filter 过滤器通常对一些web资源进行拦截,做完一些处理器再交给下一个过滤器处理,直到所有的过滤器处理器,再调用servlet实例的service方法进行处理.过滤器可以对request进 ...

  9. [GYCTF2020]Ezsqli-1|SQL注入

    1.打开界面之后在输入框进行输入测试,分别输入1.2.3.'等字符,结果如下: 2.看到bool(false)这里我想到了bool注入,因为之前做过这道题:https://www.cnblogs.co ...

  10. Apache DolphinScheduler之最美好的遇见

    关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...