说明
顺着上一篇的思路继续往下走,一方面往实现需求的角度走,看还需要做些什么。另一方面顺带把对图片的处理按PM方式重新梳理起来,不想以后再从0回忆了。
内容
1 思路
之前发现如果把原始图片给cnocr识别时,抠图部分就错了。一个简单的逻辑:
- 1 抠图 - > 形成文字块
- 2 文字块识别 -> 一段文字
于是我截一段话:
1 文字块识别
调用程序后,我发现对于文本块的图像切割还是混乱的
所以cnocr不能直接接受文字块
。我猜测cnocr
在做的时候就是针对单行的,并且做了对图片的翻转、扭曲等一系列预处理。再加上cv2图片的坐标格式和Image本身就是反着的,所以有问题。
2 文字行识别
看看对单行的识别
我手工截了一行进行识别
python可以读取图片的包有好几个,很多机器学习的包也都带了图片的读取,甚至一些预处理。以下约定:
- 图片IO: 使用PIL的Image
- 矩阵形态的处理: numpy
截图我保存为test2_1_of_10.png
, 要展示截图时要转为RGB, 因为PNG有个透明通道,PIL不知道咋处理。
from PIL import Image
# 文件方式
with open('test2_1_of_10.png','rb') as f:
pic1 = Image.open(f)
pic1 = pic1.convert("RGB")
pic1.show()
# 流方式(Reference)
#import base64
#import io
#raw_str = 'SOME_BASE64_STR'
#raw_str_bin = base64.b64decode(raw_str)
#pic = Image.open(io.BytesIO(raw_str_bin)
# 图片转矩阵
pic1_arr = np.asarray(pic1)
# 矩阵转图片
# pic1= Image.fromarray(pic1_arr)
pic1_arr.shape
(43, 644, 3)
ocr_res = cn_ocr.ocr(pic1_arr)
''.join(sum(ocr_res,[]))
'中共—大会址最初为—大代表李汉俊之兄李'
看起来还不错哟,基本上都识别出来了。当然把一
识别成-
是可以原谅的。
总结一下,cnocr可以识别文字行。
那么问题就转换为:
- 1 从大图片里分离内容区域
- 2 识别其中的文字块
- 3 文字块转为文字行
- 4 把文字行交给cnocr
所以接下来,我们来搞一个文字块转文字行
的方法。