Ruby/Tk で画像を行列に変換する

投稿者: | 2016年7月10日

Rubyで画像処理する場合は、Chunky_PNG と RMagick が定番だと思いますが、落書きして遊びたい時は、Ruby/Tkもなかなか便利につかえます。GIFでもJPEGでもPNGでもだいたい大丈夫です。Tcl/Tkのバインディングであることに目をつぶれば、ほぼ Pure Ruby(?)でこんなに簡単にテンソルを手に入れることができます。素晴らしい。(ただし「速さ」を求めてはいけない。)

画像をテンソルに変換する

Numo::NArrayの行列に変換してみます。数値は0-255の範囲です。あとでPNM形式にするためにもUInt8を選択するのがポイントです。

数字の羅列に分解されたLennaさん
lenatxt

テンソルを画像として表示する

Ruby/Tkでは、比較的簡単にテンソルを画像として表示することができます。具体的にどうするかというと、PNM形式で行列を作成して、TkPhotoImageに投げ込みます。こんな感じです。PNM形式についてはWkipediaの記事PNM (画像フォーマット)がとてもわかりやすくまとめてあります。Tkの便利なところです。

irb上で数字の羅列から復活されたLennaさん。
lenaruby

PNM形式がUInt8じゃないとダメなところや、文字列のエンコーディングに気をつけなければならないことなど、ところどころトラップがありましたが、とっても手軽です。to_string便利。あとはirb上で何回もTk.mainloopできる方法さえ分かれば文句はない。あとbinaryじゃないPNM形式の画像はRuby/Tkで表示できなかった気がする。

Ruby/Tkの残念なところは、インストールが面倒なこと。たしかWindowsでは拡張Tkを使うためにActiveStatesというあまりアクティヴさを感じない場所でゴニョゴニョダウンロードする必要があった気がするし、Linuxでもインストール時に呪文が必要。
次は、Numo::NArrayを使って画像にフィルターかけたりしていきたいところ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です