今回は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(P6)画像の形式は、コードを見れば分かるかと思いますが、ヘッダ+データで成り立っており、 ヘッダは、形式、横サイズ、縦サイズ、分解能から成り立っています。詳しくは調べてみてください。
見れば分かりますが、このコードは汎用的なものではありません。 本来なら、いかなるサイズにも対応すべきなのです。
実際に動かしてみましょう。入力と出力を以下に示します。
Rubyソースコードと入力例を置いておきます。