Если у всех ваших документов есть изображение в правом углу, а остальная часть - текст, то один из способов сделать это - преобразовать изображение в черно-белое, сделать морфологическое закрытие, чтобы закрыть некоторые пробелы с помощью С уважением к тексту и подвести итог каждой строке. Затем вы можете найти точку, где есть очень большой всплеск, который обозначает, где начинается текст. Причина, по которой это работает, заключается в том, что текст охватывает большую часть столбцов в изображении для каждой строки, тогда как изображение охватывает только небольшую часть столбцов. Когда вы пройдете вниз по каждой строке и вычислите общее количество ненулевых пикселей в каждой строке, вы будете получать относительно небольшие суммы, пока не встретите первую строку текста, которая даст вам очень большие изменения в профиле суммы. Где происходит это изменение, где начинается ваш текст. Вы можете обрезать от этой точки до конца документа. Я хотел бы отметить одну вещь: ваш текст темный на светлом фоне. При преобразовании в двоичный код нам нужно инвертировать этот белый текст на темном фоне, чтобы сработала сумма строки logi c.
Примерно так может работать:
import cv2
import numpy as np
# Read in image, convert to grayscale, then convert to binary
im = cv2.imread('OghQo.jpg') # Downloaded from Stack Overflow and read offline
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
_, im_bw = cv2.threshold(im_gray, 5, 255, cv2.THRESH_BINARY_INV)
# Performing morphological closing
se = np.ones((20, 30), dtype=np.uint8)
im_bw2 = cv2.morphologyEx(im_bw, cv2.MORPH_CLOSE, se)
# Calculate row sums
row_sums = im_bw2.sum(axis=1)
# Find the row which exceeds the threshold
threshold_row = 80000
row_index = np.argmax(row_sums > threshold_row)
# Crop the image with a bit of breathing room
buffer_size = 10
crop = im[row_index - buffer_size:]
# Show the image
cv2.imshow("Cropped", crop)
cv2.waitKey(0)
cv2.destroyAllWindows()
Порог, с которым я играл, пока не получил что-то разумное. Теперь мы получаем: