网络编程
位置:首页>> 网络编程>> Python编程>> 基于OpenCV(python)的实现文本分割之垂直投影法

基于OpenCV(python)的实现文本分割之垂直投影法

作者:Keras深度学习  发布时间:2023-11-17 08:45:39 

标签:OpenCV,垂直投影

在我的上一篇博客中讲述了水平投影法取出文本行图像的实现,在这里将用垂直投影法对文本行的每个字符进行分割。下图是用水平投影法切割的文本行:

基于OpenCV(python)的实现文本分割之垂直投影法

文本分割的原理如下,先用水平投影取出单一文本行,接着使用垂直投影法达到对单个字符进行分割。

代码如下:

import numpy as np
import cv2

def get_vvList(list_data):
   #取出list中像素存在的区间
   vv_list=list()
   v_list=list()
   for index,i in enumerate(list_data):
       if i>0:
           v_list.append(index)
       else:
           if v_list:
               vv_list.append(v_list)
               #list的clear与[]有区别
               v_list=[]
   return vv_list

if __name__=='__main__':
   img_bgr=cv2.imread('./testImg/2.png',1)
   if not img_bgr is None:
       img=img_bgr.copy()
       img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
       #二值化
       t,binary=cv2.threshold(img_gray,0,255,cv2.THRESH_OTSU+cv2.THRESH_BINARY)
       '''
       垂直投影为从上往下投射,统计每一列的黑色像素总数
       '''
       rows,cols=binary.shape
       ver_list=[0]*cols
       for j in range(cols):
           for i in range(rows):
               if binary.item(i,j)==0:
                   ver_list[j]=ver_list[j]+1
       '''
       对ver_list中的元素进行筛选,可以去除一些噪点
       '''
       ver_arr=np.array(ver_list)
       ver_arr[np.where(ver_arr<1)]=0
       ver_list=ver_arr.tolist()

#绘制垂直投影
       img_white=np.ones(shape=(rows,cols),dtype=np.uint8)*255
       for j in range(cols):
           pt1=(j,rows-1)
           pt2=(j,rows-1-ver_list[j])
           cv2.line(img_white,pt1,pt2,(0,),1)
       cv2.imshow('垂直投影',img_white)
       cv2.waitKey(0)

#切割单一字符
       vv_list=get_vvList(ver_list)
       for i in vv_list:
           img_ver=img_bgr[:,i[0]:i[-1]]
           cv2.imshow('单一字符',img_ver)
           cv2.waitKey(0)

运行程序,垂直投影图像如下图所示:

基于OpenCV(python)的实现文本分割之垂直投影法

分割的单一字符如下图:

基于OpenCV(python)的实现文本分割之垂直投影法

单个数字已经正确分割出来了。

来源:https://blog.csdn.net/qq_37781464/article/details/113126450

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com