記事一覧 > この頁
撮影画像分析のための加工
天体写真で光学系の性能評価の一環として、以下のような星像のチャートを作成することがある。
簡単な図なのだが、これを一般的な画像処理ソフトで作成すると、わりあい面倒である。
観賞用の写真の画像処理とは違って、この手の作業は画面を見ながら対話的に行う必然性はないので、
コマンドラインツールで処理すれば楽である。
星像チャート(参考例)
【処理例】
▼星像チャート
ImageMagickにより処理する。
インストールするWindows Binaryのタイプは、とりあえず「…Q16-HDRI-x64-dll.exe」を選んでおけば無難。
付記も参照のこと。
その都度コマンドラインを手作業で作成するのは面倒なので、Excelで処理するようにしている。
- 黄色で塗り潰したE4〜E9のセルに必要事項を入力すると、コマンドラインが生成される。
- Ctrl+Shift+Cを押下すると
一連の処理が実行され、星像チャート(out19.pngとout1013.png)ができる。
- 準備作業としてマクロの下記の項目を、自己の環境に合わせて適宜修正すること。
「WorkDir」は画像が配置されている作業用フォルダー、「fileName」はバッチファイル名称であり、
画像と同じフォルダーに保存される。
- WorkDir = "D:\VAR\photographs\zW\zT\_work\"
- fileName = "star-chart.bat"
- 画像の向きに注意が必要。
ImageMagickはExifを参照しないので、縦構図で撮影した画像も横位置として処理される。
▼その他
1,撮影した画像N枚の中央部を一括してクロップする場合
- magick convert (-limit memory 2048MB) *.jpg -set filename:x "@%t" -crop WxH+X+Y "%[filename:x].jpg"
- -limit
HDRI版(6.x)はファイルを多量に処理するような場合、メモリーがあればあるだけ使い切るので、
処理中PCの操作に支障が生じてしまう。
そのためlimitオプションを指定して、制限をかけたほうが速くなる。
Q16-x64等であれば、上記の対策は(全タイプ試した訳ではないが)不要。
しかし処理量が多い場合は、これを指定したほうがよいかもしれない。
- memoryとareaは同値であれば、変換所要時間は殆ど変わらない。
areaを単位のみP(ピクセル)で指定すると、かえって遅くなってしまう。
- -limit disk 0 を指定しても、ディスクを使った処理でない場合は無意味。
- magick convert -list resource で現在の制限を一覧表示することができる。
- *.ext
処理するファイルの拡張子を指定。
- 複数指定しても可。ただしその分処理時間とメモリーを消費することになる。
- -set filename:x "@%t" … "%[filename:x].ext"
入力ファイル名を取り込み、出力ファイルの先頭に@を付加する。
- -crop "WxH+X+Y"
所定の数値を記入する。
- WxHはクロップの大きさ、X+Yはクロップする座標位置。
上記のExcel File の5番目の値を記入すればよい。
- その他
magick convert -monitor 〜 とすると、進捗状況をモニターすることができるが遅くなる。
HDDへのアクセスが始まると、処理速度が低下していることを確認できる。
- 同種のオプションとして -verbose -debug -warnings 等がある。
2,撮影した画像N枚の中央部を一括してクロップして、ファイル名に連番を付加する場合
- magick convert *.jpg -set filename:x "%t" -crop WxH+X+Y -scene 1 "%02d-%[filename:x].jpg"
- -scene
連番の開始番号を指定。
- %02d
連番の桁数を指定。この場合は二桁。
- 撮影途中でファイル数がカメラの設定の上限に達してリセットされている場合は、
ファイル名に付加した連番と撮影順番がズレてくるので注意が必要。
3,更に画像にファイル名を書き込む場合
以下のバッチファイルのサンプルを、例えばwt2i.batとして保存し「wt2i input output(ext)」という構文で実行する。
ファイルに上記2のような連番を付加しているなら「wt2i ???d*.jpg jpg」とする。
@echo off
if "%~1" == "" (
goto error
) else if "%~2" == "" (
goto error
)
if "%~x1" == ".png" (
goto pre
)else if "%~1" neq "*.png" (
goto main
)
:pre
magick mogrify -strip %1
:main
for %%A in ( %1 ) do (
magick convert %%A -set filename:x "%%t" -font c:\windows\fonts\msgothic.ttc -pointsize 24
-fill black -gravity northwest -annotate 0 "%%[filename:x]" "%%[filename:x].%2"
)
goto end
:error
cls
color e0
echo 「入力ファイル」及び「出力ファイル種別(拡張子)」の指定要!
echo\
pause
color
cls
:end
- windowsではフォントのpathを指定しなければならない。
また日本語を扱うには日本語フォントの指定が必要。
magick convert -list fontで使用可能なフォントを出力できる。
- 入力ファイルがpngの場合は、元ファイルのサイズ情報が残っているため、そのままではうまく処理できない。
northwestと指定すると、元ファイルの左上に文字入れをしようとする。
そのため-stripでファイルに埋め込まれた画像情報を消去するようにしている。
jpeg,bmp,fitsでは問題無い。
4,クロップした画像を縦一列に繋ぎ合わせる場合
- magick montage ???d*.jpg -tile 1x0 -resize 100% -geometry +1+1 out.jpg
(ファイル名が連番の場合)
- -tile
列数と行数を指定。行数を0にすると必要に応じて処理されるもよう。
- -resize
100%に指定しないと縮小される。
- -geometry
枠線を指定する。この場合は行列1pxで指定。
5,クロップした画像からアニメーションGIFを作成する場合
- magick convert -delay 10 -loop 0 ???d*.jpg movie.gif
(ファイル名は上記と同じ条件)
- -delay
画像の切り替わる時間(単位は1/100秒)を指定する。
- -loop
ループする回数を指定する。0なら無限回となる。
【付記】
- gifについては上記の1または2の構文で処理すると、単一ファイル(アニメーションgif)が生成されてしまう。
そのうえスクリーンサイズ(補足参照)が元ファイル(クロップ前)のものであるため不都合が生じる。
今回のケースでは等倍再生されないので、いちいちサイズ調整しなければならなくなる。
次のコマンドで処理することにより、一枚ずつの画像に分割することができるが、再処理することで
問題が解消されるわけではない。
- magick convert [input] +adjoin [output]
- 出力ファイル名の後に「-number」が自動的にふられる。
開始番号はゼロからになり、桁数の指定はできない。
この状態では再合成する際に、撮影順番とファイル順番がズレてしまう。
- ヘッダの画像サイズは分割前と同じで、元ファイルのものが書き込まれているため、
画像に文字を書き込む際に不具合が生じる。
とりあえずオフセット(-annotate +x+y)を指定することで、この点に関しては回避可能であるが……
- なおgifのヘッダは-stripで処理できない。
- その他のファイル形式でもザックリと確認してみたが、gifを含めてマルチページ対応フォーマットの場合、
上記の1または2の処理をかけると、単一ファイル(マルチページ)が生成されてしまう。
例えば「magick convert *.jpg -crop WxH+X+Y -scene 1 %02d.gif」すればよいのだが、これでは
元ファイル名を画像に書き入れるという目的が達成できない。
従ってここではマルチページ非対応なファイル形式で処理する必要がある。
- アニメーションGIFは
GIF Viewer
等で閲覧した方が便利かもしれない。
- ImageMagickのバーションは7.xを使用している。
7.xではconvert.exe等の一部コマンドが変更されている。
概要はコマンドラインで画像処理が行える便利ツール「ImageMagick」 (1/2)を参照。
上述のコマンドラインは6.xのときに作成したが、バージョンを上げたので先頭にmagickを追加した。
- インストール時のオプションで「legacy utilities」をチェックすれば、convert.exe等がインストールされるようである。
ただしファイルがWindowsのものとバッティングするので注意が必要。
プログラムのPATHはインストーラーにより付加されるが、念のためきちんと設定されているか確認をすること。
これについてはImageMagick - TeX Wikiを参照のこと。
- [補足]^
- gifはスクリーンサイズ(描画領域)とオフセット値(実際に描画する画像位置)を持っている。
内容は「magick identify input.gif」とすることで確認できる。
- 出力例
input.gif GIF 300x300 4928x3264+2314+1482 8-bit sRGB 256c 69083B 0.000u 0:00.000
- この場合は元画像を300*300にクロップしてgifに変換している。
4928x3264がスクリーンサイズで、+2314+1482がオフセット値になる。
スクリーン左上からオフセット分中央に寄った位置に、描画する画像(300x300)の左上がくることになる。
- ブラウザ等で表示する場合はウインドウサイズに合わせて、スクリーンがフィットされるので
画像が小さく表示されてしまう。
また文字入れをする場合、単純にnorthwestと指定してもコマンド実行時にスクリーンサイズを参照するので、
画像には書き込まれていない状態になってしまう。
- 従ってこのページのように元画像をクロップして、それを元にアニメーションgifを作る際は、
事前にjpeg等のフォーマットで処理してから行う必要がある。
初出:2019-04-14 改訂:2022-03-22
(C) YamD