【エクセル・マクロ】VBA+OCRで画像内のテキストを抽出する

株式会社ブレイブ「システム開発事業部」の工藤です!
制作系案件ブログ第3弾は、指定した画像内のテキストを読み取り、取得するプログラムを紹介します。
画像上に記載されている文字列をプログラムで解析し、テキストだけを文字列として取得することが可能です!

有料、無料、WEB上、アプリ、さまざまな文字認識(OCR)サービスがあります。
サービスによって精度や手間はまちまちです。今回は、無料で手軽に使え、それなりの精度は見込める、そんな文字認識方法を紹介したいと思います。

目次

文字認識の流れ

今回はローカルに保存された画像に対して文字認識を行うので
  • ローカル画像ファイルのパスを指定
  • 指定された画像ファイルを解析、文字列を取得・保存
という流れになります。

MDIVWCTL.DLLの入手

※ この項は、すでにMicrosoft Office Document Imaging(以下:MODI)がインストールされている場合は不要です。
MODIは、Office 2003、Office 2007と搭載されていましたが、Office 2010では廃止されてしまいました。
今回のプログラムはMODIを利用するため、パソコンにMODIがインストールされていなければ使えません。

MODI のインストール

SharePoint Designer 2007 をインストールすることで MODI をインストールする

MODIインストール

サンプルの使い方

サンプルファイルのダウンロード
  • 上記リンクからZIPファイルをダンロードして解凍します。
  • エクセル(ocr.xlsm)を開きます。
  • マクロを有効にします。
  • 画像パス」を記入します。(必須
    • テキストを取得したい画像ファイルを指定します。
  • 解析」ボタンを押下します。
  • 完了を伝えるメッセージボックスが表示されます。
  • 結果」にテキストが入力されていれば完了です。

テスト画像

OCRテスト

4.

取得画像パスを入力
テキストを取得したい画像のパスを記入します。

6.7.

完了メッセージBOX
結果」に結果が記入されます。

テスト画像の取得結果
画像上に記載されている文字列をプログラムで解析し、テキストだけを文字列として取得することが可能です!
今日は、麦料で手軽に使え、それなりの精度は元込める、ぞん谷文字認識方法を紹介したいと思います。
フォント、密度の高い漢字によっては正常に取れませんでした。

サンプルプログラムの説明

動作確認環境

  • Windows10
  • Excel2007
  • InternetExplorer11

参照設定


今回はMODIを利用するので、参照設定を追加します。
デフォルト参照設定
  • Visual Basic For Applications
  • Microsoft Excel **.* Object Library
  • OLE Automation
  • Microsoft Office **.* Object Library
追加参照設定
  • Microsoft Office Document Imaging **.* Type Library

参照設定の追加
参照にチェックを入れ「OK」を押すと参照が追加されます。

サンプル


サンプルファイルのダウンロード
ocr モジュール
''' 参照追加
'''     Microsoft Office Document Imaging **.* Type Library
'''

Option Explicit

Sub main()
 
'
' WS 設定値
'
Dim str_path As String

' WS 設定取得
With ActiveSheet
    str_path = .Range("B5").Value
End With

' WS 設定確認
If "" = str_path Then
    MsgBox ("画像パスを入力してください。")
    Exit Sub
End If

' 記入済データ 消去
ActiveSheet.Range("B15").Value = ""

'
' 処理開始
'
Dim obj_modi As New MODI.Document
Dim obj_image As MODI.Image
Dim obj_layout As MODI.Layout
Dim str_result As String
    str_result = ""

' modi object 生成
Set obj_modi = CreateObject("MODI.Document")
With obj_modi
    ' 画像をセット
    .Create str_path
    ' OCR タイプ (17:日本語)
    .ocr 17
    
    ' modi image 確認
    If 0 < .Images.Count Then
        ' modi 画像 object
        Set obj_image = .Images.Item(0)
        Set obj_layout = obj_image.Layout
        With obj_layout
            ' データ取得
            ' Debug.Print .Language
            ' Debug.Print .NumChars
            ' Debug.Print .NumFonts
            ' Debug.Print .NumWords
            str_result = .Text
        End With
        Set obj_layout = Nothing
        Set obj_image = Nothing
    End If
    
End With
Set obj_modi = Nothing

' 結果の確認
If "" = str_result Then
    str_result = "※ テキストを取得出来ませんでした。"
End If

' 結果 保存
ActiveSheet.Range("B15").Value = str_result

MsgBox ("解析が完了しました。")

End Sub

プログラムの説明


ocr モジュール
' WS 設定取得
With ActiveSheet
    str_path = .Range("B5").Value
End With

' WS 設定確認
If "" = str_path Then
    MsgBox ("画像パスを入力してください。")
    Exit Sub
End If
入力されている値を確認します。
「画像パス」は空欄禁止。
' 記入済データ 消去
ActiveSheet.Range("B15").Value = ""
前回取得した情報をクリアにします。
' modi object 生成
Set obj_modi = CreateObject("MODI.Document")
With obj_modi
    ' 画像をセット
    .Create str_path
    ' OCR タイプ (17:日本語)
    .ocr 17
MODIオブジェクトを生成し、指定した画像をセットします。
OCRメソッドに、解析する国の言語を指定します。

OCRタイプ
英語9
日本語17, &H11

言語一覧
' modi 画像 object
Set obj_image = .Images.Item(0)
Set obj_layout = obj_image.Layout
With obj_layout
    ' データ取得
    ' Debug.Print .Language
    ' Debug.Print .NumChars
    ' Debug.Print .NumFonts
    ' Debug.Print .NumWords
    str_result = .Text
End With
Set obj_layout = Nothing
Set obj_image = Nothing
指定された画像を解析し、文字列を取得します。
' 結果の確認
If "" = str_result Then
    str_result = "※ テキストを取得出来ませんでした。"
End If

' 結果 保存
ActiveSheet.Range("B15").Value = str_result

MsgBox ("解析が完了しました。")
解析結果をシートに書き出します。

まとめ

サンプルファイルのダウンロード
今回はMODIを利用し、画像から文字列を抽出する方法について、サンプルをもとに解説しました。

今回のサンプルでは、MODI.Layoutから、まとめてテキストを取得しましたが、MODI.LayoutWordsプロパティを使えば、一文字ずつ取得することもできます。
手軽に利用できるところから、完璧な精度は望めませんが、フォント次第では十分に実用出来るものだと思います。
※ 取得したテキストを無許可で公開してしまうと著作権に触れる可能性があるのでご注意ください。
※ 本プログラムを利用しために被る損害について、当社に故意または重大な過失がある場合を除き、当社は一切その責任を負いません。

プログラムの開発、お見積り、お問い合わせは、こちらから、ご連絡ください。
まだ仕様の決まっていない場合のご相談などもお気軽にご相談ください。