スキップしてメイン コンテンツに移動

投稿

ラベル(静止画)が付いた投稿を表示しています

クッキークリッカーとプログラマ

先週ぐらいから クッキークリッカー(Cookie Clicker) というJavaScriptを使ったブラウザゲームが流行っている。クリックするだけのゲームと聞いて、最初はあまり興味を持てなかったのだが、自分の周りであまりにもやっている人が多いので少し遊んでみることにした。 クッキークリッカーを簡単に説明すると、まずはクリックすることでクッキーを作り、作ったクッキーを使ってクッキーの生産性を高めるためのアップグレードやアイテムを購入し、たまに出現するゴールデンクッキー(Golden Cookie)をクリックすることでさらに多量のクッキーが得られるので、それらを駆使してできるだけたくさんのクッキーを作るというゲームだ。 このようにとてもシンプルなゲームなのだが、最初はちまちまとしか作れなかったクッキーが徐々に増えていき、様々なアイテムやイベントを通すことで、終盤では毎秒数千億クッキーを作れるというところに人々を惹きつける魅力があるらしい。しかし、自分は「人間の代わりにプログラムを働かせることでどこまで効率が良くなるか」という目的のために自動化プログラムを作成したくなった。コンピュータは人間を楽にさせるために存在するべきだ。 このゲームはJavaScriptで作られており、そのコードや変数を修正すれば簡単にチートを行うことができる。しかし、自分はそれについては全く興味がない。元のシステムには全く手を入れずに人間が操作する部分のみをプログラムで最適化したいのだ。 まず、最初に考えついたのは自動クリックだ。これは様々なツールが世に溢れているのでそれを使っても良いのだが、プログラマだったら、このぐらいは自分で作りたい。そこで、Pythonと pymouse を使って自動クリックプログラムを作成した。これで、毎秒100~200クリックすることができるようになった。これ以上の速度にするとブラウザがついて行けずプチフリーズを頻繁に起こし逆に生産性が落ちてしまう。因みに画面上のエフェクトなどは設定で消しておくほうが良いだろう。 次に、ゴールデンクッキーへの対処だ。ゴールデンクッキーはランダムな間隔でブラウザ上のどこかに出現する。そのクッキーをクリックすると溜まっているクッキーの1割分の枚数が貰えたり、一定時間現在の7倍の効率でクッキーを焼けるようになったりする。...

Python: 画像で与えられた迷路に対し2点間の最短経路を求める

迷路の描かれた画像に対して、ピクセルの座標で指定したスタート地点とゴール地点の最短経路を求めるプログラムをPython+PILで書いてみた。使用する画像は、デジカメで撮ったものでも、ウェブから拾ってきたものでも、ペイントソフトで自作したものでも構わない。 まずは使用例を見て欲しい。この画像は携帯カメラで撮った自作の簡単な迷路だ(画像上)。それに対して指定した2点間の最短経路を赤線で示してみた(画像下)。ピクセル単位で計測しているので赤線が若干ガタガタしていて完全な最短経路ではないがほぼ最短と考えていいだろう。迷路画像(画像上)をmaze01.jpgとし、スタート地点の座標が(240, 160)、ゴール地点の座標が(210, 400)の場合、コマンドラインで以下のように実行する。 maze_solver.py maze01.jpg -s 240 160 -g 210 400 これで最短経路を求めることができ、画像ビューアが立ち上がって経路の描かれた画像が表示される(画像下)。画像ビューアではなく画像ファイル(ここではmaze01out.jpgとする)に出力したい場合は、以下のようにする。 maze_solver.py maze01.jpg -s 240 160 -g 210 400 -o maze01out.jpg このプログラムは2つのパートで成り立っていて、一つは画像認識を使った画像データの領域分けであり、もう一つはその領域内の2点間の経路探索である。それぞれ、 連結成分ラベル付け(connected component labeling, CCL)アルゴリズム と A*探索アルゴリズム を利用して処理している。詳細についてはそれぞれのリンク先と最後に示したソースコードを参照して欲しい。 次の例は、Wikipediaの 迷路 の項目で例示されている迷路画像(画像上)を解いてみたものだ(画像中、下)。いずれも迷路の真ん中の小部屋(270, 130)をスタート地点とし、画像中段ではゴールを左上(0, 0)、下段では右下(490, 268)とした。スタートとゴールまでの経路は複数あるが、いずれも最短経路を示している。 画像上段をmaze02.pngとした場合、画像中段、下段は、それぞれ以下のように実行して作成した。 maze_solv...

Python: 複数の画像ファイルを余白を埋めるように貼り付ける

何か面白いコードが書きたいなぁ、と思ってPython+PILで複数の画像ファイルを適当に余白を埋めるようにキャンバスに貼り付けるプログラムを書いてみたけどあまり面白くなかった。それでもせっかく書いたので一応公開する。 まず、入力した画像ファイルすべての面積を取得して、その面積と出力画像の面積の比を求める。すべての入力画像に対して、その比から大きさを変更する。これで入力画像の面積の総和と出力画像の面積が等しくなる。次に、入力画像を面積の大きい順にソートし、入力画像一つ一つと出力画像を重ね合わせ、もっとも余白との一致が大きい場所を見つける。その場所に入力画像を貼り付ける。貼り付ける際、全体の余白を少なくするために画像の大きさをランダムに1.2~1.5倍に拡大している。すべての入力画像を貼り付ければ完了だ。 ここの画像は フリー画像素材EyesPic に置いてあった植物写真の22枚を貼り付けてみたものだ。プログラムの使い方は、 place_pictures.py 出力画像ファイル 複数の入力画像ファイル... のようにする。例えば、同じディレクトリにあるすべてのJPEGファイルをimage.jpgに貼り付ける場合、以下のようにすればよい。因みにデフォルトでは600×800ピクセルの大きさの画像となっている。コード内のXSIZE, YSIZEを指定することで自由に変更できる。 place_pictures.py image.jpg *.jpg 以下にソースコードを示す。 place_pictures.py #!/usr/bin/env python import sys, os, glob, math, random, Image IMAGE_EXT = (".jpg", ".jpeg", ".jpe", ".png", ".bmp", ".gif", ".tif", ".tiff") IMAGE_XSIZE, IMAGE_YSIZE = 600, 800 def place_pictures(files, img_file): area = 0 sorted_...

Python: 続・簡単ステガノグラフィ…画像を画像に埋め込む

前回の なんちゃってステガノグラフィ はあまりにも酷い出来だと思ったので、少しばかり改良してみた。画像データのアルファ値を利用していたのをRGBに置き換え、最下位ビットを利用する方法に変更した。アルファ値だと生データを見れば一発で怪しいと分かるが、RGBだと余程注意深くないと分からないだろう。また、入力データにはテキストだけではなく、バイナリファイルも指定できるようにした。ファイル名は保存されるので、隠したデータを取り出す際もファイル名の指定が不要だ。 使い方は前回と一緒。ただし、上記の理由で出力ファイルの指定はない。 で、上のネコの画像(kitten01.png)に下のモルモットの画像(guinea01.jpg)を隠してみる。 covgraph.py kitten01.png kitten01g.png guinea01.jpg 画像を隠し入れた画像(kitten01g.png)を下に示す。最初の画像と見た目はほとんど変わらない。 取り出すときは以下のようにする。 covgraph.py kitten01g.png ステガノグラフィについての知識なんてほとんど持ち合わせていないので、これがどの程度有効かなんて分からないし、きっと世の中にはもっと効率の良いアルゴリズムなんかがあるのだと思うけど、気にしない。だってお遊びのプログラミングだから。作る過程でいろいろ考えることが楽しいのだ。 追記: 出力画像ファイルにはPNGかBMPを利用するのが良い。JPEGは非可逆圧縮により埋め込むデータが壊れるし、GIFはパレットの制限に引っ掛かるためだ。因みに、入力画像ファイルはどのフォーマットでも問題ないはず。また、このサイトはアップロードした画像を非可逆圧縮するので本記事の画像をそのまま利用してもデータを取り出すことはできません。 以下、ソース(covgraph.py)。 #!/usr/bin/env python # -*- coding: utf-8 -*- """covgraph.py by nox, 2008.4.17""" import sys, os, bz2, zlib from PIL import Image def embed_data(da...

Python: 簡単ステガノグラフィ…テキストを画像に埋め込む

Pythonでなんちゃって ステガノグラフィ を作ってみた。画像データにテキストを埋め込んで、メッセージを隠してしまうというわけだ。お遊びで適当に作っただけなので、本格的な使用に耐えうるものではないことをお断りしておく。 上に示す画像は何も埋め込まれていないもの。下に示す画像には Python: PaSoRiでSuicaの履歴を読み出す の全文が埋め込まれている。 これなら変更したことを誰にも気づかれないだろう。使用したソース(covgraph.py)は下に示す。使い方は、 covgraph.py cover.png stego.png input.txt とする。cover.pngにinput.txtの中身を埋め込み、stego.pngとして出力する。input.txtに代えて直接文字列を指定することもできる。 covgraph.py cover.png stego.png "hello, world" とすれば、stego.pngには"hello, world"が埋め込まれることになる。 埋め込まれた画像からテキストを取り出す場合は、 covgraph.py stego.png もしくは、 covgraph.py stego.png output.txt とする。前者は標準出力、後者はファイルに書き出す。 追記: 今回のソースは書き殴りで汚いしアルゴリズムとしてもよくないと思うので、修正版の Python: 続・簡単ステガノグラフィ…画像を画像に埋め込む の方がましだと思う。 #!/usr/bin/env python # -*- coding: utf-8 -*- """covgraph.py by nox, 2008.4.15""" import sys, os, bz2, base64 from PIL import Image def cover(input_image, output_image, text_data): """テキストデータを画像ファイルに埋め込む. input_image: 入力画像ファイル. ou...

TeXの数式を簡単にEPSやJPEGなどの画像データに変換する方法

TeX wiki TeXの数式をDTPソフトに よりメモ。 pLaTex一式(Ghostscript関連含む)がインストール済みのこと。EPSではなくJPEGなどの画像データに変換したい場合はImageMagickがインストール済みのこと。 上記のような数式を作りたい場合、以下のようなTeXテキストファイルを作成する(ここではeq.tex)。 \documentclass[12pt]{jarticle} \begin{document} \thispagestyle{empty} \[ \mathrm{RMSD} = \sqrt{\frac{1}{N}\sum_{i=1}^N{\delta_i^2}} \] \end{document} 上記のTeXファイルを、 platex eq.tex としてDVIファイルを作成する。 dvipsでEPSファイルに変換。 dvips -E -Ppdf -x 5000 eq.dvi -o eq.eps EPSのアウトラインを取る。 Windows: gswin32c -dSAFER -q -dBATCH -dNOPAUSE -sDEVICE=epswrite -dEPSCrop -r9600 -sOutputFile=eq2.eps eq.eps Lunix: eps2eps eq.eps eq2.eps EPSファイルをJPEGファイルに変換したい場合は以下を実行。 convert eq2.eps eq2.jpg 目的に合わせて、eq2.epsやep2.jpgを利用する。 Windowsなら、以下のようなコマンドスクリプト(ここではconvert_eq.cmdとして保存)を作っておけば、 convert_eq.cmd eq これで変換できる。 platex %1.tex dvips -E -Ppdf -x 5000 %1.dvi -o %1.eps gswin32c -dSAFER -q -dBATCH -dNOPAUSE -sDEVICE=epswrite -dEPSCrop -r9600 -sOutputFile=%1_2.eps %1.eps convert %1_2.eps %1_2.jpg Linuxも同様にシェルスクリプトを作成する。 ...

マルチページTIFFを分割する

TIFFフォーマットは一つのファイルに複数の画像を保存できるマルチページTIFFをサポートしている。これはこれでなかなか便利であると思うが、それを表示させたり、利用したりするときに困ることがよくある。そこで、ここでは簡単にマルチページTIFF画像ファイルを分割してJPEGやPNGで保存する方法を以下に書いてみる。 まあ、普通に考えたらImageMagickのconvertコマンドで一発なんだけど、それだと面白くないので、ここではPython+PILを使った方法を使ってみる。因みに、ImageMagickでJPEGファイルを作成する場合は以下のように実行すれば良い。 convert file.tif file_%04d.jpg 次に、Python+PILのコードを以下に示す。 import sys, os, Image filename = sys.argv[1] im = Image.open(filename) try: count = 0 while 1: im.seek(count) im.save(os.path.splitext(filename)[0] + "_%04d" % count + ".jpg") count += 1 except EOFError: pass これを適当なファイル名、たとえばsplit_tiff.pyとして保存して、 split_tiff.py file.tif のように実行すれば良い。file_0000.jpg, file_0001.jpg, file_0002.jpg, ...のように連番で出力してくれる。簡単。因みにconvertもPythonコードも拡張子 .jpg を .png に変更すればPNG画像ファイルに変換してくれる。あと、デカイTIFFファイルを扱う場合、いったん全部読み込んで処理するconvertよりもPythonコードの方が速いみたい。

連続した静止画を動画にする方法

mplayer に付属しているmencoderを使う。 MPlayer - Download からダウンロードできる。Windowsでも、Unixでも利用できる。Windowsでは コマンドプロンプト 上で使う。詳しくは マニュアル を参照のこと。 連続した複数のPNG画像をフレームレート30でAVI動画ファイル(output.avi)に変換する。 mencoder "mf://*.png" -mf fps=30 -o output.avi -ovc lavc -lavcopts vcodec=msmpeg4v2 ついでに、 ImageMagick を利用した画像フォーマットの変換についても載せておく。 mencoderはBMP画像を取り扱えないので、BMP画像を動画にしたい場合は予め変換しておく必要がある。ImageMagickについては、 Googleあたりで検索 すれば詳しいインストールや扱い方が見つかると思う。 PostScript画像(input.ps)をGIF画像(output.gif)に変換する。 convert input.ps output.gif 複数あるBMP画像を同じ名前でPNG画像にする。拡張子だけが変わる。 mogrify -format png *.bmp