最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ocr

光学式文字認識を使用したテキストの認識

説明

txt = ocr(I) は、入力イメージ I からの光学式文字認識情報が含まれる ocrText オブジェクトを返します。このオブジェクトには、認識されたテキスト、テキストの位置、および認識の結果の信頼度を示すメトリクスが含まれます。

txt = ocr(I, roi) は、1 つ以上の四角形の領域内の I にあるテキストを認識します。roi 入力には、M 個の関心領域の M 行 4 列の行列が含まれます。

[___] = ocr(___,Name,Value) は、前述の構文のいずれかを使用し、1 つ以上の Name,Value 引数ペアで指定されたオプションを追加で使用します。

すべて折りたたむ

     businessCard   = imread('businessCard.png');
     ocrResults     = ocr(businessCard)
ocrResults = 
  ocrText with properties:

                      Text: '‘ MathWorks®...'
    CharacterBoundingBoxes: [103x4 double]
      CharacterConfidences: [103x1 single]
                     Words: {16x1 cell}
         WordBoundingBoxes: [16x4 double]
           WordConfidences: [16x1 single]

     recognizedText = ocrResults.Text;    
     figure;
     imshow(businessCard);
     text(600, 150, recognizedText, 'BackgroundColor', [1 1 1]);

イメージを読み取ります。

I = imread('handicapSign.jpg');

I 内にある 1 つ以上の四角形の関心領域を定義します。

roi = [360 118 384 560];

次のように、IMRECT を使用して、マウスで領域を選択することもできます。figure; imshow(I); roi = round(getPosition(imrect))

ocrResults = ocr(I, roi);

元のイメージへの認識されたテキストの挿入

Iocr = insertText(I,roi(1:2),ocrResults.Text,'AnchorPoint',...
    'RightTop','FontSize',16);
figure; imshow(Iocr);

     businessCard = imread('businessCard.png');
     ocrResults   = ocr(businessCard)
ocrResults = 
  ocrText with properties:

                      Text: '‘ MathWorks®...'
    CharacterBoundingBoxes: [103x4 double]
      CharacterConfidences: [103x1 single]
                     Words: {16x1 cell}
         WordBoundingBoxes: [16x4 double]
           WordConfidences: [16x1 single]

     Iocr         = insertObjectAnnotation(businessCard, 'rectangle', ...
                           ocrResults.WordBoundingBoxes, ...
                           ocrResults.WordConfidences);
     figure; imshow(Iocr);

businessCard = imread('businessCard.png');
ocrResults = ocr(businessCard);
bboxes = locateText(ocrResults, 'MathWorks', 'IgnoreCase', true);
Iocr = insertShape(businessCard, 'FilledRectangle', bboxes);
figure; imshow(Iocr);

入力引数

すべて折りたたむ

入力イメージ。M x N x 3 のトゥルーカラー、M 行 N 列の 2 次元グレースケール、またはバイナリ形式で指定します。入力イメージは、実数で非スパースの値でなければなりません。関数は、認識プロセスの前に、トゥルーカラー入力イメージまたはグレースケール入力イメージをバイナリ イメージに変換します。変換には Otsu しきい値手法が使用されます。OCR で最適な結果を得るには、入力イメージの小文字 ‘x’ または同等の文字の高さを 20 ピクセルより大きくしなければなりません。横軸または縦軸から +/- 10 度より大きなテキストの回転を除去して、認識の結果を改善します。

データ型: single | double | int16 | uint8 | uint16 | logical

1 つ以上の四角形の関心領域。M 行 4 列の要素の行列として指定します。M 個の各行は、入力イメージ内の関心領域を 4 要素ベクトル [x y width height] として指定します。ベクトルは、左上隅の位置 [x y] と、四角形の関心領域のサイズ [width height] をピクセル単位で指定します。各四角形は、入力イメージ I 内に完全に含まれていなければなりません。認識プロセスの前に、関数は Otsu しきい値手法を使用して、トゥルーカラー入力関心領域およびグレースケール入力関心領域をバイナリ領域に変換します。関数は、四角形の領域で認識されたテキストをオブジェクトの配列として返します。

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例:

入力テキストのレイアウト。'TextLayout' と文字ベクトル 'Auto''Block''Line' または 'Word' で構成されるコンマ区切りのペアとして指定します。

次の表に、関数が TextLayout の各設定に対してテキストをどのように処理するかを一覧表示します。

TextLayoutテキストの処理
'Auto'入力イメージ内のテキスト ブロックのレイアウトと読み取り順序を決定します。
'Block'イメージ内のテキストを 1 つのテキスト ブロックとして処理します。
'Line'イメージ内のテキストを 1 行のテキストとして処理します。
'Word'イメージ内のテキストをシングル ワードのテキストとして処理します。

自動レイアウト解析を使用すると、ドキュメントに二段組みなどの特定の形式が含まれる場合でも、スキャンしたドキュメントからテキストを認識できます。この設定によって、返されるテキストの読み取り順序が維持されます。入力イメージに含まれるテキストの領域が少ない、または要素の多いシーンにテキストがある場合は、良い結果が得られないことがあります。OCR で良い結果が得られない場合、イメージのテキストに適した別のレイアウトを試します。要素の多いシーンにテキストがある場合には、別のレイアウトを試すほかに、イメージのテキストの周りを ROI として指定してみてください。

認識する言語。'Language' と文字ベクトル 'English''Japanese'、または文字ベクトルの cell 配列で構成されるコンマ区切りのペアとして指定します。追加の言語の OCR 言語データ ファイルのインストール パッケージをインストールしたり、カスタム言語を追加したりすることもできます。複数の言語を指定すると、選択したすべての言語の同時認識が可能になります。ただし、1 つ以上の言語を選択すると、精度が低下し、OCR の実行にかかる時間が長くなる場合があります。

OCR 言語データ ファイルのインストール パッケージに含まれる追加言語を指定するには、組み込みの言語と同じ方法で言語を表す文字ベクトルを使用します。パスを指定する必要はありません。

txt = ocr(img,'Language','Finnish');

 サポート パッケージの OCR 言語のリスト

独自のカスタム言語を使用するには、学習済みのデータ ファイルへのパスを言語を表す文字ベクトルとして指定します。<language>.traineddata の形式でファイルに名前を付けなければなりません。ファイルは、'tessdata' という名前のフォルダーに含まれていなければなりません。たとえば、次のようにします。

txt = ocr(img,'Language','path/to/tessdata/eng.traineddata');
複数のカスタム言語を文字ベクトルの cell 配列として読み込むことができます。
txt = ocr(img,'Language', ...
               {'path/to/tessdata/eng.traineddata',...
                'path/to/tessdata/jpn.traineddata'});
保存フォルダーは、cell 配列で指定したすべてのファイルについて常に同じでなければなりません。前述の例では、cell 配列のすべての traineddata ファイルがフォルダー ‘path/to/tessdata’ に含まれます。次のコードは 2 つの異なる保存フォルダーを指定しているため、機能しません。
txt = ocr(img,'Language', ...
               {'path/one/tessdata/eng.traineddata',...
                'path/two/tessdata/jpn.traineddata'});
言語ファイルによっては別の言語に依存している場合があります。たとえば、ヒンディー語の学習は英語に依存します。ヒンディー語を使用する場合は、ヒンディー語の traineddata ファイルと同じフォルダーに英語の traineddata ファイルも含まれていなければなりません。ocr は、tesseract-ocr 3.02 または OCR トレーナーを使用して作成された traineddata ファイルのみをサポートします。

MATLAB® Coder™ によって生成された配布先の場合: 生成された OCR 実行可能ファイルと言語データ ファイル フォルダーが同一場所に存在しなければなりません。tessdata フォルダーの名前を tessdata にしなければなりません。

  • 英語の場合: C:/path/tessdata/eng.traineddata

  • 日本語の場合: C:/path/tessdata/jpn.traineddata

  • カスタム データ ファイルの場合: C:/path/tessdata/customlang.traineddata

  • C:/path/ocr_app.exe

次から英語と日本語の学習済みデータ ファイルをコピーできます。

fullfile(matlabroot, 'toolbox','vision','visionutilities','tessdata');

文字のサブセット。'CharacterSet' と文字ベクトルで構成されるコンマ区切りのペアとして指定します。既定の設定では、CharacterSet は空の文字ベクトル '' に設定されます。空のベクトルは、Language プロパティによって指定された言語のすべての文字を検索するように関数を設定します。このプロパティを少数の既知の文字に設定することで、分類プロセスを制限できます。

関数 ocr は、CharacterSet から最も適したものを選択します。入力イメージ内の文字に関する推測から得られる知識を使用すると、テキスト認識の精度の向上に役立ちます。たとえば、CharacterSet をすべての数字 '0123456789' に設定すると、関数はそれぞれの文字を数字のみに対してマッチングさせようとします。この場合、数字でない文字が誤って数字として認識される可能性があります。

出力引数

すべて折りたたむ

認識されたテキストとメトリクス。ocrText オブジェクトとして返されます。このオブジェクトには、認識されたテキスト、入力イメージ内で認識されたテキストの位置、および結果の信頼度を示すメトリクスが含まれます。信頼度の値の範囲は [0 1] で、これはパーセント単位の確率を表します。M 行 4 列の roi を指定すると、関数は ocrText オブジェクトの M 行 1 列の配列として ocrText を返します。

ocr で期待どおりの結果が得られない場合、以下のオプションを 1 つ以上試してみてください。

  • イメージ サイズを元のサイズの 2 ~ 4 倍大きくします。

  • イメージ内の文字の間隔が狭すぎたり、文字のエッジが隣の文字に接している場合、モルフォロジーを使用して文字を細くします。モルフォロジーで文字を細くすると、それぞれの文字を分離できます。

  • 2 値化を用いて、ライティングが一様でないために問題が発生していないかをチェックします。関数 graythresh および関数 imbinarize を使用してイメージを 2 値化します。2 値化の結果で文字が見えない場合、ライティング条件が一様でない可能性があります。関数 imtophat を使用してトップ ハットを適用するか、一様でない明るさを取り除くその他の手法を試してみます。

  • 関心領域 roi オプションを使用してテキストを分離します。roi の指定は手動で行うか、テキスト検出を使用することもできます。

  • イメージがスキャンしたドキュメントではなく、路上など、言葉を含む自然なシーンの場合、ROI 入力の使用を試します。TextLayout プロパティを 'Block' または 'Word' に設定することもできます。

参照

[1] R. Smith. An Overview of the Tesseract OCR Engine, Proceedings of the Ninth International Conference on Document Analysis and Recognition (ICDAR 2007) Vol 2 (2007), pp. 629-633.

[2] Smith, R., D. Antonova, and D. Lee. Adapting the Tesseract Open Source OCR Engine for Multilingual OCR. Proceedings of the International Workshop on Multilingual OCR, (2009).

[3] R. Smith. Hybrid Page Layout Analysis via Tab-Stop Detection. Proceedings of the 10th international conference on document analysis and recognition. 2009.

拡張機能

R2014a で導入