У меня есть это изображение, которое содержит текст (цифры и алфавиты) в нем. Я хочу получить местоположение всего текста и чисел, присутствующих на этом изображении. Также я хочу извлечь весь текст.
Как я могу получить кординаты, а также весь текст (цифры и алфавиты) в моем изображении. Например, 10B, 44, 16, 38, 22B и т. Д.
python
opencv
machine-learning
image-processing
deep-learning
Пулькит Бхатнагар
источник
источник
Ответы:
Вот потенциальный подход с использованием морфологических операций для фильтрации нетекстовых контуров. Идея заключается в следующем:
Получить бинарное изображение. Загрузите изображение, оттенки серого, затем порог Оцу
Удалить горизонтальные и вертикальные линии. Создать горизонтальные и вертикальные ядра, используя
cv2.getStructuringElement
затем удалить линии сcv2.drawContours
Удалите диагональные линии, круговые объекты и изогнутые контуры. Фильтруйте, используя область
cv2.contourArea
контура и аппроксимацию контура,cv2.approxPolyDP
чтобы изолировать нетекстовые контурыИзвлечение текста ROI и OCR. Найти контуры и фильтр для областей интереса, а затем OCR, используя Pytesseract .
Убраны горизонтальные линии, выделенные зеленым
Убраны вертикальные линии
Удалены разные нетекстовые контуры (диагональные линии, круглые объекты и кривые)
Обнаруженные текстовые области
источник
Хорошо, вот еще одно возможное решение. Я знаю, что вы работаете с Python - я работаю с C ++. Я дам вам несколько идей и, надеюсь, если вы захотите, вы сможете реализовать этот ответ.
Основная идея заключается в том, чтобы вообще не использовать предварительную обработку (по крайней мере, на начальном этапе), а вместо этого сосредоточиться на каждом целевом символе, получить некоторые свойства и отфильтровать каждый BLOB-объект в соответствии с этими свойствами.
Я пытаюсь не использовать предварительную обработку, потому что: 1) фильтры и морфологические стадии могут ухудшить качество сгустков и 2) ваши целевые сгустки обладают некоторыми характеристиками, которые мы могли бы использовать, в основном: соотношение сторон и площадь .
Проверьте это, цифры и буквы кажутся выше, чем шире ... кроме того, они кажутся разными в пределах определенного значения площади. Например, вы хотите отбросить объекты "слишком широкие" или "слишком большие" .
Идея в том, что я буду фильтровать все, что не попадает в предварительно рассчитанные значения. Я изучил символы (цифры и буквы) и пришел с минимальными, максимальными значениями площади и минимальным соотношением сторон (здесь соотношение между высотой и шириной).
Давайте работать над алгоритмом. Начните с чтения изображения и изменения его размера до половины размеров. Ваше изображение слишком велико. Преобразовать в оттенки серого и получить двоичное изображение через отсу, вот в псевдокоде:
Круто. Мы будем работать с этим изображением. Вам нужно изучить каждый белый шарик и применить «фильтр свойств» . Я использую связанные компоненты со статистикой, чтобы пройти через каждый большой объект и получить его площадь и соотношение сторон, в C ++ это делается следующим образом:
Теперь мы применим фильтр свойств. Это всего лишь сравнение с заранее рассчитанными порогами. Я использовал следующие значения:
Внутри вашего
for
цикла сравните текущие свойства BLOB-объектов с этими значениями. Если тесты положительные, вы «рисуете» черную каплю. Продолжая внутриfor
цикла:После цикла создайте отфильтрованное изображение:
И ... вот и все. Вы отфильтровали все элементы, которые не похожи на то, что вы ищете. Запустив алгоритм вы получите такой результат:
Я также нашел Bounding Boxs от BLOB-объектов, чтобы лучше визуализировать результаты:
Как видите, некоторые элементы не обнаружены. Вы можете уточнить «фильтр свойств», чтобы лучше идентифицировать символы, которые вы ищете. Более глубокое решение, включающее немного машинного обучения, требует построения «идеального вектора признаков», извлечения признаков из BLOB-объектов и сравнения обоих векторов с помощью меры сходства. Вы можете также применить некоторые пост -переработкой улучшить результаты ...
Как бы то ни было, чувак, твоя проблема не просто и не легко масштабируема, и я просто даю тебе идеи. Надеюсь, вы сможете реализовать свое решение.
источник
Одним из способов является использование раздвижного окна (это дорого).
Определите размер символов на изображении (все символы имеют тот же размер, что и на изображении) и установите размер окна. Попробуйте тессеракт для обнаружения (входное изображение требует предварительной обработки). Если окно обнаруживает символы последовательно, сохраните координаты окна. Объедините координаты и получите регион по персонажам.
источник