Linux その9 伊藤敏 今回は画像を扱うソフトの紹介をします.画像は見るだけでも楽しいものです.しかし,理工系の人がそこからある情報を引く出そうとすると,画像は持っている情報量が多く,画像の解析には力量が要求されます.ここでは,画像を表示し,加工して,かつ,その画像を数値化するツールの紹介を中心に置きます.「xv」と「netpbm」です.更に,数値数式処理ソフトも先月に続き紹介します. 1. 画像表示プログラム xv はじめに,画像の表示と画像フォーマトの変換などに便利な「xv」を紹介します.ただし,xvはシェーウェアです.継続して使うときは,送金をしましょう.個人で使用する場合は$25です.筆者の場合は郵便局から送金をしました.1カ月程したら,立派なA4サイズのカードが送られて来ました.その中に,「unregistred」の表示を「Registred ...」という表示に変える方法が書かれてありました. * xvのインストール xvはslackwareに入っております.たぶんインストールされているはずです.しかし,ここではgsを用いてポストスクリップトファイルも表示できるようにすることと,圧縮ファイルをそのまま表示できるようにするために,コンパイルをし直しします. ghostscriptと同じように/home/itou/exportsの下にソースファイルのxv-3.10.tgzをコピーし,展開等をします. % cd exports % cp /cdrom/slackware/source/xap/xv/xv-3.10.tar.gz . % tar zxvf xv-3.10.tar.gz % cd xv-3.10a config.hを変更します.gunzipとghostscriptを使用可能にする変更をリスト1にまとめました.参照して下さい. ******** list 1 start ********** リスト1 config.hの変更するところ #define USE_GUNZIP <-- 16行目 #undefを #defineに #ifdef USE_GUNZIP # ifdef VMS # define GUNZIP "UNCOMPRESS" # else # define GUNZIP "/bin/gunzip -q" <-- 22行目 パスを変更 # endif #endif 中略 #define GS_PATH "/usr/local/bin/gs" <-- 91行目 #define GS_LIB "/usr/local/lib/ghostscript" <-- 92行目 前後のコメントを外す #define GS_DEV "ppmraw" <-- 93行目 ************ list 1 end ******** xv.hの102行目から始まる /* include files */の後に #include を付け加えます. つぎに,jpegディレクトリに移り, % cd jpeg % ./configure これにより作られるMakefileの138行目の先頭に「#」を加えコメントにします. # jconfig.h: jconfig.doc このディレクトリで % make libjpeg.a としてから,まえのディレクトリに戻ります. % cd .. ここで,Makefileをリスト2のように修正します. ****** list 2 ********** start ********* リスト2 xvのMakefileの修正 CC = gcc <-- 4行目 ccをgccに 中略 ### Installation locations BINDIR = /usr/X11/bin <-- 31行目 localをX11に変更 MANDIR = /usr/X11/man/man1 <-- 32行目 localをX11に変更 MANSUF = 1 LIBDIR = /usr/X11/lib <-- 34行目 localをX11に変更 中略 $(JPEGLIB): $(JPEGDIR)/jconfig.h cd $(JPEGDIR) ; make libjepg.a <-- 55行目 libjepeg.aを加える 中略 ### for LINUX, uncomment the following line MCHN = -DLINUX <-- 105行目 コメントを外す ******** list 2 end ********** % make スーパーユーザになって # make install これで,xvのインストールは終りです.これらのことが面倒であれば,slackware等に入っているままを使っても構いません. * xvを使って見よう xvの起動は % xv filename とします.または,ファイル名は指定せず,起動をして,xvの画面が出たら,マウス右ボタンを押すと図1の左下のコントロール用ウインドウが開きます.この中から,「load」を選んで,ファイルを指定できます.図1は左上がxvの画像表示ウインドウです.ここでは表示ウインドウに,NHKの大河ドラマ「秀吉」の主人公の生まれ故郷の近くにある,大きな鳥居が表示されおります.右上が加工用のウインドウで,「e」を入力すると表示されます.表示を消すにはもう一度「e」と押します.右下のウインドウは左下のコントロール窓から「save」を選んだ際に表示されたものです.xvの対応している画像フォーマットをリスト3に示します. 図1. xvの表示ウインドウと機能ウインドウ ***(xv.tif):XV.TIF ****** list 3 start *********** リスト3 xvの対応する画像フォーマットと色 GIF (GIF87, GIF89) JEPG TIFF PostScript <-- 画像の印刷に利用 PBM/PGM/PPM(raw) PBM/PGM/PPM(ascii) <-- 画像の数値化に利用 X11 Bitmap XPM BPM PDS/VICAR Sun Rasterfile IRIS RGB Targa(24-bit) FITS PM 対応する色: 1, 2, 4, 6, 8, 16, 24, and 32-bit color, greyscale, and black/white ********** list 3 end ****************** xv表示ウインドウの中で,画像の情報を取り出せます.たとえば,マウス中央ボタン(2ボタンマウスを使用の場合は左と右のボタンを同時に押す)を押すと,スポイドの様なポインタが表示され,表示画面の左上端を原点(0,0)としたポインタの位置と色を数値で表したもの(黒が 0,0,0)が示されます.この機能は2点間の距離を求めたり,光強度の比較等の目的には大変便利なものです.また,画像が小さくて,これらの操作がやりにくい場合は,「.」,「>」で画像を拡大,「,」,「<」で縮小できます. マウス左ボタンを押したまま,マウスを移動すると,四角形の領域が選択されます.ここで「c」を押すと,選択領域以外がカットされます.いくつかの機能を表1にまとめました. 少し変わった使い方としては,テキストファイルを読み込んで表示できます.日本語は表示されません.しかし,アスキーコードと16進表示の選択が可能です.画像ファイルも画像として表示するのでなく,Ctrl+tとすることで,テキストとして見ることができます.画像のフォーマットを調べる時には役立ちますね. また,表示加工するだけでなく,画像を印刷する際に便利に使えます.xvのsaveウインドウから画像フォーマットとしてPostScriptを選ぶと,図2のようなウインドウが作られ,印刷をしたい場所に,任意の大きさでPostScriptファイルとしてセーブできます.このPostScriptファイルをgsを使って,印刷することができます.筆者は安くなったCanon BJC-400Jを購入しました.MS-Windows 3.1を用いて,ビデオカメラから画像をキャプチャし,Linuxに持って来てから,前述の方法で印刷をしております(gsにはBJC-600用のドライバを使用).お仕事とはあまり関係ないのですがカラーで印刷ができるのは実に楽しいですね. 図2. xvから PostScriptファイルへセーブする ***(ps.tif):PS.TIF *********** table 1 start ********** 表1 xvの機能と操作 マウス中央ボタン ポインタの位置と色の数値化 マウス左ボタン 四角形領域の選択 マウス右ボタン コントロールウインドウの表示,消去 「.」,「>」 拡大 「,」,「<」 縮小 t 90度 右回転 Shift+t 90度 左回転 h 左右反転 v 上下反転 c 選択領域以外をカットして表示 i 画像情報の表示 Ctrl+t テキスト表示(AsciiとHexの選択可) ********* Table 1 end *********** 2. 画像フォーマット変換と画像処理コマンドツールのnetpbm netpbmは画像フォーマットを変換したり,処理をする多くのプログラムの集まりです.少し前にはpbmplusとして配布されておりました.xvでは扱いにくいことも処理できます. netpbmの画像変換は,画像の基本フォーマットとして白黒2値画像を pbm,グレースケール画像を pgm,フルカラー画像を ppm を選び,他の画像フォーマットと pbm, pgm, ppmとの変換ツールを用意するという考え方です.例をあげますと,xwdフォーマット(X Windowのダンプファイル)からtiffフォーマットへ変換するにはxwd -> tiff というプログラムを用意するのでなく, xwd -> pbm(または,pgm,ppm)と pbm(または,pgm,ppm) -> tiff の変換プログラム xwdtopnm, pnmtotiffを用意しております.画像フォーマット数が増えた時に,画像フォーマット間の組合せ数が膨大に増えますが,互いの変換プログラムを用意しなくても,pbm(または,pgm,ppm)への変換と逆変換のプログラムの2つを用意すれば事足ります. * netpbmのインストール ファイルの入手先は「InformagicのLinux(1995.8)」の2枚目の「apps/graphics/convert/netpbm-Mar1994-bin.tar.gz」からです.ファイルを展開します. % tar zxvf netpbm.tgz % cd netpbm ここで,netpbmの多くのコマノド群をいれるディレクトリをMakefileで指定します.大変多くのコマノドがあります.そこで, /usr/local/bin/netpbm にいれることにします.Makefileの59行目の INSTALLBINARIES = /usr/local/netpbm を INSTALLBINARIES = /usr/local/bin/netpbm に変更します. あとは % make スーパーユーザになって # make install で,終了です. netpbmコマンド群をいれた /usr/local/bin/netpbm にはパスが通っていません.そこで,パスを通しておきましょう. /etc/profile のPATHの設定部に /usr/local/bin/netpbm を':'で挟んで,加えましょう. * netpbmを使って見よう X Windowの画面を一部切り取りましょう. % xwd > tmp.xwd で,マウスのカーソルが「+」に変わります.取り込みたいウインドウをクリックすると,tmp.xwd ファイルにxwdフォーマットでウインドウのイメージが保存されます.これをtiff形式に変換しましょう. % xwdtopnm t.xwd |pnmtotiff > tmp.tiff さて,画像変換は,正直に言うとnetpbmを用いるより,xvの方がメニューから選んで変換できますので,ずーと楽です.しかし,輪郭を抽出したり,ある大きさにカットするにはnetpbmの方が楽に処理ができます.例えば,図1に示した鳥居の画像の輪郭を抽出しましょう. 鳥居の画像は torii.tif です. % tifftopnm torii.tif | ppmtopgm | pgmedge | pnmtotiff > torii-edg.tif まず,torii.tifをppmに変換をします.輪郭の抽出はグレースケール画像で行ないますので,ppmからpgmに変換をします.pgmedgeで輪郭を取り出し,その結果をtiffファイルに落しました.図3にその結果を示します. 図3. 輪郭抽出の結果 **(torii-edg.tif):TORII-EDG.TIF その他に,指定した長方形でカットするpnmcut 等があります.面白いものとしては,バーコードを作る pbmupc というコマンドがあることです.netpbmの中で,画像処理をするコマンドを表2にまとめました.ここの,コマンドに付いての説明は紙面の関係もあり,できません.manコマンドでそれぞれのコマンドを調べて,利用して下さい. ***** Table 2 start ********** 表2 netpbmの画像処理コマンド pbmclean pbmlife pbmmake pbmmask pbmpscale pbmreduce pbmtext pbmupc pgmbentley pgmcrater pgmedge pgmenhance pgmhist pgmkernel pgmnoise pgmnorm pgmoil pgmramp pgmtexture pnmalias pnmarith pnmcat pnmcomp pnmconvol pnmcrop pnmcut pnmdepth pnmenlarge pnmfile pnmflip pnmgamma pnmhistmap pnmindex pnminvert pnmmargin pnmnlfilt pnmnoraw pnmpad pnmpaste pnmrotate pnmscale pnmshear pnmsmooth pnmtile pnmmerge ppm3d ppmbrighten ppmchange ppmdim ppmdist ppmdither ppmflash ppmforge ppmhist ppmmake ppmmerge ppmmix ppmnorm ppmntsc ppmpat ppmquant ppmquantall ppmqvga ppmrelief ppmshift ppmspread *************************** Tabel 2 end ******** 3.MuPUD MuPADとは何でしょうか.MuPADはMulti Processing Algebra Data Toolの略です.ドイツのPaderborn大学のグループが作りました.大きなデータを扱うツールとして開発されたとあります.おもに,非線形システムを取り扱うのが目的のようです.それはそれとして,計算をしたり,式の変形をして,グラフを描くのに,便利に使えます.筆者は開発者の意図に基づく使い方をしている訳ではありません.そこで,簡単な紹介だけにします. *インストール 今回用いましたのは,MuPAD 1.2.1aのデモバージョンです..正式に入手するには,MuPAD-distribution@uni-paderborn.de に連絡をします.非営利団体の研究教育機関には無料で配布されます.営利団体の場合は別途連絡をするようにとありました.正式バージョンのインストールは,さておき,今回は,デモバージョンのインストールに付いて述べます. デモバージョンはInforMagicのcdrom(August 1995)のdisk2に入っておりました. apps/math/MuPAD/mu1に mubase.tgz mudemo.tgz mudocbig.tgz apps/math/MuPAD/mu2に mubin.tgz mudocsma.tgz apps/math/MuPAD/mu3に mugifman.tgz mugiftut.tgz apps/math/MuPAD/mu4に mudocbas.tgz mudocext.tgz mux11r6.tgz スーパユーザになり,これらのアーカイブファイルを'pkgtool'を用いて,展開,インストールします.これらのファイルは'/usr/local/MuPADの下に展開されます.その後,セットアップを実行します. # cd /usr/local/MuPAD/share/bin/admin # ./setup とします.'setup'を実行する時,'./'を忘れないで下さい.忘れて,'setup'と入力すると,Linuxをインストールした時の画面になります.実行するとMuPADをインストールしたディレクトリを聞いて来ますから, /usr/local/MuPAD と,入れます.さらに, mupad_init をインストールするディレクトリを聞いて来ますので, /usr/local/bin と入力して,終りです. *使って見よう KtermまたはXtermから % xmupad とすると,図4の様なopenwinを用いた窓が開きます.図では'a'を15と定義して,1,10,aの3つの数から最大値と最小値を求めています.さらに,1+2を計算しております.計算の区切りには';'(セミコロン)を必ず入れます.セミコロンを入れない場合には計算式や命令が次の行に継続すると見なされます.さらに,':'(コロン)の場合には結果を出力しません.いくつか計算をして見ましょう.図5には400の階乗を計算するのに,'fact(400);'と入れております. 図4. MuPADのウインドウ ***(9-4.tif):9-4.TIF 図5. 階乗の計算 ***(9-5.tif):9-5.TIF さらに,'diff( );'を使うと,微分ができます.偏微分や高次微分の場合は微分変数を並べて書いたり,重ねて書くことで,微分できます. 積分を実行する場合は,ライブラリをロードしてから'int( );'を用います.微分・積分の様子を図6に示しました. 図6. 微分・積分の様子 ***(9-6.tif):9-6.TIF では,グラフを描いて見ましょう.図7の様に入力しましょう.前半の'plot2d( )'命令で,図8のサインカーブが描かれます.図7の後半の'plot3d( );'命令で,図9が描かれます.いずれにしても,グラフを描く機能は'Vcam'と言うソフトが担当をし,'xmupad'の中から自動的に起動されます.ここでは図10の様な設定画面でグラフを描いた後も設定を変えて再表示できます. ここではMuPADの持つ機能のごく一部しか紹介できませんでしたが,素晴らしさは十分御理解いただけたものと思います.更に,使い込むには,いろいろな形でマニュアルやチュートリアルが用意されております.使用中のマニュアルは,例えば微分の使い方を知りたい場合は'?diff'と微分の'diff'の前に'?'を付けます.ただ,ドイツ語で表示されます.その他に,/usr/local/MuPAD/share/doc/hytexのディレクトリにdemo.dviとtutorial.dviがあります.これらを'xdvi'で見ながら実行すれば,かなりのところまで利用が可能です. ここでは,X Windowの環境で用いる'xmupad'を紹介しましたが,コンソールで使うには'mupad'として下さい.グラフ機能以外は'xmupad'と同じように使えます.入力行の編集はemacs(mule)と同じ操作環境を持っております. 図7. 作図命令 ***(9-7.tif)*9-7.TIF 図8. サインカーブ ***(9-8.tif)*9-8.TIF 図9. 3次元図 ***(9-9.tif)*9-9.TIF 図10. グラフ設定画面 ***(9-10.tif)*9-10.TIF 4. Octave Octaveとは数値計算をするためのツールです.特に,行列演算に優れております.かなり大きな演算をこなす優れものです.面白いことに,フーリエ変換とそれの逆変換の機能も備えております.計算結果をグラフ表示する時にはOctaveの中からGnuPlotを利用して,グラフ化します.また,230ページぐらいのマニュアル(ポストスクリプトファイル)が付いております. * Octaveのインストール ファイルの入手先は「InformagicのLinux(1995.8)」の2枚目の「 apps/math/matrix/octave-linux-1.1.1.tar.gz」からです.ファイルを展開します. % tar zxvf /cdrom/apps/math/matrix/octave-linux-1.1.1.tar.gz % cd octave-1.1.1 ここで,メイクをする必要はありません.octave-1.1.1のディレクトリ内に実行ファイル(octave)が用意されております.実行ファイルやライブラリ等をコピーすれば終りです.それを実行するコマンドが用意されております.スーパーユーザになって # ./doinstall.sh で,終了です.詳しくは,同じディレクトリにあるINSTALL.OCTAVEを見て下さい. * Octaveを使って見よう Octaveはいろいろなことができますが,それの持つ機能を紹介することはとてもとても出来ません.ほんの一端だけを紹介します.くどいですが,この文で興味が持てたら,マニュアルを見て下さい.docディレクトリにあるoctave.dviまたはoctave.psファイルがマニュアルです.xdviなり,gsで表示しながら,そこにある例を実行して見て下さい.読者の皆さんが携わっている分野によっては大変有用なプログラムです. 起動はKtermやXtermから % octave です.octave:1>というプロンプトが表示され,次の入力が要求されます.終了はquitをいれます.グラフ表示をしなければ,X Window上でなくとも実行可能です.入力行の編集はEmacs(Mule)と同じ操作です.図11に,aに行列を定義し,それの行列式の値を求め,bに逆行列を代入して,aとbの積を求める様子を示しました. 図11. octaveの起動と行列演算の実行 ***(matrix.tif):MATRIX.TIF 関数を定義する例として,階乗を求めます.この場合は再帰を用いております. function fact= fn(n) <-- fn(n) の定義 > if (n>0) <-- 「>」はOctaveが出力 > fact=n*fn(n-1); > else > fact=1; > endif > endfunction <-- 関数定義の終り これで,fn(10)とすると ans = 3628800 と答えが返って来ます. 非線形方程式を解く例です. function y=f(x) <-- f(x) の定義 > y(1)=-2*x(1)^2+3*x(1)*x(2)+4*sin(x(2))-6; > y(2)=3*x(1)^2-2*x(1)*x(2)-2+3*cos(x(1))+4; > endfunction 関数を上のように定義して fsolve で 解を求めます. [x,info]=fsolve("f",[1;3]) <-- 入力 x = <-- 以下 出力 0.85516 3.60296 info = 1 ここで,info=1の表示は解が収束したことを示しております. 最後にOctaveの中でグラフを描く例として,減衰振動を発生させ,それをグラフ化しましょう.減衰振動の発生関数を exp(-0.1*x) sin(x) とします.つぎの各行の「;」は結果の表示抑制のために付けております. octave:1> a = linspace(0,20*pi,200); <-- aに0から20πまで200個のデータを入れる octave:2> sin1=sin(a); <-- sin1にaの各成分のsinを入れる octave:3> ex1=exp(-0.1*a); octave:4> dsin1=diag(sin1); <-- sin1の各成分を対角成分とする行列をdsin1とする octave:5> dex1=diag(ex1); octave:6> prod=sum(dsin1*dex1); <-- sin1とex1の各成分の積(dsin1とdex1の積から,各列毎の和をとる)をprod に入れる octave:7> plot(prod) <-- GnuPlotによるグラフ化 plot命令で,GnuPlotを用いて,計算結果が入っている数列「proc」をグラフ化します.その結果を図12に示しました. 図12 Octave内からのグラフ化 **(gensui.tif):GENSUI.TIF 5. 来月をもってこの連載を終ります.第1回の時に「筆者はインターネットにアクセスできません」と申し上げました.筆者の場合,それから事情が変わりました.しかし,連載の中では誰でも入手可能な市販のCR-ROMからのソフトに限って紹介をし,インターネットからプログラムソースを持て来て,それの紹介をすることを「禁」として来ました.それは,インターネットにつなぎたいが,現実は「まだつながっていない人」が結構多いからです.しかしながら,この1年でインターネットの環境は大きく変わりました.そこで,最終回はこの「禁」を解き,インターネットから持って来たソフトの紹介も含めて,Linuxの世界の広がりの一部と現実の「お仕事」に使っている例を紹介します.