Как централизовать и изменить размеры цифр с помощью opencv?

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

Рассматривая пример набора рукописных цифр, который поставляется с OpenCVЯ вижу, что цифры централизованы и изменены до (20, 20):

Поскольку это может быть довольно распространенной проблемой, мне интересно, если алгоритм уже реализован в OpenCV (или же numpy, scipyи т. д.), поэтому мне не нужно изобретать велосипед.

Вопрос: есть ли в Python встроенный конвейер для нормализации сэмплов?

2 ответа

Решение

Встроенный конвейер не уверен, но вы можете реализовать свой собственный, учитывая, что у вас уже есть контуры, выполнив следующее (основываясь на моем комментарии):

Получите ограничивающий прямоугольник контура (поэтому центрируясь на нем) и обрежьте эту часть:

x,y,w,h = cv2.boundingRect(cnt)
imgCrop = img[x:(x+w), y:(y+h)]

Изменить размер изображения до желаемого размера (скажем, 20 х 20):

imgResized = cv2.resize(imgCrop, (20,20))   

Вы также можете изменить размер осей в определенном соотношении, например:

imgResized = cv2.resize(imgCrop, (0,0), fx=0.5, fy=0.5)  

или с scipy (как предложено в этом вопросе):

imgResized = scipy.misc.imresize(imgCrop, 0.5)  

Бонус: посмотрите этот замечательный учебник по базовым манипуляциям с изображениями с помощью Python и OpenCV, где они показывают другой способ изменения размера с учетом соотношения сторон и интерполяций для улучшения результатов, извлекая из него:

imgResized = cv2.resize(imgCrop, (20,20), interpolation = cv2.INTER_AREA)

Я в конечном итоге с помощью этой функции:

def norm_digit(im):
    h, w = im.shape
    if h > w:
        top, left = round(h * 0.1), round((1.2 * h - w) / 2)
    else:
        top, left = round(w * 0.1), round((1.2 * w - h) / 2)

    return cv2.resize(
        cv2.copyMakeBorder(im, top, top, left, left, cv2.BORDER_CONSTANT), 
        (20, 20)
    )

Ввод - это изображение, уже обрезанное до ограничительной рамки контура цифры. Есть некоторые угловые случаи, которые он не охватывает, но, похоже, это может быть достаточно хорошо.

Другие вопросы по тегам