Объединить края и заполнить области - PullRequest
2 голосов
/ 21 марта 2012

Этот вопрос является продолжением Подготовить комплексное изображение для распознавания текста .

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

Canny edge image

Как видите, у меня есть различные края для цифры, которые являются результатом тиснения на кредитной карте.Цель состоит в том, чтобы иметь сплошные цифры, подходящие для распознавания символов.

Это попытка «заполнить» цифры с помощью морфологической операции закрытия с помощью структурирующего элемента 5x5 в форме ромба:

Morphological close operation

Я пробовал различные структурирующие элементы, но без особого успеха.Вы можете видеть, как создаются отверстия (цифры 9 и 0) и формы искажаются (цифры 3).

Можете ли вы порекомендовать лучший подход для заполнения структур, но без склеивания разных цифр и сохраненияисходная форма?

Однако даже после плохо выглядящих цифр и разделения цифр по вертикали после применения операции закрытия уже есть хорошие результаты распознавания.

Спасибо, Валентин

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

enter image description here Я думаю, что вы можете достичь лучших результатов с помощью передовых методов бинаризации в оттенках серого, таких как бинаризация сауволы с большим ядром (я использую 50x50).Этот пороговый фильтр учитывает локальную дисперсию значений оттенков серого и не чувствителен к изменениям предела.Он также имеет некоторые свойства верхних и нижних частот в зависимости от настроек.См. Реализацию в JavaOCR Project:

http://sourceforge.net/projects/javaocr/

(PS: ядра 50x50 не проблема - эта скорость реализации не зависит от размера ядра)

Обновление, только что попробовал мойНомеронабиратель OCR на кредитной карте, результат бинаризации приведен ниже:

Отражающие поверхности производят много шума, но я думаю, что это можно сделать с помощью некоторой дополнительной предварительной обработки.

1 голос
/ 04 декабря 2016

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

// OTSU, then binary threshold
Imgproc.threshold(colorImg, grayImg, 0, 255.0, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);

// Morphological reduction of noise, strengthen lines
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(7, 7));
Imgproc.dilate(grayImg, grayImg2, element);
Imgproc.erode(grayImg2, grayImg, element);

// Edge detection
Imgproc.Canny(grayImg, output, 50, 50);

Однако вы должны посмотреть на card.io , который читает кредитные карты.Считать рельефные символы очень сложно с предварительной обработкой изображения, потому что освещение сильно варьируется.Вам лучше использовать машинное обучение.

...