技術屋にゃん兵衛のてくてくらぼ by データウィズ [DataWith]

気の向くままソフトについて書いてます。バリバリエンジニアではないのであくまでも初心者目線で。

Wolfram EngineをVisualBasicで使う(7:画像ファイルの処理)

Wolfram EngineをVisualBasicで使う(7:画像ファイルの処理)

 

今回は画像ファイルを処理してみようと思います。

次の2つが思いつきました。

a.VisualBasic側で画像ファイルを読み込んでWolfram Engineに渡す

b.VisualBasic側は画像表示のみとして、Wolfram Language側で画像ファイルを読み込む

 

KernelLinkのクラスを見ると「evaluate***」関数には文字列を渡すものが多く、画像のバイナリを渡すのは面倒そうなので、まずは、bの方法から試してみることにしました。

 

  1. まずは、GUIを次のようにしました。

    GUIデザインを調整

    それぞれ、TextBox1、Button1、PictureBox1です。

  2. 画像の読み込みなどは、Wolfram Language側でするので、コードはいたって簡単。

    画像の読み込みなどは、Wolfram Language側でするので、コードはいたって簡単。

    Public Class Form1

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

     

            Dim ml As IKernelLink = MathLinkFactory.CreateKernelLink("-linkmode launch -linkname 'C:\Program Files\Wolfram Research\Wolfram Engine\13.3\WolframKernel.exe'")

            ml.WaitAndDiscardAnswer()

     

            Dim result As Image = ml.EvaluateToImage(TextBox1.Text, 200, 200)

            PictureBox1.Image = result

     

        End Sub

    End Class

     

  3. 起動します。画像は「C:\data\rose.png」にあるとして、テキストボックスに次のように入力します。Wolfram Languageでは、パスには「/」を使うことに注意。「\」ではエラーになります。

    Import[“C:/data/rose.png”]

    Wolfram Language の入力

     

  4. 「Evaluate」をクリックすると、次のようになります。ただしく、読み込まれています。

    正しく画像が読み込まれた
  5. Wolfram Languageがそのまま処理されるので、画像処理も行えます。テキストボックスに次のように入力してみます。

    img = Import["C:/data/rose.png"]

    EdgeDetect[img]

    輪郭抽出の関数を適用した結果

 

おお、簡単。VisualBasicで輪郭抽出をしようとするとかなり面倒ですが、Wolfram Engineはこういうときには便利かも。

 

出力が画像の時は、関数を入れ替えていけばそれなりに範囲が広がります。

次にWolfram Languageの画像処理関数で、画像の認識をやってみようと思います。これは、Wolfram Researchに接続してデータをやり取りするので、ネットワーク環境が必要です。

 

  1. 認識した後は、単語が出力されるのでGUIを次のようにしてみました。今回はPictureBoxは使いません。

    GUIデザインを変更
  2. 出力は文字列になるので、コードを次のように変更します。

    Public Class Form1

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

     

            Dim ml As IKernelLink = MathLinkFactory.CreateKernelLink("-linkmode launch -linkname 'C:\Program Files\Wolfram Research\Wolfram Engine\13.3\WolframKernel.exe'")

            ml.WaitAndDiscardAnswer()

     

            Dim result As String = ml.EvaluateToOutputForm(TextBox1.Text, 0)

            TextBox2.Text = result

     

        End Sub

    End Class

  3. さてやってみます。画像を認識するWolfram Languageの関数は「ImageIdentity」です。

    ImageIdentifyを記述
  4. そうか。ドキュメントセンターにおもいきり、「デフォルトで,ImageIdentifyEntity["Concept",…]の形式のオブジェクトを返す.」と書いてありました。

    ImageIdentifyの結果1
  5. ということで、Entityから文字を取り出す行を追加しました。

    img = Import["C:/data/rose.png"]

    entity = ImageIdentify[img]

    entity["Name"]

    ImageIdentifyの結果2

    うまく返ってきました。

  6. 別の画像でも試してみます。次の画像ファイルを認識させてみます(画像は何年か前のドイツでの私の夕食)。

    その他の画像を認識させてみる


  7. その結果は。「fish and chips」。実際には、チキンなのと、チップスもないですが。このあたりは辞書の関係ですね。結果としては、まあいいですね。

    認識の結果(料理は難しいか。。。)


ということで、ここまで。