Распознайте текст Используя оптическое распознавание символов (OCR)

В этом примере показано, как использовать ocr функция от Computer Vision 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 = rgb2gray(I);

figure;
imshow(I)

% 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 =

  0×0 empty char array

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

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

BW = imbinarize(I);

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

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

Отобразите методы предварительной обработки, чтобы улучшить результаты

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

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

Основанная на 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);

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

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

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

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

figure; 
imshow(img)

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

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

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

Ссылки

[1] Рэй Смит. Гибридный Анализ Макета страницы через Обнаружение Позиции табуляции. Продолжения 10-й международной конференции по вопросам анализа документа и распознавания. 2009.