読者です 読者をやめる 読者になる 読者になる

ローグウェーブソフトウェアのブログ

開発をシンプルに 安全で高品質のコードを 素早くお客様のもとへ

PV-WAVE の新しい Photo 関数 (Part 1) - CodeBuzzから

Rogue Wave Softwareのセールスエンジニアである Ed Stewart がCodeBuzz に 2016年12月にリリースされたPV-WAVE 2016.1 の新しい関数PHOTOについての記事を投稿しました。Ed は現在セールスエンジニアとして活躍していますが、以前はPV-WAVEの製品マネージャとして製品の開発を統括していたことがあります。 このPHOTO関数は、一般的なイメージ形式であるBMP,GIF.JPEG,PNG,TIFFなどのイメージデータを読み込み、表示し、PV-WAVEの機能を使って解析、作成したデータを同様に保存することができます。また、PV-WAVEバージョン2016.1リリースでご紹介しました様に、医療画像形式であるDICOMも他のイメージ形式同様にとり扱う事ができます。 今回 Ed は、自身のモバイルフォンで撮影した写真を例に、新しいPHOTO関数の使い方や機能拡張の例等をご紹介しています。PV-WAVEの関数は極めて簡単に機能の拡張ができ、それを新しい関数として登録・利用することができます。本投稿記事中にある表現で “ラップする” とはこの拡張作業を意味し、"ラッパー関数" とはPHOTO関数をベースにした新しい関数を意味します。 今回記事内で Ed が作成した新しい関数はすべてGitHub から入手することができます。

RogueWave CodeBuzz

PV-WAVE の新しい Photo 関数 (Part 1) Ed Stewart

私は現在 PV-WAVE チームと近い所で仕事をしているわけではありませんが、いまでも製品をインストールしておいて定期的に利用し、手軽にデータ分析等の処理を行っています。過去にはImage関数もいくつか使用しましたが、頻度はそんなに多くありませんでした。しかし、最新のリリース2016.1にPhoto関数が追加されたのを見て、私は興奮しそれらを試してみることにました。私はプライベートな生活の中で写真の編集をよく行う為、そのツールを試してみたくなりました。

まず最近のお気に入りの写真をモバイルフォンから選び、ファイル共有アプリを使ってファイルをコピーし、ラップトップマシンにダウンロードしました。PV-WAVEの新しい PHOTO_READ 関数を使って、きわめて簡単に素早く、何の問題もなく読み込むことができました:

 WAVE> t = PHOTO_READ(‘c:\dev\data\trees.jpg’)

それをスクリーン上で確認したければ、 PHOTO_DISPLAY を使いこのように使います。

 WAVE> PHOTO_DISPLAY, t

ところが、私が期待した表示ではありませんでした。下記をご覧ください。

f:id:RWSJapan:20170224155857j:plain

とりあえず、写真は表示されましたが横向きに回転していました。しかしそれはPV-WAVEのせいではなくモバイルのメタデータに責任があります。このファイルのプロパティは、ポートレートモードであるにも関わらず 4032 x 3024 ピクセルとなっています、つまり正常に表示するにはこの写真を回転させる必要があります。さらに、この写真のサイズでは私のスクリーンにはいりきりません。4K革命に乗り遅れている為、私のモニターの解像度は最高でも1920 x 1080 にすぎないのです。解析のツールであるPV-WAVE は簡便の為に勝手にデータを省略・変更することはありません; むしろ、可能な限り正確に表示しようとする為、私のスクリーンでははみ出してしまうのです。そう、つまりリサイズが必要です。

PV-WAVE には、写真のデータだけでなく、任意のn次元配列データに対してこのような操作を行うための関数がいくつもあります。私(望むらくはあなたも)のプライベートを充実させるために、これらの関数を新しいphoto用連想配列データ(associative array)の作成に利用したいとおもっていました。まず、 ROTATE と RESAMP 関数から始め、新しいヘルパー関数 PHOTO_ROTATE と PHOTO_RESAMP を作ってみました。 ROTATE関数はデータ配列と回転方向のパラメータを受け取ります、そこで私はphoto関数のassociative array が第一引数となるようにAPIをラップして新しい関数を作ってみました。その関数内部では、ピクセル配列が取り出されROTATE関数に方向を示すパラメータが渡されます。同様にphotoに必要な幅(width)と高さ(height)には、SIZE 関数によって取得したピクセル配列の値が設定されます。この新しい関数(PHOTO_ROTATE)により、写真は正しい方向に表示できます:

  WAVE> tr = PHOTO_ROTATE(t, 3)

次に、イメージのサイズを変更するために、RESAMP関数をラップしてもう一つの新しい関数をつくりました。RESAMPには変更するイメージの幅(width)と高さ(height)を入力します、また最近傍近似(nearest-neighbor)補間の代わりに双一次(bilinear)補間を行うためのオプションキーワードInterpも使えるようにします。一般的に、特にイメージデータの場合、NN(最近傍近似) 補間はあまりよくないと思いますので、/Interpオプションを必ず使うようにします。しかしながら、NNは極めて高速に処理ができるため需要があるかもしれません、またオリジナル関数のインターフェイスと一貫性を持たせるためにこの補間方法もPHOTO_RESAMP関数に渡せるように実装しました。幅と高さも調整されますが、解像度(resolution)がどのように修正されるかよくわからない(私はデジタル写真の専門家ではないので)ところがあり、未変更の部分が下部に少し残ってしまいます。ともかく、スクリーン上に写真全体を表示することができるようになりました:

  WAVE> ts = PHOTO_RESAMP(tr, 750, 1000, /Interp)

  WAVE> PHOTO_DISPLAY, ts

ついに、私の写真がPV-WAVEの表示ウインドウに現れました、素晴らしい景色です。

f:id:RWSJapan:20170224155905j:plain

ここまでの作業を終えて、私は更に2つの作業を追加する事にしました。 まずは、ROTATE関数より便利で、実際私も良く利用する ROT 関数を使う事、二つ目は画像サイズを適切に変更しつつアスペクト比を変えないPHOTO_RESIZE関数をつくる事、画像サイズを適切に変更するにはイメージを適切にリサイズする方法について更に知る必要があります。この為、更に以下の2つの短いラッパーユーティリティーを追加しました。 はじめに, PHOTO_ROT にはROT関数が持つすべてのインターフェイス、任意回転角、倍率、回転中心x,y、及びInterpやMissingキーワードを含むすべてのパラメータをラップします。ROT関数を使うと、出力される配列のサイズは入力と同じになる為、dimensionキーは変更されません。このラッパーの複雑な操作により様々な結果を楽しむことができます。 アスペクト比に関するジレンマを解決する為、PHOTO_RESAMPを更にラップしてPHOTO_RESIZE を新たに作成しました。この関数は既存のPV-WAVE関数にはマップされません。代わりに、ユーザが一つのキーワード:倍率(Magnification)と幅(Width)又は高さ(Height)を指定するだけでイメージをリサイズします。アスペクト比 (AR = W/H) を保ちながら、他の2つの値は自動的に計算されます。 Magnification キーワードを設定するには元の画像サイズを知っておく必要がありますが、WidthとHeightはそのどちらかを指定するだけです。

この時点でついに、モバイルフォンからロードした写真を回転させ、サイズを変え私の小さなモニターに表示できるようになりました。コマンドの手順は以下の通りです:

  WAVE> t = PHOTO_READ(‘c:\dev\data\trees.jpg’)

  WAVE> r = PHOTO_ROTATE(t, 3)

  WAVE> s = PHOTO_RESIZE(r, Height=1000)

  WAVE> PHOTO_DISPLAY, s

ここで紹介したヘルパー関数はすべて GitHubから入手できます。できれば他のユーザもPV-WAVE2016.1に含まれる新しいPHOTO関数、これらの役に立つ機能を使ってみたいと思って頂ければと思います。尚、Part2では新しい機能をもっと探求し、追加されたツールやユーティリティについて紹介したいと思います。

f:id:RWSJapan:20170224160520j:plainEd Stewart はソフトウェア業界で15年の経験をもつセールスエンジニアです。Edは実験流体力学を専攻し、研究論文を発表し、米国デラウエア大学の博士課程(Ph.D)を取得しています。現在彼は、開発者の仕事を簡単にするための役割を担っています。

編集後記

いかがでしたか? これまでPV-WAVEにあったImage関数(Image_Read,Image_Display)を使ったことのある方であれば、なるほどと思われたのではないでしょうか? 近々投稿されるEdによるPart2も楽しみに! 

PV-WAVEに関する過去の投稿もご覧ください。

PV-WAVEの新機能についてはこちらをご覧ください。

By M.S