Как сегментировать рукописные и печатные цифры без потери информации в opencv? - PullRequest
0 голосов
/ 25 октября 2018

Я написал алгоритм, который обнаружил бы напечатанную и рукописную цифру и сегментировал ее, но при удалении внешнего прямоугольника рукописная цифра теряется при использовании clear_border из пакета ski-image.Любое предложение, чтобы предотвратить информацию.

Пример:
enter image description here

Как получить все 5 символов отдельно?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Сегментирование символов с изображения -

Подход -

  1. Порог изображения (преобразовать его в BW)
  2. Выполнение дилатации
  3. Проверкаконтуры достаточно большие
  4. Найдите прямоугольные контуры
  5. Возьмите ROI и сохраните символы

Код Python -

# import the necessary packages
import numpy as np
import cv2
import imutils

# load the image, convert it to grayscale, and blur it to remove noise
image = cv2.imread("sample1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (7, 7), 0)

# threshold the image
ret,thresh1 = cv2.threshold(gray ,127,255,cv2.THRESH_BINARY_INV)

# dilate the white portions
dilate = cv2.dilate(thresh1, None, iterations=2)

# find contours in the image
cnts = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]

orig = image.copy()
i = 0

for cnt in cnts:
    # Check the area of contour, if it is very small ignore it
    if(cv2.contourArea(cnt) < 100):
        continue

    # Filtered countours are detected
    x,y,w,h = cv2.boundingRect(cnt)

    # Taking ROI of the cotour
    roi = image[y:y+h, x:x+w]

    # Mark them on the image if you want
    cv2.rectangle(orig,(x,y),(x+w,y+h),(0,255,0),2)

    # Save your contours or characters
    cv2.imwrite("roi" + str(i) + ".png", roi)

    i = i + 1 

cv2.imshow("Image", orig) 
cv2.waitKey(0)

Прежде всегоЯ установил порог изображения, чтобы преобразовать его в черный и белый.Я получаю символы в белой части изображения и фона как черный.Затем я расширил изображение, чтобы сделать символы (белые части) более толстыми, это позволит легко найти соответствующие контуры.Затем метод findContours используется для поиска контуров.Затем нам нужно проверить, что контур достаточно велик, если контур недостаточно велик, то он игнорируется (потому что этот контур - шум).Затем метод boundingRect используется для поиска прямоугольника для контура.И, наконец, обнаруженные контуры сохраняются и рисуются.

Входное изображение -

Input

Порог -

Thresh

дилатация -

Dilate

Контуры -

Contours

Сохраненные символы -

char2 char0 char1 char3

0 голосов
/ 31 октября 2018

Проблема стертых / обрезанных рукописных цифр: вы можете решить эту проблему на этапе распознавания или даже на этапе улучшения изображения (до распознавания).

  • , если толькоочень маленькая часть цифры обрезается (например, изображение), достаточно подложить изображение на 1 или 2 пикселя, чтобы облегчить процесс сегментации.Или какой-то морфофильтр (расширенный) может улучшить ваши цифры даже после заполнения(это решение доступно в Opencv)
  • если обрезана достаточно большая часть цифры, вам нужно добавить ухудшенный / обрезанный набор цифр в обучающий набор данных, используемый для алгоритма распознавания цифр (т.е. цифра 3 свсе возможные случаи обрезки .. и т. д.)

Проблема разделения символов:

  • opencv предлагает алгоритм обнаружения BLOB-объектов, который хорошо работает на вашемвыпуск (выберите правильное значение для параметров вогнутости и выпуклости)

  • opencv предлагает также детектор контура ( canny () * функция 1022 *), который помогает определять контурызатем вы можете найти подходящую ограничивающую рамку (также предлагаемую Opencv: cv2.approxPolyDP (контур, .., ..) ) вокруг каждого символа

...