ocr
光学式文字認識を使用したテキストの認識
説明
[___] = ocr(___,
は、前の構文にある引数の任意の組み合わせに加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、Name=Value
)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]);
関心領域 (ROI) 内のテキストの認識
イメージを読み取ります。
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);
7 セグメント ディスプレイからの数字の認識
7 セグメント ディスプレイを含むイメージをワークスペースに読み取ります。
I = imread("sevSegDisp.jpg");
7 セグメント ディスプレイを含む ROI を指定します。
roi = [506 725 1418 626];
7 セグメント ディスプレイから数字を認識するには、引数 Language
を seven-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)
言葉の境界ボックスと認識の信頼度の表示
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);
入力引数
I
— 入力イメージ
M x N x 3 のトゥルーカラー イメージ | M 行 N 列の 2 次元グレースケール イメージ | M 行 N 列のバイナリ イメージ
入力イメージ。M x N x 3 のトゥルーカラー、M 行 N 列の 2 次元グレースケール、またはバイナリ形式で指定します。入力イメージは、実数で非スパースの値でなければなりません。関数は、認識プロセスの前に、トゥルーカラー入力イメージまたはグレースケール入力イメージをバイナリ イメージに変換します。変換には Otsu しきい値手法が使用されます。OCR で最適な結果を得るには、入力イメージの小文字 ‘x’ または同等の文字の高さを 20 ピクセルより大きくしなければなりません。横軸または縦軸から +/- 10 度より大きなテキストの回転を除去して、認識の結果を改善します。
データ型: single
| double
| int16
| uint8
| uint16
| logical
roi
— 関心領域
M 行 4 列の要素の行列
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"
(既定値) | "page"
| "block"
| "line"
| "word"
| "character"
入力テキストのレイアウト。次のいずれかとして指定します。
TextLayout | テキストの処理 |
---|---|
"auto" | 引数 |
"page" | イメージ内のテキストを、テキスト ブロックを含むページとして処理します。 |
"block" | イメージ内のテキストを 1 つのテキスト ブロックとして処理します。 |
"line" | イメージ内のテキストを 1 行のテキストとして処理します。 |
"word" | イメージ内のテキストをシングル ワードのテキストとして処理します。 |
"character" | イメージ内のテキストを 1 つの文字として処理します。 |
引数 TextLayout
を使用して、入力イメージ内のテキストのレイアウトを決定できます。たとえば、TextLayout
を "page"
として指定して、2 段組みなどの特定の形式を含むスキャンされたドキュメントからテキストを認識できます。この設定によって、返されるテキストの読み取り順序が維持されます。
入力イメージに含まれるテキストの領域が少ない、または要素の多いシーンにテキストがある場合は、良い結果が得られないことがあります。OCR で良い結果が得られない場合、イメージのテキストに適した別のレイアウトを試します。要素の多いシーンにテキストがある場合には、別のレイアウトを試すほかに、イメージのテキストの周りを ROI として指定してみてください。
Language
— 認識する言語
"english"
(既定値) | "japanese"
| "seven-segment"
| 文字ベクトル | string スカラー | 文字ベクトルの cell 配列 | string 配列
認識する言語。"english"
、"japanese"
、"seven-segment"
、文字ベクトル、string スカラー、string 配列、または文字ベクトルの cell 配列として指定します。
Language
を "seven-segment"
に指定すると、関数 ocr
は入力イメージ内の 7 セグメントの数字を認識します。
追加の言語の OCR 言語データ ファイルのインストール パッケージをインストールしたり、カスタム言語を追加したりすることもできます。複数の言語を指定すると、選択したすべての言語の同時認識が可能になります。ただし、1 つ以上の言語を選択すると、精度が低下し、OCR の実行にかかる時間が長くなる場合があります。
OCR 言語データ ファイルのインストール パッケージに含まれる追加言語を指定するには、組み込みの言語と同じ方法で言語を表す文字ベクトルを使用します。パスを指定する必要はありません。
txt = ocr(img,Language="finnish");
"afrikaans"
"albanian"
"ancientgreek"
"arabic"
"azerbaijani"
"basque"
"belarusian"
"bengali"
"bulgarian"
"catalan"
"cherokee"
"chinesesimplified"
"chinesetraditional"
"croatian"
"czech"
"danish"
"dutch"
"english"
"esperanto"
"esperantoalternative"
"estonian"
"finnish"
"frankish"
"french"
"galician"
"german"
"greek"
"hebrew"
"hindi"
"hungarian"
"icelandic"
"indonesian"
"italian"
"italianold"
"japanese"
"kannada"
"korean"
"latvian"
"lithuanian"
"macedonian"
"malay"
"malayalam"
"maltese"
"mathequation"
"middleenglish"
"middlefrench"
"norwegian"
"polish"
"portuguese"
"romanian"
"russian"
"serbianlatin"
"slovakian"
"slovenian"
"spanish"
"spanishold"
"swahili"
"swedish"
"tagalog"
"tamil"
"telugu"
"thai"
"turkish"
"ukrainian"
独自のカスタム言語を使用するには、学習済みのデータ ファイルへのパスを言語を表す文字ベクトルとして指定します。<language>.traineddata
の形式でファイルに名前を付けなければなりません。ファイルは、tessdata
という名前のフォルダーに配置されていなければなりません。次に例を示します。
txt = ocr(img,Language="path/to/tessdata/eng.traineddata");
txt = ocr(img,Language={"path/to/tessdata/eng.traineddata",... "path/to/tessdata/jpn.traineddata"});
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
— 文字のサブセット
""
すべての文字 (既定値) | 文字ベクトル | string スカラー
文字サブセット。文字ベクトルとして指定します。既定の設定では、CharacterSet
は空の文字ベクトル ""
に設定されます。空のベクトルは、Language
プロパティによって指定された言語のすべての文字を検索するように関数を設定します。このプロパティを少数の既知の文字に設定することで、分類プロセスを制限できます。
関数 ocr
は、CharacterSet
から最も適したものを選択します。入力イメージ内の文字に関する推測から得られる知識を使用すると、テキスト認識の精度の向上に役立ちます。たとえば、CharacterSet
をすべての数字 "0123456789"
に設定すると、関数はそれぞれの文字を数字のみに対してマッチングさせようとします。この場合、数字でない文字が誤って数字として認識される可能性があります。
Language
を seven-segment
として指定した場合、関数 ocr
は CharacterSet
、"0123456789.:-"
を使用します。
出力引数
txt
— 認識されたテキストとメトリクス
ocrText
オブジェクト
認識されたテキストとメトリクス。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.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
'TextLayout'
、'Language'
および'CharacterSet'
はコンパイル時の定数でなければなりません。この関数に対して生成されたコードは、プリコンパイルされたプラットフォーム固有の共有ライブラリを使用します。
バージョン履歴
R2014a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)