Этот ответ основан на предположении, что изображения похожи друг на друга (например, их размер, толщина стен, буквы ...).Если это не так, это не будет хорошим подходом, потому что вам придется менять пороги для каждого изображения.При этом я бы попытался преобразовать изображение в двоичный файл и искать контуры.После этого вы можете добавить критерий, как рост, вес и т. Д., Чтобы отфильтровать стены.После этого Вы можете нарисовать контуры на маске, а затем расширить изображение.Это объединит буквы, расположенные близко друг к другу, в один контур.Затем вы можете создать ограничивающую рамку для всех контуров, которые являются вашей ROI.Затем вы можете использовать любое распознавание текста в этом регионе.Надеюсь, это поможет немного.Приветствия!
Пример:
import cv2
import numpy as np
img = cv2.imread('floor.png')
mask = np.zeros(img.shape, dtype=np.uint8)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, threshold = cv2.threshold(gray,150,255,cv2.THRESH_BINARY_INV)
_, contours, hierarchy = cv2.findContours(threshold,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
ROI = []
for cnt in contours:
x,y,w,h = cv2.boundingRect(cnt)
if h < 20:
cv2.drawContours(mask, [cnt], 0, (255,255,255), 1)
kernel = np.ones((7,7),np.uint8)
dilation = cv2.dilate(mask,kernel,iterations = 1)
gray_d = cv2.cvtColor(dilation, cv2.COLOR_BGR2GRAY)
_, threshold_d = cv2.threshold(gray_d,150,255,cv2.THRESH_BINARY)
_, contours_d, hierarchy = cv2.findContours(threshold_d,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
for cnt in contours_d:
x,y,w,h = cv2.boundingRect(cnt)
if w > 35:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
roi_c = img[y:y+h, x:x+w]
ROI.append(roi_c)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Результат: