1.背景介绍
在做OCR识别时,我们会遇到长度差距较大的字符串,对于太长的字符串,我们可以将图片分成多段进行识别,最后将识别结果合在一起。
2. 代码实现
思路:(1)首先将图片二值化;(2)在纵轴方向求和得出直方图分布;(3)找到切割点进行图片切割。
import cv2
import numpy as np
def split_string(img, split_num):
"""
将图片二值化后,在纵轴方向求和
"""
height, width, _ = img.shape
length = int(width/split_num) - 1
GrayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, plate_binary_img = cv2.threshold(GrayImage, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
row_histogram = np.sum(plate_binary_img, axis=0)
index_list = []
for index, num in enumerate(row_histogram):
if num == 0 and row_histogram[index-1] == 0 and row_histogram[index+1] == 0:
index_list.append(index)
idx_list = []
for i in range(split_num-1):
l2 = length*(i+1)
idx = get_idx(l2, index_list)
idx_list.append(idx)
idx_list.append(width-1)
img_list = []
for i, idx in enumerate(idx_list):
if i == 0:
img_list.append(img[:, :idx, :])
else:
img_list.append(img[:, idx_list[i-1]:idx, :])
return img_list
def get_idx(l2, index_list):
min_dis = 1000
idx = 0
for i in index_list:
dis = abs(l2-i)
if dis < min_dis:
min_dis = dis
idx = i
return idx
if __name__ == "__main__":
img = cv2.imread("img.jpg")
img_list = split_string(img, 3)
for idx, im in enumerate(img_list):
cv2.imwrite("%s.jpg" % idx, im)
3. 效果图
原图如下:
切割后变为3条:
感兴趣的同学可以看看!