1. 程式人生 > >基於投影的影象文字分割

基於投影的影象文字分割

環境

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

結果

分割前:

這裡寫圖片描述

分割後:

總攬:

這裡寫圖片描述

單例:

這裡寫圖片描述

效果還行