Как разделить очень близкие символы в двоичном изображении для OCR в Matlab?

Я сделал базовую систему OCR в Matlab, используя корреляцию. (Это не профессиональный проект, только как упражнение, и я не использую функцию ocr() в Matlab). Мой код работает почти корректно для чистых текстовых изображений. Но если я немного усложню задачу (сделаю текстовую фотографию для бокового положения под углом), мой код не даст хороших результатов. Я использую анализ основных компонентов для правильного выравнивания текста, но если я сделаю это (сфотографирую под углом), символы будут очень близко друг к другу, и я не смогу разделить их для процесса распознавания.

Исходное изображение и после предварительной обработки (адаптивное пороговое значение, настройка, PCA)

Исходное изображение и после предварительной обработки (адаптивное пороговое значение, настройка, PCA)

Как правильно разделить символы?


person Ahmet Anil    schedule 03.10.2017    source источник
comment
Пожалуйста, предоставьте свой код, в настоящее время ваш вопрос не по теме.   -  person RobAu    schedule 03.10.2017
comment
@RobAu: просмотр кода не поможет. Это вопрос метода.   -  person Yves Daoust    schedule 03.10.2017
comment
@YvesDaoust Я не согласен. Я думаю, что проблема может быть в предварительной обработке, и в настоящее время у нас нет возможности увидеть, что было сделано.   -  person RobAu    schedule 03.10.2017
comment
(как видно, отверстие в букве «А» заполняется, поэтому, вероятно, происходит слишком большое расширение или адаптивная пороговая установка недостаточно агрессивна)   -  person RobAu    schedule 03.10.2017
comment
@RobAu: Прикосновение к символам — распространенная проблема, и адаптивное пороговое значение — хорошая отправная точка. Не существует волшебного метода, который сработает в любом случае. Бьюсь об заклад, что регулировка порога заставит другие части персонажей исчезнуть до того, как они разделятся (чего они, возможно, никогда не сделают).   -  person Yves Daoust    schedule 03.10.2017
comment
stackoverflow.com/q/2636172/461499   -  person RobAu    schedule 03.10.2017


Ответы (2)


Альтернативой тому, что предлагает Ив, является разрушение образа. Что реализовано как imerode в Matlab. Возможно, сначала масштабируйте изображение (хотя здесь это не нужно)

например с этим кодом

ocr(imerode(I,strel('disk',3)))

где я ваше "БУЛЕВОЕ" черно-белое изображение, я получаю

ocrText with properties:
                  Text: 'BOOLEAN↵↵'
CharacterBoundingBoxes: [9×4 double]
  CharacterConfidences: [9×1 single]
                 Words: {'BOOLEAN'}
     WordBoundingBoxes: [14 36 208 43]
       WordConfidences: 0.5477
person Nicky Mattsson    schedule 03.10.2017

Разделение символов — довольно сложная проблема.

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

На самом деле, чтобы метод был эффективным, он должен быть осведомлен о шрифтах, т.е. знать заранее, как выглядит алфавит. Другими словами, вы не можете отделить сегментацию от распознавания.

Можно попытаться разложить каплю, предположительно состоящую из соприкасающихся символов (возможно, на основе проекций или известных размеров символов), выполнить распознавание и проверить результаты распознавания. Желательно попробовать несколько декомпозиций и оставить лучшую.

person Yves Daoust    schedule 03.10.2017