Вот простой подход:
- Преобразование в оттенки серого
- Порог Оцу
- Поиск контуров, сортировка контуров слева направо и фильтрация по контуруarea
- Извлечение ROI
После определения порога Оцу для получения двоичного изображения мы сортируем контуры слева направо, используя imutils.contours.sort_contours()
. Это гарантирует, что, когда мы перебираем каждый контур, у нас есть каждый символ в правильном порядкеКроме того, мы фильтруем, используя минимальную пороговую площадь, чтобы удалить небольшой шум. Вот обнаруженные символы
Мы можем извлечь каждый символ, используя срез Numpy. Вот каждый сохраненный символ ROI
Если вы хотите другой способ, просто инвертируйте его
ROI = 255 - image[y:y+h, x:x+w]
import cv2
from imutils import contours
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]
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), 1)
ROI_number += 1
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()