Распознавание текста с помощью оптического распознавания символов (OCR)

В этом примере показано, как использовать ocr функция из Computer Vision Toolbox™ для выполнения оптического распознавания символов.

Распознавание текста с помощью ocr Функция

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

% Load an image.
I = imread('businessCard.png');

% Perform OCR.
results = ocr(I);

% Display one of the recognized words.
word = results.Words{2}
word = 
'MathWorks®'
% Location of the word in I
wordBBox = results.WordBoundingBoxes(2,:)
wordBBox = 1×4

   173    75   376    61

% Show the location of the word in the original image.
figure;
Iname = insertObjectAnnotation(I,'rectangle',wordBBox,word);
imshow(Iname);

Figure contains an axes. The axes contains an object of type image.

Информация, возвращенная ocr Функция

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

% Find characters with low confidence.
lowConfidenceIdx = results.CharacterConfidences < 0.5;

% Get the bounding box locations of the low confidence characters.
lowConfBBoxes = results.CharacterBoundingBoxes(lowConfidenceIdx, :);

% Get confidence values.
lowConfVal = results.CharacterConfidences(lowConfidenceIdx);

% Annotate image with character confidences.
str      = sprintf('confidence = %f', lowConfVal);
Ilowconf = insertObjectAnnotation(I,'rectangle',lowConfBBoxes,str);

figure;
imshow(Ilowconf);

Figure contains an axes. The axes contains an object of type image.

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

Задачи получения точных результатов

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

I = imread('keypad.jpg');
I = im2gray(I);

figure;
imshow(I)

Figure contains an axes. The axes contains an object of type image.

% Run OCR on the image
results = ocr(I);

results.Text
ans = 
    ' 
     
     '

Пустой results.Text указывает, что текст не распознан. На изображении клавиатуры текст разреженный и расположен на нерегулярном фоне. В этом случае эвристика, используемая для анализа размещения документа в ocr возможно, не удается найти блоки текста в изображении, в результате чего не удается распознать текст. В этой ситуации отключение автоматического анализа размещения с помощью параметра 'TextLayout' может помочь улучшить результаты.

% Set 'TextLayout' to 'Block' to instruct ocr to assume the image
% contains just one block of text.
results = ocr(I,'TextLayout','Block');

results.Text
ans =

  0x0 empty char array

Что пошло не так?

Настройка параметра 'TextLayout' не помогла. Чтобы понять, почему OCR продолжает отказывать, вы должны исследовать начальный шаг бинаризации, выполненный в ocr. Можно использовать imbinarize проверить этот начальный шаг бинаризации, поскольку оба ocr и метод 'global' по умолчанию в imbinarize используйте метод Оцу для бинаризации изображений.

BW = imbinarize(I);

figure; 
imshowpair(I,BW,'montage');

Figure contains an axes. The axes contains an object of type image.

После порогового значения бинарное изображение не содержит текста. Вот почему ocr не удалось распознать текст в оригинальное изображение. Вы можете помочь улучшить результаты путем предварительной обработки изображения для улучшения сегментации текста. Следующая часть примера исследует два полезных метода предварительной обработки.

Методы предварительной обработки изображений для улучшения результатов

Плохая сегментация текста, увиденная выше, вызвана неоднородным фоном на изображении, то есть светло-серыми клавишами, окруженными темно-серым цветом. Можно использовать следующий метод предварительной обработки, чтобы удалить изменения фона и улучшить сегментацию текста. Дополнительные сведения об этом методе приведены в примере, озаглавленном «Правильное неоднородное освещение» и «Анализ объектов переднего плана».

% Remove keypad background.
Icorrected = imtophat(I,strel('disk',15));

BW1 = imbinarize(Icorrected);

figure; 
imshowpair(Icorrected,BW1,'montage');

Figure contains an axes. The axes contains an object of type image.

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

% Perform morphological reconstruction and show binarized image.
marker = imerode(Icorrected, strel('line',10,0));
Iclean = imreconstruct(marker, Icorrected);

BW2 = imbinarize(Iclean);

figure; 
imshowpair(Iclean,BW2,'montage');

Figure contains an axes. The axes contains an object of type image.

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

results = ocr(BW2,'TextLayout','Block');

results.Text
ans = 
    '«-1 ..c2 .3
     ....4 .5 .....6
     W7 M8 M9
     -*1..o fl
     
     '

В результатах присутствует некоторый «шум» из-за меньшего текста рядом с цифрами. Кроме того, цифра 0 ложно распознается как буква 'o'. Этот тип ошибки может возникнуть, когда два символа имеют одинаковые формы, и недостаточно окружающего текста для ocr функция для определения оптимальной классификации для определенного символа. Несмотря на «зашумленные» результаты, по-прежнему можно найти местоположения цифр в оригинальном изображении с помощью locateText метод с результатами OCR.

The locateText метод поддерживает регулярные выражения, поэтому можно игнорировать нерелевантный текст.

% The regular expression, '\d', matches the location of any digit in the
% recognized text and ignores all non-digit characters.
regularExpr = '\d';

% Get bounding boxes around text that matches the regular expression
bboxes = locateText(results,regularExpr,'UseRegexp',true);

digits = regexp(results.Text,regularExpr,'match');

% draw boxes around the digits
Idigits = insertObjectAnnotation(I,'rectangle',bboxes,digits);

figure; 
imshow(Idigits);

Figure contains an axes. The axes contains an object of type image.

Другой подход к улучшению результатов - априорное использование знаний о тексте в изображении. В этом примере интересующий вас текст содержит только числовые цифры. Можно улучшить результаты, ограничив ocr чтобы выбрать только лучшие соответствия из набора '0123456789'.

% Use the 'CharacterSet' parameter to constrain OCR
results = ocr(BW2, 'CharacterSet','0123456789','TextLayout','Block');

results.Text
ans = 
    ' 1 1   2   3
     5 4  5   06
      7  3  9
      4 1 0  51
     
     '

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

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

% Sort the character confidences.
[sortedConf, sortedIndex] = sort(results.CharacterConfidences, 'descend');

% Keep indices associated with non-NaN confidences values.
indexesNaNsRemoved = sortedIndex( ~isnan(sortedConf) );

% Get the top ten indexes.
topTenIndexes = indexesNaNsRemoved(1:10);

% Select the top ten results.
digits = num2cell(results.Text(topTenIndexes));
bboxes = results.CharacterBoundingBoxes(topTenIndexes, :);

Idigits = insertObjectAnnotation(I,'rectangle',bboxes,digits);

figure; 
imshow(Idigits);

Figure contains an axes. The axes contains an object of type image.

Обработка на основе ROI для улучшения результатов

В некоторых ситуациях только предварительной обработки изображения может быть недостаточно для достижения хороших результатов OCR. Один из подходов к использованию в этой ситуации состоит в том, чтобы идентифицировать конкретные области в изображении, которое ocr должен обработать. В изображении примера клавиатуры эти области будут теми, которые просто содержат цифры. Можно выбрать области вручную, используя imrect, или можно автоматизировать процесс. Один из методов автоматического обнаружения текста приведен в примере, озаглавленном «Автоматическое обнаружение и распознавание текста в естественных изображениях». В этом примере вы будете использовать vision.BlobAnalysis для поиска цифр на клавиатуре.

% Initialize the blob analysis System object(TM).
blobAnalyzer = vision.BlobAnalysis('MaximumCount',500);

% Run the blob analyzer to find connected components and their statistics.
[area,centroids,roi] = step(blobAnalyzer,BW1);

% Show all the connected regions.
img = insertShape(I,'rectangle',roi);
figure;
imshow(img);

Figure contains an axes. The axes contains an object of type image.

В изображении клавиатуры есть много связанных областей. Небольшие регионы вряд ли содержат какой-либо текст и могут быть удалены с помощью статистики области, возвращенной vision.BlobAnalysis. Здесь удаляются области, имеющие площадь менее 300.

areaConstraint = area > 300;

% Keep regions that meet the area constraint.
roi = double(roi(areaConstraint, :));

% Show remaining blobs after applying the area constraint.
img = insertShape(I,'rectangle',roi);
figure;
imshow(img);

Figure contains an axes. The axes contains an object of type image.

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

% Compute the aspect ratio.
width  = roi(:,3);
height = roi(:,4);
aspectRatio = width ./ height;

% An aspect ratio between 0.25 and 1 is typical for individual characters
% as they are usually not very short and wide or very tall and skinny.
roi = roi( aspectRatio > 0.25 & aspectRatio < 1 ,:);

% Show regions after applying the area and aspect ratio constraints.
img = insertShape(I,'rectangle',roi);
figure;
imshow(img);

Figure contains an axes. The axes contains an object of type image.

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

roi(:,1:2) = roi(:,1:2) - 4;
roi(:,3:4) = roi(:,3:4) + 8;
results = ocr(BW1, roi,'TextLayout','Block');

Распознанный текст можно отобразить на оригинальное изображение с помощью insertObjectAnnotation. The deblank функция используется для удаления любых конечных символов, таких как пустое пространство или новые линии. В этих результатах отсутствуют несколько классификаций (например, цифра 8), которые можно исправить с помощью дополнительных методов предварительной обработки.

text = deblank( {results.Text} );
img  = insertObjectAnnotation(I,'rectangle',roi,text);

figure; 
imshow(img)

Figure contains an axes. The axes contains an object of type image.

Хотя vision.BlobAnalysis позволяет вам найти цифры в изображении клавиатуры, это может не работать также для изображений естественных сцен, где существует много объектов в дополнение к тексту. Для этих типов изображений метод, показанный в примере, озаглавленном «Автоматическое обнаружение и распознавание текста в природных изображениях», может обеспечить лучшие результаты обнаружения текста.

Сводные данные

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

Ссылки

[1] Рэй Смит. Макет страницы с помощью Tab-Stop Detection. Материалы десятой международной конференции по анализу и признанию документов. 2009.