本文直接以二值化後的圖片作爲例子
上代碼:
# -*- 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()
參考至如何做文本行和文字分割
做了些註釋,瞭解詳情請參看上面的鏈接。