基於投影的影象文字分割
阿新 • • 發佈:2019-01-25
環境
python 3.6
python-opencv 3.4.0
思路
對圖片進行水平方向投影,得到每一行文字的起止線
對每一行文字進行豎直方向投影,若有連續的畫素滿足條件,則為一個字,進行分割
程式碼
import cv2
import numpy as np
path = 'd:\\testdata\\test\\bin1.png'
root = 'd:\\testdata\\test\\'
dsize = 28 #歸一化處理的影象大小
img = cv2.imread(path)
data = np.array(img)
len_x = data.shape[0]
len_y = data.shape[1 ]
min_val = 10 #設定最小的文字畫素高度,防止切分噪音字元
start_i = -1
end_i = -1
rowPairs = [] #存放每行的起止座標
#行分割
for i in range(len_x):
if(not data[i].all() and start_i < 0):
start_i = i
elif(not data[i].all()):
end_i = i
elif (data[i].all() and start_i >= 0):
#print(end_i - start_i)
if(end_i - start_i >= min_val):
rowPairs.append((start_i, end_i))
start_i, end_i = -1, -1
#print(rowPairs)
#列分割
start_j = -1
end_j = -1
min_val_word = 5 #最小文字畫素長度
number = 0 #分割後儲存編號
for start, end in rowPairs:
for j in range(len_y):
if(not data[start: end , j].all() and start_j < 0):
start_j = j
elif(not data[start: end, j].all()):
end_j = j
elif(data[start: end, j].all() and start_j >= 0):
if(end_j - start_j >= min_val_word):
#print(end_j - start_j)
tmp = data[start:end, start_j: end_j]
im2save = cv2.resize(tmp, (dsize,dsize)) #歸一化處理
cv2.imwrite(root + '%d.png' % number, im2save)
number += 1
#print("%d pic" % number)
start_j, end_j = -1, -1
結果
分割前:
分割後:
總攬:
單例:
效果還行