★台風の接近に伴い
台風16号が日本列島に接近中です。皆様、お気をつけください。
さて、というわけで、せっかくの休日ですが
○天体写真撮影・・・無理
○風景写真撮影・・・無理
○バードウォッチング・・・無理
○部活の生徒指導・・・お休み(※注:私、学校の教師ではありません)
うーん
こ、これは
まさに
「Delphi日和」っ!
すみません。負け惜しみです。
★先日封印を解いたDelphi7で

先日実家の物置にある「封印箱」から急遽召還したDelphi7Proですが、ゴソゴソと作業を始めました。
とはいえ、プログラミングのブランクが10年以上あるので、まだヨチヨチ歩きのヒヨコ状態。
★今週の目標は
欲張ると失敗するので、こんなもんですかねぇ。
①ASI1600MC-CoolのRAWデータをきちんと読む
(どこまでがヘッダで、どういう風に画素データが格納されているのか)
②とりあえず、4画素、たった4画素分で良いのでRAW現像したい。
★少し慣れてきました
累計で6時間ほどDelphiに触ったでしょうか。
徐々に、色々思い出してきました。
まずは、Delphiの統合開発環境下のエディタオプションを「かつての」お気に入り設定に復旧です♪
予約語とユーザ変数が同じ色だったり
生きた行とコメント行が同じ色だったり
数字の1と大文字のIと小文字のlが同じ形だったり
などすると、(乱視と近視と老眼の三重苦が始まった)あぷらなーとがコーディングすると、ミススペルしまくりますので、ゴソゴソと設定を変えます。
ちなみに背景は絶対に『黒』派です。(ソラリス使っていた若い頃は白背景派だったんですがね)
そうそう、フォントも大きめで(笑)。

うん。こんな感じかなぁ?だいぶ見やすくなりました。
★データを少しづつ読み込んで調査した結果
慎重にASI1600MC-COOLのRAWデータを読み込んでみた結果、次のことが分かりました。
○判明した事・その①
ASI1600MC-COOLのRAWファイル(FITS)は、どうやら
大きく分けて3つのブロックに分かれているみたいです。
Aブロック:撮影データなどのヘッダ
Bブロック:ブランク領域
Cブロック:撮像データ(各画素の輝度データ)
○判明した事・その②
Aブロックについて
撮影データのヘッダは、ASCIIコードによる1バイト×80=80バイトで1項目を表しているみたい。

基本的なレコード構造
【パラメータ名】 【=】 【値】 【/】 【コメント】
第1パラメータ:SIMPLE
ASI1600MC-Coolで撮影した物は全て値として「T」が格納されていました。調べてみると、SIMPLE変数は、標準FITSかどうかを表すものみたいです。ああ、なるほど「True」だという訳ですか♪
ちなみにコメント欄には撮影時刻が秒まで記録されています。
第2パラメータ:BITPIX
画像が何ビットで記録されているかを表すパラメータのようですね。上記の例なら「16bit記録」を表しています。
第3パラメータ:NAXIS
コメントにDimensionalityと書かれているので、明らかに何次元データかを表していますね。上記の例なら2次元データというわけです。というかデジカメなんだから2次元に決まってます。
第4パラメータ:NAXIS1
第1軸の変域(ASI1600MC-COOLなら長辺のピクセル数)を表します。4656ピクセルですね♪
第5パラメータ:NAXIS2
第2軸の変域(ASI1600MC-COOLなら短辺のピクセル数)を表します。3520ピクセルですね♪
第6レコード:COLORTYP:
カラータイプの略でしょうか?ベイヤー配列の型が格納されています。はい、確かに「GRBG」型だと記録されていますね。(もう、ステライメージさん、ここ読んでくれたら自動でデモザイクできるのに~!)
第7パラメータ:CCD-TEMP:
本来はCCD用のフォーマットなんでしょうが、CMOSセンサーの冷却温度が記録されています。「-10℃」という訳ですね。
第8パラメータ:YBININNG:
Y軸方向のビニング数なんでしょうね。ちと自信がありません。
第9パラメータ:INSTRUME
インスツルメントの略でしょうね。撮影機材名というわけですね。「ASI1600MC-COOL」と記録されています。
第10パラメータ:DATE-OBS
撮影日時だと思うんですが、ちと妙ですね。第1レコードの時刻と9時間ズレています・・・・ああ!時差ですね。というわけで、こちらの時刻は世界標準時のようです。
第11パラメータ:SWCREATE
ソフトウェア・クリエイトでしょうか?撮像ソフト名ですね。「SharpCap」と記録されています。
第12パラメータ:EXPTIME
露光時間ですね。秒単位で記録されているようです。
第13パラメータ:BZERO
これ、謎のデータです。今のところ、これが「ゼロ点補正」(オフセット値)ではないかと睨んでいます。「32768」ねえ・・・・・。一見変な数値に見えて、これ、16進の2バイト表記なら「80」・「00」となり、とてもキリの良い数値ですからあり得そうです。そのうち真面目に検証してみましょう。
第14パラメータ:EXTEND
拡張フラグ??・・・一応True値が書き込まれており、コメントにも「Extensions are permitted」(拡張機能が許可されている)と記録されていますが、意味不明です。
第15パラメータ:XBINNING
X軸方向のビニング数なんでしょうが、やはり自信がありません。
第16パラメータ:YPIXSZ
撮像素子のY方向のピクセルサイズのことでしょうね。「3.8」とありますので単位はマイクロメートルのようです。
第17パラメータ:XPIXSZ
撮像素子のX方向のピクセルサイズでしょう。「3.8」ですね。
第18パラメータ:END
ここでヘッダ要素が終了することを表すようです。
これ、FITSの仕様なのか、カメラ側の仕様なのか分かりませんが、ちょうどAブロックと同じ広さの領域が「スペース」(ASCIIコードの0x20)で埋め尽くされています。そもそも80バイトのパラメータ×36で1レコードという規格なのかもしれませんね。
いよいよここからが、『本丸』(撮像データが記録されているエリア)のようですねぇ。
さて、ボチボチ読んでみましょうか・・・。
ASI1600MC-COOLは、AD変換した段階で12bitデータになり、それを16bitデータとして書き出していると広告に書かれているので、2バイトで1ピクセルの輝度を表しているのだろうと勝手に予測。
2バイト分を呼び出して、最初の1バイト分を上位バイト、その次の1バイト分を下位バイトと見なして10進整数値に変換を試みます。
ゴリゴリとコードを書いて
・・・・えいっ!っと。
第1ピクセルの輝度データは、16進で「A632」。10進に直して「42546」と呼び出せました。
もしも16ビットをフルに埋めると、輝度データの上限は16進で「FFFF」で10進なら「65535
」。一応その中には収まっているので、あり得ない値ではないし、まあ良しとします。(ホントか?)
★さて・・・・と
「敵」の正体は、ほぼ掴めてきました・・・が。これ、客観的に言って、「1600万人の敵兵のうち、1人だけ捉えた」って状態ですよねぇ。
むむむむむ。ここから、一体どう「攻め」ようか・・・・・?????最大の障壁は、昔と違って、・・・ろ、ロジックが沸いてこないっ!
うぇーん(涙)。
よし、今日のところは・・・・寝ます。