2012-03-21 2 views
2

Это вопрос Prepare complex image for OCR.Слияние краев и областей заполнения

У меня есть выход на хитром детекторе края изображения с помощью цифр:

Canny edge image

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

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

Morphological close operation

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

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

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

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

+0

Valentin, я работаю над той же проблемой, что и вы (чтение кредитных карт с помощью OCR). У меня был некоторый успех, используя tesseract для чтения изображений после ручной предварительной обработки, но я все еще боюсь автоматизировать эти процессы. Мне было интересно, какое решение вы в конечном итоге решили? Доступен ли ваш код в любом месте? Мне бы хотелось сравнить с вами заметки. – bjmc

+0

Вы можете отправить мне письмо (www.valentin-manthei.de) если хотите. Я осознал OCR с помощью собственного подхода, используя методы сопоставления шаблонов/признаков и дополнительные критерии для улучшения результатов. Тем не менее, препроцессинг - это худшая часть. Целая цепь фильтров, которая динамически настраивает свои параметры, теперь в конечном итоге может полностью сканировать номера кредитных карт, но только при хороших обстоятельствах (молния, разрешение). – valentin

ответ

2

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

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

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

Update, просто попытался мой OCR дозвона по кредитной карте, бинаризацию ниже:

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

+0

Большое спасибо за ваше мнение. Это результат с ядром 40x40 и алгоритмом sauvola: http://i.imgur.com/QWlPc.jpg (я не нашел источник sauvola в JavaOCR, хотя). Результат очень шумный, но это, вероятно, можно оптимизировать с использованием размытого гауссовского размытия. Однако я не уверен, как это решает проблему частичных цифр, которые не подходят для распознавания символов (я получаю только контуры со всеми подходами). – valentin

+0

Поскольку sauvola использует Mx и дисперсию по всему миру, он уже обладает свойствами фильтра нижних частот. Но, очевидно, недостаточно для серебра, отражающего пластиковые поверхности. В этом примере мой код нарезки не смог извлечь глифы, но я полагаю, что распознавание на основе вероятности, которое я использую в JavaOCR, будет очень хорошо работать на шрифте номера кредитной карты, даже если изображение искажено –

1

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

// 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, который читает кредитные карты. Чтение тисненых символов очень сложно при обработке предварительного изображения, потому что освещение сильно меняется. Вам лучше использовать машинное обучение.

Смежные вопросы