PNMという画像フォーマットが使いやすい
Intro
画像データを扱いたいがフォーマットとかが複雑そうで、勉強する気がわかなかったが、pnmという形式によって一気にはかどったのでその話を。
PNMとはなんぞや
画像フォーマットの一つ。(他の画像フォーマットは知らないが、)データをテキストでも扱えるため、計算結果を画像フォーマットに整形するために色々考える必要がない。以下のような種類がある。
- バイナリ・ビットマップ
- 情報がバイナリ形式。また表せる色も、白or黒。
- バイナリ・グレースケール
- 情報がバイナリ形式。表せる色は、白からグレー、黒。
- バイナリ・RGB
- 情報がバイナリ形式。色はRGBを使える。
- テキスト・ビットマップ
- 情報がテキスト形式。また表せる色も、白or黒。
- テキスト・グレースケール←これを使用
- 情報がテキスト形式。表せる色は、白からグレー、黒。
- テキスト・RGB
- 情報がテキスト形式。色はRGBを使える。
どう使う?
matlabとかで計算させたい画像を持ってくる。今回は、NxM画素、グレースケールの"test.png"とおく。
PNG to PNM
png2pnmというコマンドを準備する。自分はarchを使っているが、libpngというパッケージをインストールした(気がする)。
png2pnm -n test.png > test.pnm
で、pnm形式に変換してくれる。ただし書式ルールで、一行の文字数が決まってるらしく、各行M個のフィールドがあるわけではないので、整形に関して後述する。
PNM to PNG
pnm2pngというコマンドを準備する。これもlibpngに入ってたかな。
pnm2png test.pnm > test2.png
でpng形式に変換してくれる。
PNM形式 to 行列
NxM画素の画像データだから、NxM行列で扱いたいと思うのが一般だと思う。NxM行列としてoctaveやらに読み込めるように、以下の手順を踏む。
- PNM形式 to すべてのフィールドを一行にまとめた、test.tmp ( step1.awk )
- test.tmp to 各行のフィールド数がM個にした、test.mat ( step2.awk )
- octaveでは、dlmread("test.mat")をNxM行列として読み込めるため、完了。
Step1
PNM形式の、今回使う、テキスト・グレースケールのフォーマットを簡単に説明する。
- 一行目は、6種類のうち、どの形式で書かれているか。今回はテキスト・グレースケールのため、"P2"
- 二行目は、画像の大きさ。NxM画素のため、 "N M"
- 三行目は、グレースケールでの最大値。恐らくいくつでもいいと思うが、pngを変換した結果、"65535"
- 四行目以下は、画像左上からの、各画素の値。区切り文字はスペース。
例はこんな感じ。実際はもっと長いが途中省略する。
P2 16 16 65535 32632 28557 31507 33464 33510 42367 46113 48265 49762 51108 51933 53282 42071 37332 36162 17002 30002 27844 30897 32782 ...
四行目以降に注目して、(2,2)の値を見ると"42367"となっているが、実際にはこの値は(1,6)のものであることに注意する必要がある。これを、以下みたいな感じにするスクリプトを書く。
16 16 32632 28557 31507 33464 33510 42367 46113 48265 ...
実際に書いたスクリプトはこれ。
NR == 2 { print $0 } NR > 3 { for(i=1; i<=NF; i++) printf("%d ", $i) } END { printf("\n") }
これを"step1.awk"と名づけて以下のコマンドを実行すると、step1の結果が出てくる。
awk -f step1.awk test.pnm > step1.txt
Step2
以下のスクリプトで、各行にM個のフィールドがあるよう整形します。
NR == 1 { row = $1 column = $2 } NR > 1 { for(i=1; i<=NF; i++) printf("%d%s", $i, i%column==0 ? "\n" : " ") }
これを"step2.awk"と名付け、以下のコマンドを実行します。
awk -f step2.awk step1.txt > test.mat
これで、PNM形式からNxM行列の形に整形できたので、octaveやらに読み込ませることができます。
mathematicaで数値計算結果の出力
最近mathematicaにハマっています。授業で引力を加味した天体の動き的なものを数値計算したのですが、単に数字を見てもどうなっているのかさっぱりわからないので、図にしたいと思って今回利用しました。
準備
環境
- MacOS X 10.9.5
- mathematica10
今回はmathematicaメインなので、数値計算結果は準備済みということで。入力データとして以下のようなものを準備します。
天体1のx座標 天体1のy座標 天体2のx座標 天体2のy座標 ...
mathematicaで散布図作成
まず、上記のような入力データの散布図をmathematicaで描くためのコードを書きます。以下のようなコードで動くと思います。
(* Define Size *) size = 0.3; circle := { Disk[{x,y},size] }; xylst = ReadList["Path-To-File", {Number, Number}]; objlst = {Thickness[0.005]}; Do[ x = xylst[[i,1]]; y = xylst[[i,2]]; AppendTo[objlst, circle], {i, 1, Length[xylst]} ]; Show[ Graphics[objlst], Axes->True, PlotRange->{{0,100}, {0,100}}, AspectRatio->1 ]
mathematicaでGIFアニメーション作成
自分の場合、計算回数Nステップ後の天体全体の様子を見るために、上記の散布図を利用しました。ここまでくると、時間経過で天体がどのように動くか気になりますね。ということで、時間経過で変化するようGIFアニメーションにします。
準備として、計算回数Nステップ後の出力データのファイル名を"tN.txt"とかにします。wolfram言語では数値変数Nに対して、『"t"<>ToString[N]<>".txt"』で文字列結合ができます。これで順次アクセスするファイルを変更します。
(* Define Size *) size = 0.3; circle := { Disk[{x,y},size] }; anime=Table[ filename = "t"<>ToString[k]<>".txt"; xylst = ReadList["Path-To-Directory-with-Files"<>filename, {Number, Number}]; objlst = {Thickness[0.005]}; Do[ x = xylst[[i,1]]; y = xylst[[i,2]]; AppendTo[objlst, circle], {i, 1, Length[xylst]} ]; Graphics[objlst, PlotRange->{{0,100},{0,100}},Axes->True,AspectRatio->1], {k,0,300,1} ] Export["Output-Filename",anime]; ListAnimate[anime]
終わり
mathematicaってすごく楽しいんですけど、エディタが使いづらい気がするんですよね。mathematica使うときって50行くらい一度に書くこともあるので、emacsとかで書きたいけどwolfram-modeとかなかったり、誰かが設定ファイル作ってくれてるんですけど合わなかったり。そんな感じでEmacsLispへの興味が湧き上がってきてます笑
下記のようなコードで下のGIFアニメができました。それでは、皆さんも楽しいmathematicaライフを!
CentOS6.7の環境構築メモ
VPSの環境構築のメモ。
各種必要なソフトのインストール
yum install openssl sqlite-devel zsh emacs useradd -m -g wheel [username] passwd [username]
セキュリティ的な対策
wheelグループに属するユーザがsudoできるように、
VISUAL=emacs visudo
以下の文のコメントアウトを外す。
%wheel ALL=(ALL) ALL
公開鍵認証を使う。
ローカルマシンで以下のコマンドを実行。
ssh-keygen -C "forCentOS"
これでできたid_rsa.pubをリモート側に送って、以下のコマンドを実行。
mkdir ~/.ssh cat id_rsa.pub >> authorized_keys
あとは/etc/ssh/sshd_configの以下の文のコメントアウトを外す。
PubkeyAuthentication yes
これで完了。
gccのインストール
これがないとpythonも入らない。gcc-5.2.0を入れる。
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.2.0/gcc-5.2.0.tar.gz tar zxvf gcc-5.2.0.tar.gz cd gcc-5.2.0 ./contrib/download_prerequisites ./configure --prefix=/usr/local/gcc-5.2.0 --enable-languages=c,c++ --disable-multilib export LD_LIBRARY_PATH=/usr/local/gcc-5.2.0/lib:$LD_LIBRARY_PATH export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu export CPLUS_INCLUDE_PATH=/usr/include/x86_64-linux-gnu make -j3 sudo make install mv /usr/bin/gcc /usr/bin/gcc-4.4.7 mv /usr/bin/g++ /usr/bin/g++-4.4.7 ln -s /usr/local/gcc-5.2.0/bin/gcc /usr/local/bin/gcc ln -s /usr/local/gcc-5.2.0/bin/g++ /usr/local/bin/g++
これで良い。
Pythonを入れる
Python3.5を落としてくる。あと前投稿で「これ入れればpipも一緒にインストールしてくれるよ。」って書いたけど、足りなかったっぽい。『参考サイト』。
./configure --enable-shared make -j3 sudo make install ln -s /usr/local/lib/libpython3.5m.so.1.0 /lib64/
あとsudo pip3できるように、
sudo VISUAL=emacs visudo
にて、以下のように書き加える。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
apacheのインストール
yum install httpd httpd-devel
mod_wsgiのインストール
前投稿と同じ。
Django1.8 + python3.5 + apache2.2 + mod_wsgi4.4.13 + CentOS6.7 で環境設定
Djangoを使ってwebサービスを作ったので、公開したいと思って環境構築を進めたが手間取ったのでメモ。気の向いたままに書いたので順番バラバラです。万が一参考にされる場合は最後まで見てからを推奨。
まずmod_wsgiはpythonのバージョンに依存するらしく
sudo yum install mod_wsgi
でインストールするとpython2系に依存するらしい。一方自分はpython3に依存してDjangoアプリとかDjangoの環境を構築したのでうまく動かないらしい。というわけで最新のソースコードをgithubからもってきて、
./configure --with-python=/usr/local/bin/python3.5 make -j3 sudo make install
って感じでコンパイルするとうまくいった。
pythonインストール時のpipインストール
最初、LinuxMint環境でpython3.5をmake installしたら、
Ignoring ensurepip failure: pip 7.1.2 requires LLS/TLS
と出た。ググったところ、『libssl-dev, openssl』の二つをインストールした状態で新規pythonをインストールすれば、一緒にpipもインストールされた。参考は以下のサイト『参考サイト』。
djangoのsqlite3
何も考えずにpython3.5を入れて、
python3.5 manage.py runserver
を実行すると
No module _sqlite3
というエラーが出る。これはpython3.5にsqlite3モジュールが含まれていないことが原因らしい。pythonをインストールする前に
sudo yum install sqlite-devel
を入れておくことで解決した。
wsgi.pyのPermission denied解決について
mod_wsgi.soをapacheに取り入れて、djangoのプロジェクトを『mysite』、アプリを『polls』として/var/www/cgi-bin/mysiteに配置した。 /etc/httpd/conf.d/python.confにて
LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias /test_django /var/www/cgi-bin/mysite/mysite/wsgi.py
また/var/www/cgi-bin/mysite/mysite/urls.pyにて
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r"^", include("polls.urls", namespace="polls")), ]
として、apacheを起動した。webブラウザにて、『http://127.0.0.1/test_django』にアクセスすると、pollsアプリのindex.htmlが表示されるはずだが、『Internal Server Error』とでてきた。apacheのエラーログを見ると、
(13)Permission denied: mod_wsgi (pid=2927, process='', application='localhost.localdomain| /test_django'): Call to fopen() failed for '/var/www/cgi-bin/mysite/mysite/wsgi.py'.
って出てきた。ファイルまでのパーミッションも確認したけど、どれも問題なく頭を抱えていたら、次のサイトが参考になった『Python3とDjango1.8の構築メモ 』。
SELINUXなるものがセキュリティにブロックしているとのこと。これに関しては初見なので後々調べておく必要があるが、ひとまず以下のコマンドでアクセスできるようになることが確認できた。
sudo setenforce 0
最近の進捗 LANの構成とかネットワーク系の勉強
パケットの気持ちになってみる
この本でパケットの気持ちを体感中『ルータ自作でわかるパケットの流れ』。結構いい。
2台目パソコンのセッティング
以前記事を書いた内容でarch linuxをインストール中。過程で起こった問題をメモ。
xorgでのキー入力
/etc/vconsole.confに
KEYMAP=jp106
って書くと日本語キーボードレイアウトになるってどこかに書いてあったと思ったんだが、英語レイアウトのままだった。archlinuxのxorgのページを参考に、キーボードレイアウトの設定をした。
/etc/X11/xorg.conf.d/00-keyboard.conf に
Section "InputClass" Identifier "system-keyboard" MatchIsKeyboard "on" Option "XkbLayout" "jp" Option "XkbModel" "thinkpad" EndSection
とすると、日本語レイアウトに変更された。
fcitxの自動起動
ibusは相性が悪く、前回苦戦したので、fcitxを利用している。自動起動(仮)の方法をメモしておく。ただ自分が使ってるqtileにはstartupの方法があるっぽいので後で調べる必要あり。
~/.xinitrのexec qtileの前に
export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx # export DefaultIMMODULE=fcitx <-なくてもよさそう export XMODIFIERS="@im=fcitx" fcitx
と記載する。
qtileでのバッテリーwidget
qtileにはバッテリー残量を表示するwidgetがある。
/usr/lib/python3.4/site-packagets/libqtile/widget/battery.pyにおいて、「BAT0」を「BAT1」に置換すれば正常に動作する。 またBAT1は/sys/class/power_suppy/ にて発見した。 参考URLは『参考1』と『参考2』である。
今日の進捗 gnuplotでgif出力できるようにする
gnuplotのインストール
最近アルゴリズムの性能比較とかが課題でよく出るので、グラフ出力でgnuplotが必要になる。gifで時間変化のグラフとか書いてもいいなと思い、その導入過程をメモ。
まずはgif用にライブラリが必要らしい。こちらを参考。『Terminal “png” missing when using Gnuplot』。ライブラリをインストールしたら後は
./configure --with-gd make sudo make install
でインストール完了。ちゃんとgif出力できるかは、gnuplotを立ち上げた後
> set terminal
で出力される一覧にgifが含まれているかでわかる。なお、configureで立てたフラグは、configureファイル適当に読んでとりあえず立ててみたらうまく行っただけなので、もしかしたら間違ってるかも…。