Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ocr

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

説明

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

txt = ocr(I,roi) は、1 つ以上の四角形の領域内の I にあるテキストを認識します。

txt = ocr(ds) は、対応するイメージのデータストア内で指定された ROI の認識結果を含む ocrText オブジェクトの cell 配列を返します。この構文を使用して、イメージ コレクションに対する OCR の結果を評価します。

[___] = ocr(___,Name=Value) は、前の構文にある引数の任意の組み合わせに加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、LayoutAnalysis="page" は、イメージをテキスト ブロックを含むページとして処理します。

すべて折りたたむ

テキストを含むイメージをワークスペースに読み込みます。

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

                      Text: '4 MathWorks:...'
    CharacterBoundingBoxes: [107x4 double]
      CharacterConfidences: [107x1 single]
                     Words: {16x1 cell}
         WordBoundingBoxes: [16x4 double]
           WordConfidences: [16x1 single]
                 TextLines: {8x1 cell}
     TextLineBoundingBoxes: [8x4 double]
       TextLineConfidences: [8x1 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 = [370 246 363 423];

あるいは、drawrectangle を使用し、マウスを使用して領域を選択することもできます。

次に例を示します。

figure;imshow(I)

roi = round(getPosition(drawrectangle))

ROI 内のテキストを認識します。

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 セグメント ディスプレイから数字を認識するには、引数 Model を seven-segment" として指定します。

ocrResults = ocr(I,roi,Model="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: '4 MathWorks:...'
    CharacterBoundingBoxes: [107x4 double]
      CharacterConfidences: [107x1 single]
                     Words: {16x1 cell}
         WordBoundingBoxes: [16x4 double]
           WordConfidences: [16x1 single]
                 TextLines: {8x1 cell}
     TextLineBoundingBoxes: [8x4 double]
       TextLineConfidences: [8x1 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,"Math",IgnoreCase=true);
Iocr = insertShape(businessCard,"FilledRectangle",bboxes);
figure
imshow(Iocr)

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

この例では、データセット上の 7 セグメントの数字を認識可能な OCR モデルの精度を評価する方法を示します。評価データセットには、7 セグメントの数字が含まれるエネルギー メーターの表示イメージが格納されています。

データセットをダウンロードし、解凍します。

datasetURL = "https://ssd.mathworks.com/supportfiles/vision/data/7SegmentImages.zip";
datasetZip = "7SegmentImages.zip";
if ~exist(datasetZip,"file")
    disp("Downloading evaluation dataset (" + datasetZip + " - 96 MB) ...");
    websave(datasetZip,datasetURL);
end

datasetFiles = unzip(datasetZip);

評価のグラウンド トゥルースを読み込みます。

ld = load("7SegmentGtruth.mat");
gTruth = ld.gTruth;

groundTruth オブジェクトから、関数 ocrTrainingData とラベル付けの際に使用されるラベル名および属性名を使用して、イメージ、境界ボックス、およびテキスト ラベルを含むデータストアを作成します。

labelName = "Text";
attributeName = "Digits";
[imds,boxds,txtds] = ocrTrainingData(gTruth,labelName,attributeName);

データストアを統合します。

cds = combine(imds,boxds,txtds);

評価データセットに対して OCR を実行します。

results = ocr(cds, Model="seven-segment");

グラウンド トゥルースに対して OCR の結果を評価します。

metrics = evaluateOCR(results,cds);
Evaluating ocr results
----------------------
* Selected metrics: character error rate, word error rate.
* Processed 119 images.
* Finalizing... Done.
* Data set metrics:

    CharacterErrorRate    WordErrorRate
    __________________    _____________

         0.082195            0.19958   

OCR モデルの精度を表示します。

modelAccuracy = 100*(1-metrics.DataSetMetrics.CharacterErrorRate);
disp("Accuracy of the OCR model= " + modelAccuracy + "%")
Accuracy of the OCR model= 91.7805%

入力引数

すべて折りたたむ

入力イメージ。M×N×3 のトゥルーカラー イメージ、M 行 N 列のグレースケール イメージ、または M 行 N 列のバイナリ イメージとして指定します。入力イメージは、実数である非スパースの値で構成されていなければなりません。この関数は、文字認識を実行する前に、Otsu しきい値手法を使用して、トゥルーカラーまたはグレースケールの入力イメージをバイナリ イメージに変換します。OCR で最適な結果を得るには、小文字の x または同等の文字の高さが 20 ピクセルより大きいイメージを指定します。結果を改善するには、横軸または縦軸からいずれかの方向に 10 度を超えるテキストの回転を削除します。

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

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

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

評価データ。関数 read への入力時に cell 配列またはテーブルを返すデータストアとして指定します。データストアは、少なくとも次の 2 つの列を含む関数 read の cell 配列またはテーブルを返さなければなりません。

  • 1 列目 — logical 値、グレースケール イメージ、または RGB イメージの cell ベクトル。

  • 2 列目 — 各イメージ内のテキストの位置を指定する [x y width height] の形式の境界ボックスから成る numROIs 行 4 列の行列を含む cell ベクトル。

データストア入力を使用する場合、名前と値の引数 LayoutAnalysis の値は "auto" または "none のいずれかでなければなりません。

名前と値の引数

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

例: txt = ocr(I,LayoutAnalysis="page") は、イメージ内のテキストを、テキスト ブロックを含むページとして処理します。

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

テキスト セグメンテーションのために実行するレイアウト解析のタイプ。次のオプションのいずれかとして指定します。

TextLayout 値テキストの処理
"auto"

引数 Model の値が "seven-segment" の場合、LayoutAnalysis の値が "block" のときと同じようにイメージ内のテキストを処理します。ds 入力引数を指定した場合、LayoutAnalysis の値が "none" のときと同じようにイメージ内のテキストを処理します。それ以外の場合、関数はイメージ内のテキストを "page" として処理します。

"page"イメージ内のテキストを、テキスト ブロックを含むページとして処理します。
"block"イメージ内のテキストを 1 つのテキスト ブロックとして処理します。
"line"イメージ内のテキストを 1 行のテキストとして処理します。
"word"イメージ内のテキストをシングル ワードのテキストとして処理します。
"character"イメージ内のテキストを 1 つの文字として処理します。
"none"レイアウト解析を実行しません。1 行のテキストを含むイメージに最適です。

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

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

認識に使用するモデル。次のオプションのいずれかとして指定します。

  • "english""japanese""seven-segment" — これらは、それぞれ英語テキスト、日本語テキスト、または 7 セグメントの数字を検出するための組み込みモデルを指定します。

  • 文字ベクトルまたは string スカラー — このオプションを使用して、カスタム モデル、または OCR Language Data Files サポート パッケージに含まれる追加の言語モデルの 1 つを指定します。

  • 文字ベクトルの cell 配列または string 配列 — このオプションを使用して、同時に検出に使用する複数のモデルを指定します。

組み込みモデル (任意の追加のインストール済み言語モデルを含む) を使用してパフォーマンスを高速化するには、言語モデルの string に -fast を追加します。たとえば、"english-fast""japanese-fast"、または "seven-segment-fast" のようにします。

追加のモデルをインストールしたり、カスタム モデルを追加したりすることもできます。詳細については、OCR Language Data Files のインストールを参照してください。

複数の言語を指定すると、選択したすべての言語の同時認識が可能になります。ただし、複数の言語を選択すると、関数 ocr の精度が低下し、処理時間が長くなる可能性があります。OCR Language Data Files のインストールにあるパッケージに含まれる追加言語を指定するには、組み込み言語と同じ方法で指定します。パスを指定する必要はありません。たとえば、フィンランド語のテキスト認識を指定するには、次のようにします。

txt = ocr(img,Model="finnish");

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

学習済みデータ ファイルへのパスを指定することで、独自のカスタム モデルを使用することができます。表で説明されているいずれかの方法を使用してパスを指定します。使用する方法は、学習データを関数 trainOCR を使用して取得するか、OCR Trainer アプリを使用して取得するかによって異なります。

学習済みモデルのソース指定プロセス
関数 trainOCR

trainOCR の出力 ocrModel に対し、次のように指定します。

ocrResults = ocr(I,Model=ocrModel);

ocrModel にはモデルの絶対パスが含まれていなければなりません。

OCR トレーナー アプリ

ファイルには <Model>.traineddata の形式で名前を付けなければなりません。そして、それを tessdata という名前のフォルダーに保存します。<Model> は、学習済みカスタム モデルの名前です。たとえば、"eng" という名前のカスタム モデルを使用するには、次のように指定しなければなりません。

txt = ocr(img,Model="<path>/tessdata/eng.traineddata");
ここで、path は tessdata フォルダーへの絶対パスで、eng.traineddataOCR トレーナー アプリによって返されます。

複数のカスタム モデルを指定する場合は、同じフォルダーを指定しなければなりません。たとえば、次のコードは 2 つの異なるフォルダーを指しているため、機能しません。

txt = ocr(img,Model={"<path>/one/tessdata/eng.traineddata",...
                "<path>/two/tessdata/jpn.traineddata"});

言語モデル ファイルによっては別の言語モデルに依存している場合があります。たとえば、ヒンディー語の学習は英語に依存します。ヒンディー語を使用する場合は、ヒンディー語の traineddata ファイルと同じフォルダーに英語の traineddata ファイルが含まれていなければなりません。関数 ocr は、tesseract-ocr 3.02 または OCR Trainer アプリを使用して作成された traineddata ファイルのみをサポートします。

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

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

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

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

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

  • C:/path/ocr_app.exe

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

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

文字のサブセット。文字ベクトルまたは string スカラーとして指定します。既定では、CharacterSet は空の文字ベクトル "" に設定されます。これは、名前と値の引数 Model で指定された言語モデル内のすべての文字を検索する関数を指定します。この値を少数の既知の文字に設定することで、分類プロセスを制限できます。

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

Modelseven-segment として指定した場合、関数 ocrCharacterSet の値 "0123456789.:-" を使用します。

出力引数

すべて折りたたむ

認識されたテキストとメトリクス。ocrText オブジェクト、ocrText オブジェクトの配列、または ocrText オブジェクトの cell 配列として返されます。各オブジェクトには、入力イメージ内で認識されたテキストと認識されたテキストの位置、および結果の信頼度を示すメトリクスが含まれます。信頼度の値の範囲は [0,1] で、パーセント単位の確率を表します。txt 出力の形状は、関数 ocr に単一イメージ全体を指定するか、1 つの ROI をもつ単一イメージを指定するか、複数の ROI をもつ単一イメージを指定するか、またはデータストアを指定するかによって異なります。

ヒント

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

  • イメージ サイズを 2 ~ 4 倍に拡大します。

  • イメージ内の文字の間隔が狭すぎたり、文字のエッジが隣の文字に接している場合、モルフォロジーを使用して文字を細くします。モルフォロジーで文字を細くすると、文字間にスペースを作成するのに役立ちます。

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

  • roi 引数を使用してテキストを分離します。roi を手動で指定することも、テキスト検出を使用することもできます。

  • イメージがスキャンしたドキュメントではなく、路上などの言葉を含む自然なシーンの場合、LayoutAnalysis 引数を "Block""Word" に設定してみます。

  • イメージの背景が淡色でテキストが濃色であることを確認します。これを実現するには、関数 ocr に渡す前にイメージを 2 値化して反転します。

参照

[1] Smith, Ray. An Overview of the Tesseract OCR Engine. In Ninth International Conference on Document Analysis and Recognition (ICDAR 2007), 629–33. IEEE, 2007. https://doi.org/10.1109/ICDAR.2007.4376991."

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

すべて展開する