用传统算法将较长的OCR图片分割

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条:    

感兴趣的同学可以看看!

猜你喜欢

转载自blog.csdn.net/Guo_Python/article/details/110558505