Если исходное изображение выглядит так (см. Выше), тогда я могу успешно ввести пробел между двумя строками и получить это изображение (ниже) )
с использованием кода ниже:
import os
import cv2
def space_between_lines_and_skewness_correction(file_path):
img = cv2.imread(os.path.expanduser(file_path))
grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
th, threshed = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
pts = cv2.findNonZero(threshed)
ret = cv2.minAreaRect(pts)
(cx, cy), (w, h), ang = ret
if w < h:
w, h = h, w
ang += 90
M = cv2.getRotationMatrix2D((cx, cy), ang, 1.0)
rotated = cv2.warpAffine(threshed, M, (img.shape[1], img.shape[0]))
hist = cv2.reduce(rotated, 1, cv2.REDUCE_AVG).reshape(-1)
th = 2
H, W = img.shape[:2]
delimeter = [y for y in range(H - 1) if hist[y] <= th < hist[y + 1]]
arr = []
y_prev = 0
y_curr = 0
for y in delimeter:
y_prev = y_curr
y_curr = y
arr.append(rotated[y_prev:y_curr, 0:W])
arr.append(rotated[y_curr:H, 0:W])
space_arr = np.zeros((10, W))
final_img = np.zeros((1, W))
for im in arr:
v = np.concatenate((space_arr, im), axis=0)
final_img = np.concatenate((final_img, v), axis=0)
return final_img
Приведенный выше код удалит асимметрию и освободит пробел. Но в некоторых случаях приведенный выше код не работает. Это такие случаи, как: Выходные данные для изображения
Как обрабатывать такие случаи, как этот?
Примечание: Я попытался изменить размер к большему размеру и сделать попиксельное итерирование и создать собственный алгоритм для этого случая, но это занимает огромное количество времени, чтобы решить и иногда дает ошибку памяти.
Пожалуйста, обратите внимание: ввод приведенного выше кода на самом деле является обратным изображением (белый фон) изображения, представленного здесь