Python: Сегментация изображений как предварительный процесс для классификации

Какую технику вы рекомендуете сегментировать символы на этом изображении, чтобы быть готовыми к подаче модели, такой как те, которые используются с набором данных MNIST; потому что они берут по одному персонажу за раз. Этот вопрос безразличен в важности преобразования изображения и его бинаризации.

Благодаря!

введите описание изображения здесь

2 Solutions collect form web for “Python: Сегментация изображений как предварительный процесс для классификации”

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

  1. Используйте порог OTSU.
  2. Затем выполните некоторые морфологические операции, чтобы избавиться от шума и изолировать каждую цифру.
  3. Запускайте подключенные компоненты.
  4. Подтвердите каждый подключенный компонент к вашему классификатору, чтобы узнать цифру, если оценка классификации низкая.
  5. Заключительную проверку вы ожидаете, что вся цифра будет более или менее на линии и в более или менее некотором постоянном расстоянии друг от друга.

Вот первые 4 этапа. Теперь вам нужно добавить программное обеспечение распознавания, чтобы распознавать цифры.

import cv2 import numpy as np from matplotlib import pyplot as plt # Params EPSSILON = 0.4 MIN_AREA = 10 BIG_AREA = 75 # Read img img = cv2.imread('i.jpg',0) # Otzu threshold a,thI = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) # Morpholgical se = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(1,1)) thIMor = cv2.morphologyEx(thI,cv2.MORPH_CLOSE,se) # Connected compoent labling stats = cv2.connectedComponentsWithStats(thIMor,connectivity=8) num_labels = stats[0] labels = stats[1] labelStats = stats[2] # We expect the conneccted compoennt of the numbers to be more or less with a constats ratio # So we find the medina ratio of all the comeonets because the majorty of connected compoent are numbers ratios = [] for label in range(num_labels): connectedCompoentWidth = labelStats[label,cv2.CC_STAT_WIDTH] connectedCompoentHeight = labelStats[label, cv2.CC_STAT_HEIGHT] ratios.append(float(connectedCompoentWidth)/float(connectedCompoentHeight)) # Find median ratio medianRatio = np.median(np.asarray(ratios)) # Go over all the connected component again and filter out compoennt that are far from the ratio filterdI = np.zeros_like(thIMor) filterdI[labels!=0] = 255 for label in range(num_labels): # Ignore biggest label if(label==1): filterdI[labels == label] = 0 continue connectedCompoentWidth = labelStats[label,cv2.CC_STAT_WIDTH] connectedCompoentHeight = labelStats[label, cv2.CC_STAT_HEIGHT] ratio = float(connectedCompoentWidth)/float(connectedCompoentHeight) if ratio > medianRatio + EPSSILON or ratio < medianRatio - EPSSILON: filterdI[labels==label] = 0 # Filter small or large compoennt if labelStats[label,cv2.CC_STAT_AREA] < MIN_AREA or labelStats[label,cv2.CC_STAT_AREA] > BIG_AREA: filterdI[labels == label] = 0 plt.imshow(filterdI) # Now go over each of the left compoenet and run the number recognotion stats = cv2.connectedComponentsWithStats(filterdI,connectivity=8) num_labels = stats[0] labels = stats[1] labelStats = stats[2] for label in range(num_labels): # Crop the bounding box around the component left = labelStats[label,cv2.CC_STAT_LEFT] top = labelStats[label, cv2.CC_STAT_TOP] width = labelStats[label, cv2.CC_STAT_WIDTH] height = labelStats[label, cv2.CC_STAT_HEIGHT] candidateDigit = labels[top:top+height,left:left+width] # plt.figure(label) # plt.imshow(candidateDigit) 

OTSU thrshold image

Я подключаюсь к ответу Амитай.

Для 2: я буду использовать истончение как морфологическую операцию (смотрим алгоритм прореживания в opencv )

Для 3: И в OpenCV 3.0 уже есть функция cv :: connectedComponents )

Надеюсь, поможет

  • Аргумент Python argparse: аргумент командной строки, который может быть либо именованным, либо позиционным
  • Как заставить SQLAlchemy в Tornado быть асинхронным?
  • Tweepy - исключить Retweets
  • VirtualEnv / Pip пытается установить пакеты по всему миру
  • Python не может найти модуль NLTK
  • Как сохранить данные Django ModelForm?
  • Есть ли причина, по которой Python 3 перечисляет медленнее, чем Python 2?
  • Группировка последовательных дат вместе с Python
  • Различие XGBoost в тренировочных и тестовых функциях после преобразования в DMatrix
  • Поддерживает ли python юникод за пределами базовой многоязычной плоскости?
  • Написание и чтение одного и того же файла csv в Python
  • Python - лучший язык программирования в мире.