Использование opencv для размещения ограничивающих рамок вокруг чисел и слов - PullRequest
0 голосов
/ 05 мая 2019

В настоящее время я пытаюсь написать программу, которая может определять рукописные числа и математические слова, такие как log и sin. Тем не менее, прямо сейчас, как написано, моя программа может обнаруживать только отдельные символы, поэтому, в то время как числа обнаруживаются очень хорошо, слова обнаруживаются как отдельные буквы. Прилагается мой текущий код.

import cv2
import numpy as np
from PIL import Image, ImageOps


img = cv2.imread("example.JPG")

morph = img.copy()

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1))
morph = cv2.morphologyEx(morph, cv2.MORPH_CLOSE, kernel)
morph = cv2.morphologyEx(morph, cv2.MORPH_OPEN, kernel)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 15))

# take morphological gradient
gradient_image = cv2.morphologyEx(morph, cv2.MORPH_GRADIENT, kernel)

gray = cv2.cvtColor(gradient_image, cv2.COLOR_BGR2GRAY)

#take this out?
img_grey = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)

# blur = cv2.medianBlur(gray,5)

blur = cv2.medianBlur(img_grey,3)


ret, thing = cv2.threshold(blur, 0.0, 255.0, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

img_dilation = cv2.dilate(thing, kernel, iterations=3)

cv2.imwrite("check_equal.jpg", img_dilation)

conturs_lst = cv2.findContours(img_dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]


coor_lst = []
for cnt in conturs_lst:
    x,y,w,h = cv2.boundingRect(cnt)
    if w < 15 or h < 15:
        continue
    coor_lst.append((x,y,w,h))




Как можно было бы сохранить то же поведение для чисел, но каким-то образом позволить программе обнаруживать, что вещи - это слова, ограничивающие рамки вокруг всего слова?

1 Ответ

1 голос
/ 05 мая 2019

Ваша проблема:

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

Ваши варианты:

  1. заставить вашу программу понять, что она на самом деле видит (сравнить с известными контурами каждой буквы / цифры, использовать машинное обучение и т. д.), а затем проанализировать информацию более высокого уровня.Определение значения рукописного символа является канонической проблемой машинного обучения и поэтому выходит за рамки простого ответа SO.Ресурсы по этому вопросу можно найти в качестве решений для набора данных MNIST.Одним из примеров является то, что вы будете подавать культуры вокруг каждого из ваших контуров в [вставьте алгоритм ML], обученный на MNIST, который будет их идентифицировать.Затем вы будете использовать некоторую логику для группировки символов в слова на основе [вставьте эвристику, возможно, через интервал].
  2. найдите некоторую простую эвристику, которая очень хорошо отделяет контур чисел / групп чисел от контуровбукв / слов.Это будет работать в очень простых обстоятельствах, когда вы можете настроить все вручную.Измените почерк, стиль или интервал, и он выходит из окна, но все зависит от объема вашего проекта

Цитаты: Годы исследований в области компьютерного зрения https://en.wikipedia.org/wiki/MNIST_database#Dataset

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...