在我的上一篇博客中讲述了水平投影法取出文本行图像的实现,在这里将用垂直投影法对文本行的每个字符进行分割。下图是用水平投影法切割的文本行:
文本分割的原理如下,先用水平投影取出单一文本行,接着使用垂直投影法达到对单个字符进行分割。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
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垂直投影 内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qq_37781464/article/details/113126450