圖片文本行切割

本文直接以二值化後的圖片作爲例子
上代碼:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt


def text_line_cutting(array_val, minimum_val=400, minimum_range=2):
    try:
        """
        從二值化圖片數組中切出文本行,文本行傾斜角度不宜過大
        :param array_val: 二值化後的圖片數組
        :param minimum_val: 每行的像素和最小值,大於這個最小值認爲是開始和結束的縱座標
        :param minimum_range: 行的上下邊間距
        :return peek_ranges: 行縱座標數組
        """
        start_i = None
        end_i = None
        peek_ranges = []
        for i, val in enumerate(array_val):
            # 如果val > minimum_val,則爲文本行,start is None,說明i爲行的縱座標開始
            if val > minimum_val and start_i is None:
                start_i = i
            # 如果val > minimum_val,start is Not None,說明i爲文本行中間
            elif val > minimum_val and start_i is not None:
                pass
            # 如果val < minimum_val,start is Not None,說明i爲文本行的縱座標結束
            elif val < minimum_val and start_i is not None:
                end_i = i
                if end_i - start_i >= minimum_range:
                    peek_ranges.append([start_i, end_i])
                # 找到行的開始結束後將,start_i、end_i置爲None,繼續遍歷尋找下一行
                start_i = None
                end_i = None
            elif val < minimum_val and start_i is None:
                pass
            else:
                raise ValueError("cannot parse this case...")
    except Exception as e:
        raise e
    return peek_ranges


if __name__ == '__main__':
    path = "11.jpg"
    image_open = 255 - cv2.imread(path, -1)
    # 橫向取和
    horizontal_sum = np.sum(image_open, axis=1)
    peek_ranges = text_line_cutting(horizontal_sum)

    plt.plot(horizontal_sum, range(horizontal_sum.shape[0]))
    plt.gca().invert_yaxis()
    plt.show()

參考至如何做文本行和文字分割
做了些註釋,瞭解詳情請參看上面的鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章