Может быть, что-то вроде этого?
import cv2
import numpy as np
image = cv2.imread('plate.png')
# cv2.imshow('original', image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray', gray)
ret, thresh = cv2.threshold(gray, 60, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('thresh', thresh)
blur = cv2.medianBlur(thresh, 1)
kernel = np.ones((10, 20), np.uint8)
img_dilation = cv2.dilate(blur, kernel, iterations=1)
cv2.imshow('dilated', img_dilation)
im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# sort contours
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
for i, ctr in enumerate(sorted_ctrs):
# Get bounding box
x, y, w, h = cv2.boundingRect(ctr)
# Getting ROI
roi = image[y:y + h, x:x + w]
if (h > 50 and w > 50) and h < 200:
# show ROI
# cv2.imshow('segment no:'+str(i),roi)
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 255, 255), 1)
# cv2.waitKey(0)
cv2.imwrite('{}.png'.format(i), roi)
cv2.imshow('marked areas', image)
cv2.waitKey(0)
Это сэкономит вам всю рентабельность инвестиций, в которой вы нуждаетесь ...
(последнее изображение можно снова сегментировать)
... и сделать OCR для каждого символа.По моему мнению, это может быть проще, чем выполнять оптическое распознавание всего изображения.
Если вы установите порог для каждого изображения и добавите границу 5 пикселей, IDK, тогда весь процесс будет проще.