Ruby


グレースケール変換

今回はppm画像をグレースケールの画像に変換します。 ppm画像はあまりなじみがない形式ですか?簡単にいってしまうと、 圧縮なしで、無駄なヘッダ情報がない超シンプルな形式です。 だから説明が単純なんですね。 実は、今回のこのトピックは、Moravecオペレータ(作用素)を説明するための基礎です。
とりあえずコードを示しましょう。

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018

#! ruby -Ks #ppm方式のカラー画像をグレースケールに変換する # 2009/05/23 Shirao co="" r=open(ARGV[0],"rb"){|io| co=io.read #全部読む co=co[15..-1] #ヘッダを飛ばす(ハードコーディング) } gs=Array.new open("out.ppm","wb"){|io| io.printf("P6\n400*600\n255\n") #ヘッダ(ハードコーディング) (400*600).times{|pic| r=co[pic*3]; g=co[pic*3+1]; b=co[pic*3+1] #rgbの順番に並んでいる gs[pic]=((r*2+g*4+b) / 7).to_i #簡易グレースケール変換式 } gs.each{|gs| 3.times{io.printf("%c",gs)}} }

ポイント

バイナリデータをリードする

バイナリデータをリードするにはopen("filename" ,"rb")としてオープンして、readすればOKです。

グレースケール変換

ppmでは、RGBの順にデータが並んでいるため、これを取り出してグレースケール変換式を 適応すればグレースケールに変換できます。
変換式は簡単には(R*2+G*4+B)/7です。 正式なものは調べてください。

PPM

PPM(P6)画像の形式は、コードを見れば分かるかと思いますが、ヘッダ+データで成り立っており、 ヘッダは、形式、横サイズ、縦サイズ、分解能から成り立っています。詳しくは調べてみてください。

注意

見れば分かりますが、このコードは汎用的なものではありません。 本来なら、いかなるサイズにも対応すべきなのです。

付録

実行例

実際に動かしてみましょう。入力と出力を以下に示します。



ソース・入力ファイル

Rubyソースコードと入力例を置いておきます。


プログラムに戻る