Wolfram EngineをVisualBasicで使う(7:画像ファイルの処理)
今回は画像ファイルを処理してみようと思います。
次の2つが思いつきました。
a.VisualBasic側で画像ファイルを読み込んでWolfram Engineに渡す
b.VisualBasic側は画像表示のみとして、Wolfram Language側で画像ファイルを読み込む
KernelLinkのクラスを見ると「evaluate***」関数には文字列を渡すものが多く、画像のバイナリを渡すのは面倒そうなので、まずは、bの方法から試してみることにしました。
- まずは、GUIを次のようにしました。
それぞれ、TextBox1、Button1、PictureBox1です。
- 画像の読み込みなどは、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
-
起動します。画像は「C:\data\rose.png」にあるとして、テキストボックスに次のように入力します。Wolfram Languageでは、パスには「/」を使うことに注意。「\」ではエラーになります。
Import[“C:/data/rose.png”]
-
「Evaluate」をクリックすると、次のようになります。ただしく、読み込まれています。
-
Wolfram Languageがそのまま処理されるので、画像処理も行えます。テキストボックスに次のように入力してみます。
img = Import["C:/data/rose.png"]
EdgeDetect[img]
おお、簡単。VisualBasicで輪郭抽出をしようとするとかなり面倒ですが、Wolfram Engineはこういうときには便利かも。
出力が画像の時は、関数を入れ替えていけばそれなりに範囲が広がります。
次にWolfram Languageの画像処理関数で、画像の認識をやってみようと思います。これは、Wolfram Researchに接続してデータをやり取りするので、ネットワーク環境が必要です。
- 認識した後は、単語が出力されるのでGUIを次のようにしてみました。今回はPictureBoxは使いません。
-
出力は文字列になるので、コードを次のように変更します。
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
-
さてやってみます。画像を認識するWolfram Languageの関数は「ImageIdentity」です。
- そうか。ドキュメントセンターにおもいきり、「デフォルトで,ImageIdentifyはEntity["Concept",…]の形式のオブジェクトを返す.」と書いてありました。
-
ということで、Entityから文字を取り出す行を追加しました。
img = Import["C:/data/rose.png"]
entity = ImageIdentify[img]
entity["Name"]
うまく返ってきました。
- 別の画像でも試してみます。次の画像ファイルを認識させてみます(画像は何年か前のドイツでの私の夕食)。
- その結果は。「fish and chips」。実際には、チキンなのと、チップスもないですが。このあたりは辞書の関係ですね。結果としては、まあいいですね。
ということで、ここまで。