Main Content

ocr

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

説明

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

メモ

関数 ocr は、イメージから 7 セグメントの数字も認識します。

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

[___] = ocr(___,Name=Value) は、前の構文にある引数の任意の組み合わせに加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、Language="english" は、検出する言語として英語を設定します。

すべて折りたたむ

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

Figure contains an axes object. The axes object contains 2 objects of type image, text.

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

I = imread("handicapSign.jpg");

入力イメージ内のテキストを認識するために、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);

Figure contains an axes object. The axes object contains an object of type image.

7 セグメント ディスプレイを含むイメージをワークスペースに読み取ります。

I = imread("sevSegDisp.jpg");

7 セグメント ディスプレイを含む ROI を指定します。

roi = [506 725 1418 626];

7 セグメント ディスプレイから数字を認識するには、引数 Languageseven-segment" として指定します。

ocrResults = ocr(I,roi,Language="seven-segment");

認識された数字と検出の信頼度を表示します。

fprintf("Recognized seven-segment digits: ""%s""\nDetection confidence: %0.4f",cell2mat(ocrResults.Words),ocrResults.WordConfidences)
Recognized seven-segment digits: "5405.9"
Detection confidence: 0.7948

認識された数字をイメージに挿入します。

Iocr = insertObjectAnnotation(I,"rectangle",...
            ocrResults.WordBoundingBoxes,ocrResults.Words,LineWidth=5,FontSize=72);
figure
imshow(Iocr)

Figure contains an axes object. The axes object contains an object of type image.

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

Figure contains an axes object. The axes object contains an object of type image.

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

Figure contains an axes object. The axes object contains an object of type image.

入力引数

すべて折りたたむ

入力イメージ。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 しきい値手法を使用して、トゥルーカラー入力関心領域およびグレースケール入力関心領域をバイナリ領域に変換します。関数は、四角形の領域で認識されたテキストをオブジェクトの配列として返します。

ocr を使用して 7 セグメントの数字を認識するときに最良の結果を得るには、入力イメージ内の 7 セグメントの数字を囲む roi を指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: ocr(I,TextLayout=block) は、テキストのレイアウトを "block" に設定します。

入力テキストのレイアウト。次のいずれかとして指定します。

TextLayoutテキストの処理
"auto"

引数 Language"seven-segment" に設定されている場合、イメージ内のテキストを "block" として扱います。それ以外の場合、関数はイメージ内のテキストを "page" として扱います。

"page"イメージ内のテキストを、テキスト ブロックを含むページとして処理します。
"block"イメージ内のテキストを 1 つのテキスト ブロックとして処理します。
"line"イメージ内のテキストを 1 行のテキストとして処理します。
"word"イメージ内のテキストをシングル ワードのテキストとして処理します。
"character"イメージ内のテキストを 1 つの文字として処理します。

引数 TextLayout を使用して、入力イメージ内のテキストのレイアウトを決定できます。たとえば、TextLayout"page" として指定して、2 段組みなどの特定の形式を含むスキャンされたドキュメントからテキストを認識できます。この設定によって、返されるテキストの読み取り順序が維持されます。

入力イメージに含まれるテキストの領域が少ない、または要素の多いシーンにテキストがある場合は、良い結果が得られないことがあります。OCR で良い結果が得られない場合、イメージのテキストに適した別のレイアウトを試します。要素の多いシーンにテキストがある場合には、別のレイアウトを試すほかに、イメージのテキストの周りを ROI として指定してみてください。

認識する言語。"english""japanese""seven-segment"、文字ベクトル、string スカラー、string 配列、または文字ベクトルの cell 配列として指定します。

Language"seven-segment" に指定すると、関数 ocr は入力イメージ内の 7 セグメントの数字を認識します。

追加の言語の 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

  • 7 セグメントの場合: C:/path/tessdata/seven_segment.traineddata

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

  • C:/path/ocr_app.exe

英語、日本語、および 7 セグメントの学習済みデータ ファイルは、次の場所からコピーできます。

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

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

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

Languageseven-segment として指定した場合、関数 ocrCharacterSet"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" に設定することもできます。

制限

  • Seven-Segment 言語は他の言語と組み合わせることができません。たとえば、次の構文はサポートされていません。

    ocr(I,Language=["english","seven-segment"])

参照

[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 で導入