Python+OpenCV竖版古籍文字分割

在做图片文字分割的时候,常用的方法有两种。一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像;还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像。

1. 思路

一开始想偷个懒,直接用OpenCV的模型,结果发现效果不佳。文字出现了过度分割的问题,部分文字甚至没有被识别:

于是只好使用传统方法,投影法。对文字图片作横向和纵向投影,即通过统计出每一行像素个数,和每一列像素个数,来分割文字。代码参考https://www.cnblogs.com/zxy-joy/p/10687152.html,但是对于古籍来说,需要做一些修改。比如,古籍文字书写在习惯是从上到下的,所以说在扫描的时候应该扫描列投影,在扫描行投影,搞定这次简单的操作顺序修改以后,分割结果如下:

很显然,虽然说没有出现过度分割的问题,但是由于字体有大有小,有的地方两个字被合起来识别成了一个字。那么很显然,只要把这些地方再进行一次列投影,把它们再度拆分成两个字,问题不就解决了么。添加代码:

# 再进行一次列扫描
DcropImg = cropImg[H_start[pos]:H_end[pos], 0:w]
d_h, d_w = DcropImg.shape 
# cv2.imshow("dcrop", DcropImg)
sec_V = getVProjection(DcropImg)
c1, c2 = scan(sec_V, 0)
if len(c1) > len(c2):
  c2.append(d_w)

# cv2.waitKey(0)
if len(c1) == 1:
    Position.append([V_start[i],H_start[pos],V_end[i],H_end[pos]])
else:
    for x in range(len(c1)):
        Position.append([V_start[i]+c1[x], H_start[pos],V_start[i]+c2[x], H_end[pos]])

2. 优化

对单行文本做列扫描,很容易出现过度分割的问题。因为只有一行,会扫描到很多没有像素点的列,最终就会出现这种情况:

 

 

为了避免这种过度分割的情况,可以添加一个检测两个分割之间距离的代码,使距离较近的分割进行合并。

x = 1
while x < len(c1):
  if c1[x] - c2[x-1] < 12:
    c2.pop(x-1)
    c1.pop(x)
    x -= 1
    x += 1

3. 代码

再通过添加

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值