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

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

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

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

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