用传统算法将较长的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条:    

 

 

感兴趣的同学可以看看!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值