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