likes
comments
collection
share

记一次图片中繁体文字转简体的尝试

作者站长头像
站长
· 阅读数 10

记一次图片中繁体文字转简体的尝试

背景

一个朋友有一批从他人ppt截取的图片(如上图),其中的文字均是繁体字,看起来不太顺序,想转换成简体字,然后我就多了这么一个需求

第一反应当然是网上搜索类似的解决方案,找了一圈没有找到完全符合要求,无奈只能自己动手了

说干就干

参照之前搜集的资料,大致有些思路,但也有一些比较难搞的点,没有现成的方案可以借鉴,初步构思如下:

实现步骤:
1. 进行文字识别,获取图片内的文字及其对应坐标
2. 逐个判断文字是否是繁体,如果是,则加入待替换列表
3. 识别文字颜色、大小、以及背景颜色
4. 根据坐标区域和背景颜色,覆盖原有文字区域,即先删除繁体字
5. 将繁体转换为简体,根据坐标区域、字体大小和颜色,将简体字绘制在图片上

1、OCR识别

这一步最简单,各大云服务厂商都有相应的OCR服务,包括有道云、腾讯云和华为云等,这几家的准确度都差不多,都能识别出图片内的繁体字并返回段落坐标,而有道云有提供单个字的坐标,所以最终选择了有道云。

2、繁体字转换

直接使用现成的库(zhconv),简单了事

3、识别字体大小和颜色、以及背景色

A) 字体大小比较好办,根据字体区域的宽度和字符的个数,即可估算出字体大小

font_size = width/len(text)

B) 字体颜色和背景色计算是最难的环节,本来是想通过颜色值的比例计算出背景色和字体颜色(比例最高的为背景色、其次为字体颜色)。理想很丰满,但现实很骨感,字体所处区分的背景和文字本身肉眼看上去是纯色,但实际上并不是,读取到的RBG有些许的差异,特别是文字的描边,RGB值还相差很多,即使通过相近颜色合并,得到的结果值仍然很多,无法找到一个简单的规则确定使用哪个色值。 经过多次改进仍然无法精确判断,最后只能无奈放弃,采用简单暴力的方式实现该步骤:字体色采用固定值,背景色取色值出现比例最高的一个;如果背景色和字体颜色相同,则将字体颜色做一次转换。

1. 读取图片所有像素点色值,并进行相近颜色合并,得到色值及被使用次数
colors = {'FFFFFF': 10000, 'FE00F8': 8456, '000000': 88, ....}
2. 计算字体颜色和背景色
font_color = (0,0,0)
bg_color = 'FFFFFF' #出现次数最多的色值
if font_color == bg_color:
    font_color = (255 - bg_color[0], 255 - bg_color[1], 255 - bg_color[2])

4、清除繁体字

这一步比较暴力,直接使用上一步计算的背景色进行覆盖,因为原图片背景色可能会有多种颜色,该方式会导致文字区域的背景色失真。好在实际文字背景彩色的部分较少,出错的部分占比不高,最终的结果也在接受范围之内。

5、绘制简体字

剩下的事情就没有什么难度了,找一个好看的免费字体,根据前面获取的字体大小和颜色,按坐标绘制文字即可,这里直接用的第三方库(PIL)

效果对比

原始图片

记一次图片中繁体文字转简体的尝试 转换后

记一次图片中繁体文字转简体的尝试

总结

图片处理之前接触的比较少,这次通过借鉴他人的文章、以及查看第三方库的文档,对图片的操作有了更深的理解。虽然转换后的图片有些失真和位置错误,大体上还是能满足要求的。这是前期设想的方案没有完全实现,实在是有些可惜,如果后续时间允许的话,再继续研究。

完整代码如下,欢迎大家帮忙指正~~~

github.com/xiaohuege/r…