ARAIBOムービーまとめengSearch上田ブログなお、このサイトはbashでできている。皆様、ラーメンのおいしい季節、いかがお過ごしでしょうか。筆者は朝うどん、夜ラーメンという、太く短い人生を歩んでおります。通常はバイナリ形式でファイルにします。ディスプレイの上に画像として再現できます。実はテキストで画像を表現する形式は存在しています。形式について紹介します。ppm形式は、カラー画像の表現形式の一つです。ここではテキストの形式について説明します。説明のため、次のようなjpgの写真を準備しました。これをppm形式にしてみましょう。今回使う写真(ラーメン)画像の変換には、ImageMagickというツールが便利です。知らないうちに使っている人は多いかもしれません。ウェブ等で調べてなんとかインストールおねがいします。問題なくインストールされます。ImageMagickの機能が使えるようになります。このように、オプションの最後の方に入力ファイル名と出力ファイル名を書いて変換します。こんなふうに、テキストとして読めたらうまく変換できています。上数行のヘッダ部と、その下から始まる数字の羅列で構成されます。幅、高さ、ピクセルの値の最大値を表します。テキスト形式で保存されているという意味になります。Bの順にピクセル値が並びます。見ると数字が3個ごとに似ていることに気づきます。改行とスペースが区切り文字になり、改行はどこに入れてもよいことになっています。画像が閲覧できると思います。これからやる処理も速くはありません。わかりやすいようにするためのお賽銭ということでご了承を。シェルスクリプトで画像処理¶では、シェルスクリプトでこの画像をいじってみましょう。興味がある方はmanを読んでみてください。本稿では、画像の形式変換のみでImageMagickを使います。次の形式のように5列のデータに変換しましょう。...コードは次のようなものを書きました。ヘッダから幅を取得しています。013行目以降が、ピクセルの値を並べ直して座標をレコードに付加するコードです。先に計算結果を見てから説明します。その行数以降という意味になります。15行目では、数字を全部縦に並べなおしています。先に縦に並べて、19行目で3個ずつ横に並べています。17行目は、余計な空白があると空行ができるので、それを取り除いています。3回に一回改行を入れるという処理です。19行目のように空文字を出力すると改行の意味になります。各ピクセルのRGB値に座標を与えています。AWKでは、物の個数はなんでも1から数えます。これも1からスタートします。これは直感的でよいのですが、数学的には面倒な処理を生む原因になります。そこから、各ピクセルが上から何行目、左から何列目に位置するかを計算しています。小さめの画像で試してから大きな画像を処理してみてください。これはシェルスクリプトでやると高速処理は全く期待できません。スクリプト言語はどの言語もピクセルごとに読み出して処理するのは苦手なようです。使って画像にいたずらしてみましょう。基本として、画像の一部分を切り出してみましょう。雑技団的な雰囲気を出すために端末でやってみました。画像の上から(約)1000ピクセル、下から300ピクセル分を削る処理です。1行目で1001ピクセル目からのピクセルが抽出できます。2,3行目は、画像の高さと幅を計算してそれぞれファイルに保存しています。なるかは考えてみてください。4行目で、画像のボディー部を作ります。座標を取り除けばそのままppmのデータとして使えます。ファイルに保存して一丁上がりです。次のように画像を見ることができます。・・・お腹がすいてきました。jpgかなにかに変換しましょう。次に、色を反転させてみましょう。これは簡単で、RGB値それぞれを反転させればよいということになります。nega.ppm次のような画像になります。食欲を無くすラーメン画像になります。次は、ラーメン画像に別の画像を合成してみましょう。(脚注:素直に「ラーメン」としないのは性格上の問題です。)図:合成する画像これを次のように処理します。次のような動きをします。キーが同じレコードを連結します。左から1フィールドをキーするという意味です。0でパディングされます。連結しているという意味になります。最初の部分を示します。値、字のある部分については画素が黒くなる演算をしています。演算結果の小数点部分を削除する働きをします。シェルを操作しておもしろいことの一つです。最後、4行目でヘッダをつけて次のような画像の完成です。図:カレーラーメンではありません。最後は、もうちょっと難しいことをしてみましょう。ブーム(脚注:Nudiferで検索を。乗ってラーメンにモザイクをかけてみます。ラーメンの画像を100ピクセルごとに区切ってブロック化します。座標からグループのコードを作ります。いうことを、各レコードの後ろに付加しておきます。24次に、各グループの画素値を平均します。このデータがモザイクのレイヤーになります。後の出力は次のようになります。キーごとに3~5列目を足し込むという意味になります。レコードの出力の際にキーの横に数を付加します。各グループの平均のRGB値になります。「安定ソート」のオプションです。コマンドは安定ソートの方が早く終わるので経験的に付けています。レコードの一部を次に示します。10分程度かかってしまいました。AWKでこの計算をすると、もっと速く処理できます。ファイルを連結します。コマンドを使いました。側が6,7列目でソートしていないと使えません。キーでソートされている必要があります。不要なグループのキーを消去しています。作成できたら、もう少しです。以下のようにコマンドを打ちます。範囲外なら元の画像のRGB値を出力しているだけです。画像処理をやってみました。バイナリだからどうという処理は出てきませんでした。シェルスクリプトで行うようなテキスト処理に落とし込むことができます。サイズに100倍近い違いがありました。テキストを圧縮してもjpgにはサイズにはかないません。情報が保存されてしまうと、いろいろ問題が起こりがちです。テキストファイルで画像を持つことが普通になる日が来るかもやしれません。本格的な画像処理をやってみたいと考えております。AdSenseやその他ソーシャルボタンのためにCookieを使用しています。同意いただけない場合はブラウザでクッキーを無効にして閲覧をお願いします。