Вот простой подход:
- Преобразование в оттенки серого
- Порог Оцу
- Поиск контуров, сортировка контуров слева направо направо и фильтруем, используя область контура
- Извлечение ROI
После определения порога Оцу для получения двоичного изображения мы сортируем контуры слева направо, используя imutils.contours.sort_contours()
. Это гарантирует, что, когда мы перебираем каждый контур, у нас есть каждый символ в правильном порядке. Кроме того, мы фильтруем, используя минимальную пороговую площадь, чтобы удалить небольшой шум. Вот обнаруженные символы
Мы можем извлечь каждый символ, используя Numpy нарезку. Вот каждый сохраненный символ ROI
import cv2
from imutils import contours
# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray,0,255,cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]
# Find contours, sort from left-to-right, then crop
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts, _ = contours.sort_contours(cnts, method="left-to-right")
ROI_number = 0
for c in cnts:
area = cv2.contourArea(c)
if area > 10:
x,y,w,h = cv2.boundingRect(c)
ROI = 255 - image[y:y+h, x:x+w]
cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
ROI_number += 1
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()