В этом примере показано, как использовать 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);

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);

Здесь логотип в визитке неправильно классифицируется как текстовый символ. Эти типы ошибок OCR могут быть идентифицированы с использованием доверительных значений до любой дальнейшей обработки.
ocr лучше всего, когда текст расположен на однородном фоне и отформатирован как документ. Когда текст появляется на неоднородном фоне, требуются дополнительные этапы предварительной обработки, чтобы получить лучшие результаты OCR. В этой части примера вы попытаетесь найти цифры на клавиатуре. Хотя изображение клавиатуры может показаться простым для OCR, на самом деле это довольно сложно, поскольку текст находится на неоднородном фоне.
I = imread('keypad.jpg');
I = im2gray(I);
figure;
imshow(I)
% Run OCR on the image
results = ocr(I);
results.Textans =
'
'
Пустое 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');
После пороговой обработки двоичное изображение не содержит текста. Вот почему ocr не удалось распознать текст в исходном изображении. Можно улучшить результаты, предварительно обработав изображение для улучшения сегментации текста. В следующей части примера рассматриваются два полезных метода предварительной обработки.
Плохая сегментация текста, наблюдаемая выше, вызвана неоднородным фоном на изображении, т.е. светло-серыми клавишами, окруженными темно-серыми. Для удаления изменений фона и улучшения сегментации текста можно использовать следующий метод предварительной обработки. Дополнительные сведения об этом методе приведены в примере «Правильное неравномерное освещение и анализ объектов переднего плана».
% Remove keypad background. Icorrected = imtophat(I,strel('disk',15)); BW1 = imbinarize(Icorrected); figure; imshowpair(Icorrected,BW1,'montage');

После удаления изменения фона цифры становятся видимыми в двоичном изображении. Однако есть несколько артефактов на краю клавиш и небольшой текст рядом с цифрами, которые могут продолжать препятствовать точному 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');

После этих этапов предварительной обработки цифры теперь хорошо сегментированы от фона и 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);

Другой подход к улучшению результатов заключается в использовании априорных знаний о тексте в изображении. В этом примере интересующий вас текст содержит только цифры. Можно улучшить результаты, ограничив 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);

В некоторых ситуациях только предварительной обработки изображения может быть недостаточно для достижения хороших результатов 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);

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

Дальнейшая обработка на основе отношения сторон области применяется для идентификации областей, которые, вероятно, содержат один символ. Это помогает удалить меньшие текстовые символы, которые скрещиваются рядом с цифрами. В общем, чем больше текст, тем проще для него 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);

Остальные регионы могут быть переданы в 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)
Хотя vision.BlobAnalysis позволяет найти цифры в изображении клавиатуры, это может не так хорошо работать для изображений естественных сцен, где есть много объектов в дополнение к тексту. Для этих типов изображений техника, показанная в примере, озаглавленном Автоматическое обнаружение и распознавание текста в естественных изображениях, может обеспечить лучшие результаты обнаружения текста.
В этом примере показано, как ocr функция может использоваться для распознавания текста в изображениях, и как, казалось бы, легкое изображение для OCR требовало дополнительных этапов предварительной обработки для получения хороших результатов.
[1] Рэй Смит. Анализ компоновки гибридной страницы с помощью клавиши Tab-Stop Detection. Материалы десятой международной конференции по анализу и признанию документов. 2009.