« DVD簡易分光器の色分解能を蛍光灯の輝線で実測してみた | トップページ | スペクトル画像の一次元化と再画像化の自動処理 »

2016年6月19日 (日)

スペクトルデータ再画像化 - awkでハマる

簡易分光器で撮影したスペクトル画像も見て楽しむだけなら画像のままでいいのですが、そこから何か情報を引き出そうとすると数値化が必須になります。この場合なんらかの加工・操作を行うことが多くそうなると再度画像化して見たくなったりします。

なおスペクトル画像の数値化(グラフ化)については

  スペクトル画像(分光写真)を数値化(グラフ化)する方法

が参考になると思います。また再画像化については

  「
スペクトルデータをExcelでSVG画像にしてみた

にある方法の方が(最初はたいへんですが)かなり細かいことができます。

現在のこうなっています。
Photo

左側のパスは最初やっていた完全手作業によるものでもう二度とやりたくない方法です。

中央のパスは最近やっているマカリ(国立天文台 - すばる画像解析ソフト -Makali`i-   配布サイト)を使用した方法です(スペクトル画像(分光写真)を数値化(グラフ化)する方法」)

数値化・一次元化(デジカメで写すのでスペクトル画像は二次元のRGB画像になりますが、スペクトルというのは本質的には1次元のグレースケール画像です)は合理化されましたが、マカリは使い勝手はいいもののウィンドーアプリケーションなのでそこが手間なのとその後の再画像化はあいかわらず手作業です。

ほよほよ さんが画像を数値化するためのjpg2csvと数値化されたスペクトルを画像化するためのcsv2bmpを作ってくれました。この二つはコンソールアプリケーションなので今後いろんな処理をバッチでいっきに処理することもできそうです。

あとはjpg2csvのデータを一次元化する機能とマカリの数値データをjpg2csv形式のファイルにする機能があればかなりフレキシブルなデータ操作が可能になります。

そこでマカリの数値データをjpg2csv形式にする部分を作ってみました。

----------

今回サンプルに使うのはこの画像です。
Imgp3535m45d01400480540

480nm~540nmの範囲のフラウンホーファー線でだいたいF線からE線のあたりです。

一次元データしか扱わないマカリと二次元データを扱うjpg2csvはかなりファイル形式が違います。

マカリのデータ形式
Photo_2

スペクトルしか扱わないので列方向RGB、行方向x座標というシンプルな構成です。

jpg2csvのデータ形式
Jpg2csv

スペクトルだけを対象にしているわけではないので列方向x座標、行方向がRGBとy座標の二重のループになっています。

--------------------

両方csvデータなんだからawk/gawkで簡単に処理できるだろうと思って始めたのですが、けっこう苦労しました。

できあがったawkスクリプト(下に書くように誤りを残してあります)

BEGIN {
	FS=","
	system("del Header.txt Red.txt Green.txt Blue.txt")
	getline
}
{
	if( NR > 2 ) {
		printf "," >> "Red.txt"
		printf "," >> "Green.txt"
		printf "," >> "Blue.txt"
	}
	printf "%5.1f",$4 >> "Red.txt"
	printf "%5.1f",$5 >> "Green.txt"
	printf "%5.1f",$6 >> "Blue.txt"

}
END {
	printf "\n" >> "Red.txt"
	printf "\n" >> "Green.txt"
	printf "\n" >> "Blue.txt"

	printf "xfrom = 0, yfrom=0, xto = %4d, 0\n",NR-2 >> "Header.txt"

	close("Header.txt")
	close("Red.txt")
	close("Green.txt")
	close("Blue.txt")

	system("del pass3_out.txt")
	system("copy Header.txt+Red.txt+Green.txt+Blue.txt pass3_out.txt")
	system("del Header.txt Red.txt Green.txt Blue.txt")

	system("del a.bmp")
	system("csv2bmp pass3_out.txt 400")
}

できあがって思うのはawkが最適な選択だったんだろうかということです (^^;;

--------

マカリのスペクトルデータをawkで処理してcsv2bmpの入力にするとこんな画像ができあがります。
Ou1


めでたし、めでたし、なのですが、上のawkスクリプトができあがるまでずいぶん時間がかかりました。

じつは上のスクリプトは間違っているとことがあってそのまま動かすとこういう画像に変換されます。
Out2

こうなる理由がどうしてもわかりませんでした。

原因はここにありました。

	printf "%5.1f",$4 >> "Red.txt"
	printf "%5.1f",$5 >> "Green.txt"
	printf "%5.1f",$6 >> "Blue.txt"

はは~ん、

	
	printf "%5.1f",$4 >> "Blue.txt"
	printf "%5.1f",$5 >> "Green.txt"
	printf "%5.1f",$6 >> "Red.txt"

とすべきところを並べる順番を間違っていたんだなと思われる方が多いと思います。
私もそう思っていろいろ試したり考えたりしのですが、そうではありませんでした。



前の記事 「DVD簡易分光器の色分解能を蛍光灯の輝線で実測してみた
次の記事 「スペクトル画像の一次元化と再画像化の自動処理

まとめ記事
  「
簡易分光器 - 作り方・使い方のまとめとリンク集
    簡易分光器とは?
    簡易分光器の実力
      太陽光(フラウンホーファー線)
      蛍光灯
    原理・設計
    製作・材料
      スリット

      回折格子
      構成/構造
    フラウンホーファー線の撮影法
    簡易分光器の性能評価
    トラブルが起きたときの対処法
    画像の数値化・グラフ化
    デジカメの分光感度特性
    スペクトルデータの再画像化

    分光器の応用
      光害カットフィルターの特性を調べる
      半導体レーザー出力光の波長の変化
      簡易分光器では手が出せないもの
    スペクトルに関する資料集
    スペクトル(画像)の実例

---------

  「
測定対象別記事一覧(測定、電子工作、天文計算)
  「
過去記事の一覧(測定、電子工作、天文計算)

« DVD簡易分光器の色分解能を蛍光灯の輝線で実測してみた | トップページ | スペクトル画像の一次元化と再画像化の自動処理 »

簡易分光器とスペクトル」カテゴリの記事

コメント

できあがりの画像はなかなかきれいですね^^。

そして、謎掛けで終わっているので、一生懸命awkソースを読みましたが、原因がよくわかりません^^;
引数の4、5、6番目を3つのファイルに振り分けて最後にマージしているので正しいように思いますけど。

ちなみに csv2bmp.exe の入力ファイルにタイトル行は不要です。
見てません、数値でないものから(今回の例でいうと xfrom= )始まる行をスキップしています。
jpg2csvが1行目にタイトル出力してしまったので仕方なくです^^;
こういう行が2行まで含まれていても正しく動きますが、3行以上入っていると誤動作します;;

ん? copy コマンドでマージ(3ファイル合体)がうまくいかないと赤だけの画像になりますね。
修飾子がたりないのでしょうか。

あんまり考えさせてしまうと申し訳ないので....

試しに
  printf "%5.1f",$4 >> "Red.txt"

  printf "%.1f",$4 >> "Red.txt"
のように三箇所修正したら意図したような画像が得られました。
それらしい画像が得られたというだけでBMPファイルの中身のチェックはまだやっていませんが。

答えを見てさらに考え込んでしまいました^^;
小数の出力幅指定を無くすだけで結果が変わるということは、csv2bmp の処理に問題があるということですよね。むむむ~。
pass3_out.txt の最初の20バイトでもよいので見てみたいです。

お手数おかけします。
csv2bmpの入力仕様がわからないのでどこをチェックすればいいのかよくわかりませんが、見る限りブランクの有無だけのように思います。

それから一次元化もawkで作ったので、画像からデータを抽出し一次元化して再度画像にするところまで一気にバッチで行えるようになりました。楽ちんです \(^o^)/
ありがとうございました m(._.)m

“%.1f”の方(それらしい画像が出力される方)
xfrom = 0, yfrom=0, xto = 999, 0
0.0,0.4,0.6,0.8,0.7,0.6,0.8,0.7,0.7,0.7,0.5,0.8,0.9,0.6,0.5,0.6,1.1,0.7,0.8,0.8,

“%5.1f”の方(画像が意図したようにならない方)
xfrom = 0, yfrom=0, xto = 999, 0
0.0, 0.4, 0.6, 0.8, 0.7, 0.6, 0.8, 0.7, 0.7, 0.7, 0.5, 0.8, 0.9,

マカリをインストールして上記awkを流して確認したところ原因がわかりました^^。
行先頭を isdigit() でチェックして数字以外のときスキップしているのですが、%5.1f だと数値が100を超えない限り先頭が空白文字になってしまいます。
タイトルをスキップする処理がアダとなりました^^;

jpg2csv がタイトルを出す部分を無くし、csv2bmp がタイトルをスキップする処理を無くそうと思います^^。

あれ、そういうことだったんですね。
道理で画像によってパターンが違うわけですか。
私の場合はちゃんと動作するようになったのでそのままでもいいのですが (^^;;

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: スペクトルデータ再画像化 - awkでハマる:

« DVD簡易分光器の色分解能を蛍光灯の輝線で実測してみた | トップページ | スペクトル画像の一次元化と再画像化の自動処理 »

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ