exponenta event banner

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

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

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

Распознавание текста в изображениях полезно во многих приложениях компьютерного зрения, таких как поиск изображений, анализ документов и навигация роботов. 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 Функция

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 и «глобальный» метод по умолчанию в 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.

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. 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.