fox_12
@fox_12
Расставляю биты, управляю заряженными частицами

Выделить центральный символ на изображении?

Нарезаю изображение на символы для распознавания примерно так:

ret, im_th = cv2.threshold(im_gray, th, 255, cv2.THRESH_BINARY_INV)
    im2, ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    rects = [cv2.boundingRect(ctr) for ctr in ctrs]

    i = 0

    for rect in rects:
        
        leng = int(rect[3] * 1.6)
        pt1 = int(rect[1] + rect[3] // 2 - leng // 2)
        pt2 = int(rect[0] + rect[2] // 2 - leng // 2)
        roi = im_th[pt1:pt1+leng, pt2:pt2+leng]

        if (roi.shape[0]>20 and roi.shape[0]<100) and (roi.shape[1]>20 and roi.shape[1]<100):
            roi = cv2.resize(roi, (28, 28), interpolation=cv2.INTER_AREA)
            roi = cv2.dilate(roi, (3, 3))
            cv2.rectangle(img, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), (0, 255, 0), 3)
            print(roi)
            i += 1
            cv2.imwrite(f'./indata/sample_c{i}.jpg', roi)


Получается много изображений вида:
5b9269b3d2154957949153.jpeg5b9269c57c7a9326814090.jpeg5b9269d19f34b035651696.jpeg5b9269db96ea1089858371.jpeg

Каким образом проще всего можно выделить и оставить только центральный символ и убрать мусор справа и слева (куски других символов)?
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AAEgorovich
Можно запомнить область символа и заполнить нулями по его границам:
x1 = rect[0] - pt2
x2 = rect[0] + rect[2] - pt2
....
if (roi.shape[0]>20 and roi.shape[0]<100) and (roi.shape[1]>20 and roi.shape[1]<100):
roi = cv2.resize(roi, (28, 28), interpolation=cv2.INTER_AREA)
x1=int(x1*28/leng)
x2=int(x2*28/leng)
roi[:,:x1]=0
roi[:,x2:]=0
...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы