あぷらなーと


あぷらなーとの写真ブログ
by あぷらなーと
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
あぷらなーと
「自然写真大好き」
HNあぷらなーと が

いろんな写真ネタを
のんびり語ります。

気合い入れすぎると
続かないので、
「ぼちぼち」いきます。

生息地:香川・徳島
カテゴリ
最新のコメント
> オヤジさん 生画像..
by supernova1987a at 13:23
> にゃあさん 仕..
by supernova1987a at 13:18
> kem2017さん ..
by supernova1987a at 13:16
こんにちは! ニワトリ..
by KEN at 11:56
やっぱり、これ手品ですよ..
by オヤジ at 06:26
でましたね、ビームスプリ..
by にゃあ at 19:19
素晴らしいM33! 実..
by kem2017 at 18:05
> 天文リフレクションズ..
by supernova1987a at 14:26
> にゃあさん 秤..
by supernova1987a at 14:14
いいがかりをつけてしまっ..
by 天文リフレクションズ編集部 at 18:57
以前の記事
お気に入りブログ

<   2016年 09月 ( 12 )   > この月の画像一覧

ASI1600MC-COOLの謎②

前回の続きです

★ASI1600MC-COOLの『謎』とは

謎①:ASI1600MC-COOLはどのようにデータを書き込んでいるのか? → ほぼ解決♪
謎②:撮影時のパラメータ「HighSpeedMode」の正体は?
謎③:ハードウエアビニングできるのは本当か?
謎④:MMだけではなくMCも赤外線を透過している疑惑

<お約束>
以下の考察は、あぷらなーとの独断によるものです。あんまり参考にしちゃダメです。

★謎②:HighSpeedModeの正体
SharpCapでASI1600MC-COOLを駆動しているとき、意味深な「HighSpeedMode]というフラグがあって、デフォルトではONになってはいるものの「気色悪」かったのですが、どうやら、この設定の「意図」が見えてきました。


販売店からも長らくリンクが張られてないので、つい最近まで知らなかったのですが、ASI1600MC-COOLのマニュアルがZWO本家にアップされていました。(にゃあさん に 先越されちゃいましたが)念のため、こちらです↓


結論として

HighSpeedModeは、転送速度をアップさせるために通常12bit変換するADCを10bitで作動させるモード

なのだそうで、

「画質は落ちるがコマ数が稼げる」

とのこと。完全に月惑星の撮影用ですね。マニュアルにも

「星雲星団の撮影に用いないでね。」(意訳)

と明記されていました。もう!それならデフォルトをOFFにしておいてよ!!
・・・という訳で、お悩みの皆さん、ご納得いただけたでしょうか?

とは言うものの、ちと釈然としないことがあって、さらに色々調べてます。(素のデータを叩いていると、なんか色々と不気味なものが見えてきちゃって色々と考えてしまいます・・・。ガンマ値を1にして撮像すれば、リードノイズとシグナルを弁別できそうな気がする・・・とかの『怪しげ』な妄想。)

※10/7追記※
詳しく検証した結果、Highspeedmode:Onでも12bit駆動していることが分かりました


★謎③:ハードビニングの正体

先日来、冷却CCDと異なり冷却CMOSカメラでは原理的にハードウェアビニングは出来ないのではないかと勘ぐっていたのですが、実際には撮像時にビニング設定があって、謎でした。しかも、通常カラーカメラで2×2ビニングをすれば画素混合されることになり、完全なモノクロ画像になるはずが、なぜかカラーで出力されるという摩訶不思議な現象・・・・。

けむけむさんの検証実験でも、「後からソフトウェアビニングしたのと変わらない気がする」との結果が得られていて、もやもやしていたのですが、本家サイトで有益そうな情報が拾えました。「中の人」らしき人物の発言によれば、

「ハードウェアビニングと呼んでいるけど、実はカメラの中でソフトウェアビニングしてるだけだよ。ちなみに、ビニングを実行するときは、速度を上げるためにADCを12bitから10bitに強制切り替えしてるので、月や惑星専用に使い、星雲星団撮影には使わないでね。」(意訳)

とのこと。ああ、だから2×2ビニングしても画素混合されずにカラーのまま出力されていたのかぁ。『本物の』ビニングができるCCDと異なり、どうもSN比が上がらないような気がしたのも、AD変換時に階調が1/4に減ってるからですね。ビニングして4画素加算でレンジを4倍に増やしても大元が1/4なので相殺・・・・と。
・・・だったら最初から「ハードビニング風機能」とか言って欲しかった・・・・。

★謎④:「MCだって赤外線を透過してるんじゃ?」疑惑
最近色々情報交換させてもらっているASI1600ユーザーの皆さんから、「不思議なコメント」をいただき首を傾げていたことがあります。
それは、ズバリ

「ASI1600MC-COOLは赤外線を透過しているのではないか?」という疑惑です。

皆さん、ごめんなさい。つい先日まで、あぷらなーとは全否定してました。
・・・・だって・・・販売店のサイトとかカタログとかには、こんなこと↓書いてたんですよぉ。

ASI1600MMはモノクロでARフィルタ装備。よって赤外線透しちゃいますので適宜赤外カットフィルタを入れてね。」(意訳)

ASI1600MCの方は、カラーで『IR』フィルタを装備してるので、赤外線は透しません。分光特性グラフの長波長側のデータは無視してね。」(意訳)


ところが、

本家のサイトのQ&Aに「中の人」らしき人物がこんな事を暴露してた。
(ひょっとして販売店さんも知らない情報??)

「えーと・・・当初、MCの方はIRフィルタ付けて売るつもりだったんだけど、発売の最終段階でARフィルタに変えちゃった。なので、実際は赤外線を透しちゃうから赤外カットフィルタを追加しないと普通の写真は撮れないよ~。」(超意訳)

げげっ!!
そ、それ、ほんまですか?!

ていうか、「最終段階」っていつのことなの?
Rev2のこと?それともRev1を量産した段階ですでに??

LPS-P2とかの光害カットフィルタは赤外カット特性を持ってるので、天体写真を撮る段には実害はないけど、そ、それ早く言ってよね~。
暗い所だと普通に写るのにピーカンの昼風景がハチャメチャな写りだったので(ちょっぴり)怪しいとは思ってたけど、まさかカタログスペック自体が嘘だったとは・・・。・・・・・悪夢だ。

しかしよく考えると
これ、無改造で『冷却赤外カラーカメラ』になるってことですよね?
あぷらなーと個人にとっては無茶苦茶魅力的です。早速、やりたいこと(満月時の流星撮影とか・赤外カラーの風景写真とか)が増えました。夢がふくらみますねぇ。(例のコメントが事実だったとすれば・・・ですが。)

※10/10追記 確かに赤外線に感光する事を確かめました




★「開発ごっこ」の方は・・・
ついに素のRAWデータを上手く読めたと思ったら、RGB各8bitに圧縮しようとしたら表示が変になっちゃった。
という訳で、徐々に色んなものをテスト実装しつつ、迷走してます♪
ま、こんなのがパズル解いてるみたいで楽しいのですが・・・・。

f0346040_00170483.jpg
★★★以下、「進展」したら更新予定♪★★★



by supernova1987a | 2016-09-27 07:31 | 機材 | Comments(10)

ASI1600MC-COOLの謎①

★ASI1600MC-COOLの『謎』

ZWO社の冷却CMOSカメラASI1600MC-COOLは、とにかく『謎』が多いですねぇ。同じカメラを使っているユーザーさんと色々情報交換させていただいているのですが、皆さんお悩みのようで♪

最近無謀にも始めたDelphiでの『開発ごっこ』のおかげで、下記の『謎』が判明しそうです。

謎①:ASI1600MC-COOLはどのようにデータを書き込んでいるのか?

謎②:撮影時のパラメータ「HighSpeedMode」の正体は?

謎③:ハードウエアビニングできるのは本当か?

謎④:MMだけではなくMCも赤外線を透過している疑惑

<お約束>
以下の考察は、あぷらなーとの独断によるものですので、信憑性があるとは限りません。
誤りが散見するかもしれませんので、あんまり参考にしないでください。

★謎①の解明『ごっこ』

Delphiでゴソゴソとプログラミングしながら、色々調べたりデータ解析してみた結果、およそ次のことが分かりました。


★ASI本体からFITSファイルへの記録方式
そもそもFITSって天体研究者用の汎用フォーマットだったのですね。全然知りませんでした(汗)

○記録された画像データの型は16bit整数(符号付)です
数値は16桁の2進数で記録されていますが、注意すべき点は16桁全てが数値を表しているのではなく、最上位のビットは「符号」を示しているということです。この値が1ならばマイナス、0ならばプラスを示します。そして残りの15ビットで絶対値を表します。
f0346040_20473337.jpg
したがって、位(桁)をiとし、値(0か1)をNiとすると、絶対値はΣ2^(i-1)*Niで示されます。
これに最上位ビットの値N16を合わせると、符号付きの数値は
(-1)^N16*Σ2^(i-1):*Niとなります。
この場合、格納できる数値は【-32768~+32767】の65535通りとなりますね。

***************************************
※10/3追記
これ、ウソです。確かに上記のような記録法もありますが、FITSはこれとは異なる「補数表現」を使用していることが判明しました。
詳細は、10/3のブログ↓を参照してください
***************************************

★ここで問題発生!!
FITSの形式では、正の数値は16bit分ではなく(符号で1bit取られるので)15bit分しか格納できません。
そもそも天体写真では明るさが『マイナス』にはなり得ないので、半分が無駄ですね。
そこで何らかの「トリック」が必要となります。
f0346040_21053700.jpg
「トリック」とは、
f0346040_21382675.jpg
このように、左にシフトして書き込んでしまうと言う仕掛けです。(よくこんなこと思いつくなあ)
したがって、本来【0~65535】のデータがFITSの中では【-32768~32767】として格納されているわけですね。

★ヘッダにあるBzeroの正体
このような仕掛けがなされているため、FITSファイルから画像データを読み出すときには、素の値に32768を加算してやる必要があります。
というわけで、先日「謎のパラメータ」だと言っていたFITSのヘッダにある第13番目のパラメータ:「BZERO=32768」の正体は、このシフト量と判明しました。(ああ、たぶんFITSを扱っている人には常識なんでしょうけどねぇ・・・・。)

★CPUのメーカー依存性
Delphiと格闘しつつも、どうもデータがおかしい状態が続いて頭を抱えていたとき、ふと、大昔(20年以上前)に大学の研究室で「観測データを解析する時に悩まされた」ことを、思い出しました。
当時、宇宙線の観測データを解析する際にハチャメチャな数値ばかりが出てきて半泣きになっていた時に、観測データを記録する際に用いたPC-9801VM(CPU:80186)とデータ解析に用いたスパークステーション10(CPU:SuperSPARC)とでデータの記録方式が異なることを知りました。いわゆるSPARC系のCPUは普通に上の桁から(左から順に)書き込みますが、インテル系のCPUは不思議なことに2バイト(16bit)のデータを書き込む際に、上位バイト(左の1バイト8bit分)と下位バイト(右の1バイト8bit分)を「逆転」させて記録する仕様だったのです。したがって、インテル系のCPUで記録したデータをSPARC系のCPUで読むときにはデータを2バイトずつに区切って、上下(左右)を入れ替えないと正しく読めないよ、というお話しです。

★リトルエンディアンとビッグエンディアン
普通通り上位(左)から順に記録する方式を「BigEndian」方式といいます。どう考えても普通ですよね。
f0346040_21502406.jpg
それに対してデータの上位バイトと下位バイトを逆転して記録する方式を「LittleEndian」方式と言います。
現在主流のインテルやAMDのCPUは全てLittleEndian方式で記録するタイプです。
f0346040_21515655.jpg
したがって、インテル系のCPUで記録したデータをSPARAC系のCPUで読むときにはデータを2バイトずつに区切って、上下(左右)を入れ替えないと正しく読めないよ、というお話しです。
(例)真の値:41867(16進数で表すと A3 8B )のとき、インテル系CPUでは「 8B A3 」と記録される。
したがって、本当は41867という数値なのに実際には35747という値で記録されていることになりますね。

ちなみにWindowsはLittleEndian方式で動作しています。・・・では、インテルやAMDのCPUを介してデータを記録したFITSファイルは、なにも問題なく画像を読み取ることができるのでしょうか?・・・いやいや、さらに厄介なことがありまして・・・。

★ところが、そもそもFITSは・・・
FITSファイルはプロの研究者も使う万国共通の測定データフォーマットですので、解析に用いる計算機はパソコンではなく、ワークステーションやメインフレームである可能性も高いと推察されます。そこでFITSの規定を調べてみると、「必ずBigEndian方式で記録すること」と定められていました。
ASI1600MCを制御したのはAMDのCPUを搭載したPCで、しかもOSはWindowsなので、普通は上下反転させたLittleEndian形式で数値が記録されているはずです。検索エンジンでヒットした某フォーラム中でのコメントでも、たしかに「LittleEndianだ」とのコメントを見つけることができます。しかし、そもそもBigEndianでの記録を定めているFITSにLittleEndianで記録するだろうか?これだとプロが困るんじゃ・・・というのが疑問で、なかなか結論が出ません

問題を整理しておきます。

 ①インテル系・AMD系CPUでは数値をLittleEndian形式で記録する仕様

  ・・・ふむふむ。つまり数値の上位バイトと下位バイトは反転している訳だな。

 ②WindowsもLittleEndian形式に準拠している

  ・・・ほうほう。じゃあ、やはりFITSファイルの中身は数値の上位バイトと下位バイトが反転しているということだな。

 ③しかし、そもそもFITS自体がBigEndian形式で記録するよう定めている

  ・・・えっ?!

うえーん。
ややこしいなあ、まったくもう!一体どっちが正しいの??
今回あぷらなーとがデータの読み込みに四苦八苦した理由がここにあります。

★・・・仕方が無いので
らちがあかないので、力技で1バイトずつデータを細切れに読み出して色々と分析した結果

・・・・・・・・・BigEndian形式(らしい)と判明しました。

ああ、なんということ!。
せっかく1ワード単位(2バイト丸ごと)読み込んで直接「ShortInt型」の変数にぶち込めば符号も含めて一発解決だと踏んでいたのに、いざやってみると「むちゃくちゃ」な数値ばかりが出ていた理由が、これでした。

・・・やれやれ。

★結局、考案した読み出し方法は・・・

①画像データを1バイト分読み込み、バッファーに格納する
②次のデータを1バイト分を読み込んだら、先ほどとは異なるバッファーに格納する
③上位バイトのデータの最上位bitを読んで符号を決める(0なら正、1なら負)
④符号を決めたら、上位バイトの最上位bitを消す。(理論的には128を引けばいいはず)
⑤上位バイトと下位バイトの両方に共通の符号を与える
⑥上位バイトの値に256を掛けて、下位バイトと加算する
⑦最後にBZero値(32768)を加算して補正する

・・・ロジックはできたので、早速Delphiでプロシージャ(サブルーチン)を書きます。
f0346040_22120885.jpg
・・・・ん。完成♪
******************************
10/3追記
ごめんなさい。このロジックも間違ってます。
詳細は上にリンクしている10/3の記事をご覧ください
******************************



★そして、これが本邦初公開(?)の
DelphiでFITSファイルから読み込んで解析した
ASI1600MC-COOLののRAWデータの「正真正銘無加工の」トーンカーブだあっ!!

f0346040_22301035.jpg
どうですか?
美しいでしょう?

え?「なんで山が3つもあるの?」ですって??

そりゃもう、実際に「R」と「G」と「B」の3種類のセンサーが混在してますからねぇ。
そもそも、カラーカメラなのにベイヤーデータのトーンカーブが1本につながってちゃおかしいんです。
ステライメージとかで見慣れたベイヤーデータのトーンカーブは、おそらく自動的にゴニョゴニョされちゃった後だと思います。

******************************
10/3追記
ごめんなさい。この分析結果も間違ってます。
詳細は10/3の記事をご覧ください
******************************

※「あれ?これ先週までのDelphi7のコーディング画面となんか違う!?」
と思われた方は、もう「Delphiの呪縛」にかかってます。
ええと、その・・・RAD-Studio-10.1『Berlin』に乗り換えました(最新版のDelphiですね)。

あの・・・今なら「スターター」が、・・・ま、まさかの「無料」ですよぉ・・・・・・。
64bitネイティブコンパイラは止められていますが、ほとんどの機能は使えそうですね♪
無料バラマキ作戦って何年ぶり??ひょっとして、またDeilhiの時代が来る・・・のか?

★★★その他の『謎』は、後日続けます★★★


by supernova1987a | 2016-09-26 22:42 | 機材 | Comments(6)

晴れない夜は基本の復習⑧

★「Delphi日和」の顛末

悪天候のため、まったく写真が撮れないのを逆手にとって「Delphi日和」と位置づけた休日ですが、結局丸一日Delphiと格闘するハメになりました。はい。例のASI1600MC-COOL様の画像処理ソフト『開発ごっこ』です。RAWファイルのヘッダを読み込み、撮像データを引っ張り出すところまでは良かったのですが・・・・・・・。


★感覚が鈍ってるのにも程がある

しかし、苦戦しました。なにがって・・・それはもう、酷い有様。
とにかく自分が『完璧な』素人に戻っているのを感じて、自己嫌悪。

<トラブル①>
EAccessViolationで落ちまくる!
昔は良く目にしていたんですがねぇ。思い出せませんでした。今回のケースは確保した配列の要素数を超えるデータをロードしようとしたのが原因。

<トラブル②>
stack overflowで落ちまくる
これは、一般のアプリでも見かけますよね。要するにメモリが不足してるんですが、今回の場合はDelphiの配列に割り当てられるメモリの上限を変える方法を思い出せずに悪戦苦闘していたという顛末。なにしろ、4656×3520の巨大データですものねえ。

<トラブル③>
いくら頑張ってもRAW画像が変!

こればっかりは教則本がありませんので自力で考えるしか無かったのですが、思いついたロジックがことごとく玉砕。

ちなみに「初歩的」なところでは、

 ☆2バイトのバイナリデータを整数値に変換する方法が思い出せない
 ☆データストリームから各個データを読み込むためのバッファーをバイト型で宣言してたのに、その上限を超えるようコーディングしていた
 ☆計算上の要素数と実際の画素数のズレを見逃していた

という燦々たる有様でしたが、とにかく強敵だったのが、「ところどころ階調が反転して見える」という怪現象でして・・・。結局、犯人は(うすうす感じてはいましたが)ヘッダに記録されている「BZERO=32768」なるパラメータの意味するところ。要するにASI1600MC-COOLは12ビットで記録したデータを16ビットで記録しているので、残りの4ビット分の『空白』がどうなっているのかという問題です。結論として、1画素につき2バイトで記録されている各画像データの上位バイトに80が加算されているのが犯人でした。16進で8000=32768ですものねぇ。

★苦節15時間の結果・・・
f0346040_00000847.jpg



・・・ついにっ
f0346040_23491586.jpg
ASI1600MC-COOLのRAWデータから、
ベイヤー画像を取り出すことに成功っ!!

うひゃー。疲れた

これで、『敵の城門』を突破したことになるので、
あとは、いかようにも料理できますね。

なんか、ちょっとやる気が出てきた♪

あ、M42の画像が鏡像になっているのは、ご愛敬。
・・・もう、ディスプレイのY座標は上から下に計るっていう「基礎中の基礎」すら頭から消えてたという(笑)。ま、後からどうにでもなります。

by supernova1987a | 2016-09-19 23:53 | 天体写真 | Comments(9)

晴れない夜は基本の復習⑦

★台風の接近に伴い

台風16号が日本列島に接近中です。皆様、お気をつけください。
さて、というわけで、せっかくの休日ですが

 ○天体写真撮影・・・無理
 ○風景写真撮影・・・無理
 ○バードウォッチング・・・無理
 ○部活の生徒指導・・・お休み(※注:私、学校の教師ではありません)

うーん

こ、これは

まさに

「Delphi日和」っ!

すみません。負け惜しみです。

★先日封印を解いたDelphi7で
f0346040_20040886.jpg
先日実家の物置にある「封印箱」から急遽召還したDelphi7Proですが、ゴソゴソと作業を始めました。
とはいえ、プログラミングのブランクが10年以上あるので、まだヨチヨチ歩きのヒヨコ状態。

★今週の目標は

欲張ると失敗するので、こんなもんですかねぇ。
①ASI1600MC-CoolのRAWデータをきちんと読む
 (どこまでがヘッダで、どういう風に画素データが格納されているのか)
②とりあえず、4画素、たった4画素分で良いのでRAW現像したい。

★少し慣れてきました

累計で6時間ほどDelphiに触ったでしょうか。
徐々に、色々思い出してきました。

まずは、Delphiの統合開発環境下のエディタオプションを「かつての」お気に入り設定に復旧です♪

 予約語とユーザ変数が同じ色だったり
 生きた行とコメント行が同じ色だったり
 数字の1と大文字のIと小文字のlが同じ形だったり

などすると、(乱視と近視と老眼の三重苦が始まった)あぷらなーとがコーディングすると、ミススペルしまくりますので、ゴソゴソと設定を変えます。
ちなみに背景は絶対に『黒』派です。(ソラリス使っていた若い頃は白背景派だったんですがね)
そうそう、フォントも大きめで(笑)。
f0346040_02441318.jpg
うん。こんな感じかなぁ?だいぶ見やすくなりました。


★データを少しづつ読み込んで調査した結果

慎重にASI1600MC-COOLのRAWデータを読み込んでみた結果、次のことが分かりました。

f0346040_02550668.jpg
○判明した事・その①

ASI1600MC-COOLのRAWファイル(FITS)は、どうやら
大きく分けて3つのブロックに分かれているみたいです。

 Aブロック:撮影データなどのヘッダ
 Bブロック:ブランク領域
 Cブロック:撮像データ(各画素の輝度データ)

○判明した事・その②
 Aブロックについて

撮影データのヘッダは、ASCIIコードによる1バイト×80=80バイトで1項目を表しているみたい。
f0346040_03002587.jpg
基本的なレコード構造
【パラメータ名】 【=】 【値】 【/】 【コメント】

第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
 ここでヘッダ要素が終了することを表すようです。

○判明した事・その③
 Bブロックについて

これ、FITSの仕様なのか、カメラ側の仕様なのか分かりませんが、ちょうどAブロックと同じ広さの領域が「スペース」(ASCIIコードの0x20)で埋め尽くされています。そもそも80バイトのパラメータ×36で1レコードという規格なのかもしれませんね。

○判明した事・その④
 Cブロックについて

いよいよここからが、『本丸』(撮像データが記録されているエリア)のようですねぇ。
さて、ボチボチ読んでみましょうか・・・。
ASI1600MC-COOLは、AD変換した段階で12bitデータになり、それを16bitデータとして書き出していると広告に書かれているので、2バイトで1ピクセルの輝度を表しているのだろうと勝手に予測。

2バイト分を呼び出して、最初の1バイト分を上位バイト、その次の1バイト分を下位バイトと見なして10進整数値に変換を試みます。

ゴリゴリとコードを書いて
・・・・えいっ!っと。
f0346040_04112544.jpg
第1ピクセルの輝度データは、16進で「A632」。10進に直して「42546」と呼び出せました。
もしも16ビットをフルに埋めると、輝度データの上限は16進で「FFFF」で10進なら「65535
」。一応その中には収まっているので、あり得ない値ではないし、まあ良しとします。(ホントか?)

★さて・・・・と

「敵」の正体は、ほぼ掴めてきました・・・が。これ、客観的に言って、「1600万人の敵兵のうち、1人だけ捉えた」って状態ですよねぇ。
むむむむむ。ここから、一体どう「攻め」ようか・・・・・?????最大の障壁は、昔と違って、・・・ろ、ロジックが沸いてこないっ!
うぇーん(涙)。
よし、今日のところは・・・・寝ます。


by supernova1987a | 2016-09-19 04:46 | 天体写真 | Comments(2)

晴れない夜は基本の復習⑥

★Delphiのリハビリ開始っ!
ついにDelphiの封印を解いてしまい、『なんか開発するぞ』と大見得を切ったは良いけれど、なんだか最近の皆様のコメントを拝見していると、出てくる用語の系統から「ただ者じゃ無い感」が伝わってきて、ビビってるあぷらなーとです。

おそらく、「えっ?『Hello World』のコンパイルが通らない状態から、なにか開発する気?・・・正気か?」と心配(?)されていると思いますので、週1ペースではリハビリ状況を掲載することにしますねぇ。ちなみに現在の環境でプログラミングに充てられる時間は、毎週月曜日(本業の定休日♪)の数時間足らずです。

★リハビリ1日目
<目標>
 ①とにかく発掘したDelphiの開発環境を稼働させる。
 ②入門書1冊の重要なところだけ読破。
 ③最終目的地に向けて「第一歩」を踏み出す。

<結果>
 なんとか目標クリアです。

・・・というわけで

★最初の一歩♪
とにもかくにも、まずASI1600MC-COOLで撮像したRAWデータを読めないことには進みませんので、ここに突破口を開けることにしました。

出でよDelphi!!
うりゃー!
f0346040_03073931.jpg
色んな本や過去のソース(分野は全然画像処理と違いますが)見ながら、度重なるミススペルと文法エラーに耐えながらガシガシコードを書きます。
色々初歩的な感覚が少しばかりよみがえってきました。
いや、ブランクがブランクだけに、最初は変数への代入が「=」なのか「==」なのか「:=」なのかで右往左往する位の酷さでしたが、我ながらよく頑張りました♪

コンパイル!ラン!

・・・うっわ。久しぶりに見たけどDelphiってコンパイル速っ。
まさに目にも止まらぬ速さですねぇ。
f0346040_03142330.jpg
ボタン1を実行すると、すぐにファイルを指定する窓が開いて・・・
ASI1600MC-COOLのRAWファイルをクリックすると・・・・

よっしゃ~!
f0346040_03162591.jpg
FITSファイルのバイナリをゴリゴリ読み込んで16進で表示しながら、ヘッダ部分から撮影データを抜き取って表示することに成功♪
ささやかですが、確実に「一歩だけ」前に進みました。

はぁはぁ、ぜぇぜぇ・・・。今週のリハビリは、ここまでですね。

★★★以下、進展した場合だけ、続く予定★★★


by supernova1987a | 2016-09-13 03:23 | 天体写真 | Comments(8)

晴れない夜は基本の復習⑤

★先日来やっている・・・
EXCEL-VBAを使ったRAW現像『なんちゃってシミュレータ』ですが、
今回はいよいよノイズデータの再現機能を実装してみました。

仮定したノイズは下記の通り

①ダークノイズ
 いわゆるホットピクセルが固定セルに生じると仮定
②ショットノイズ
 光電子の量子論的効果により不可避なランダムノイズを仮定
③リードノイズ
 CMOSの各ラインを読み出した際に正規分布に基づきゲイン変動すると仮定


★たとえばこんな感じになりました

左画像:仮定した元画像(これが本来の天体の像だと仮定)
中画像:上記①②③のノイズを含めて記録されるRAWデータのシミュレート
右画像:標準的なデモザイク処理で現像した場合のシミュレート
f0346040_19534798.jpg
『邪ノイズ』(横しまノイズ)とホットピクセルがきれいに再現できました♪


★となれば、すこし本気出して・・・・

Excel+VBAでは、上記の処理だけで(たった1600画素で)30秒も演算時間がかかるので、その1万倍の画素数を持つASI1600MC-COOLだと83時間(!)もかかる計算になって、お話になりません。・・・というか、4000行のEXCELワークシートとかあり得ない(笑)。そろそろ『封印』を解く時がやってきたようです。


★出でよ!懐かしのDelphi7っ!!

実家の物置を2時間探し回って、ついに発掘しました。
約10年間封印していた「MY開発環境セット」♪
f0346040_20040886.jpg
2002年(かな?)リリースのボーランドDelphi7プロと、参考文献の山です。
いやー。まさかコイツらがゾンビのごとく目を覚ます時が来るとは・・・・・。
・・・あ、くれぐれも私はプログラマーでもSEでもありません。業務の必要に迫られて(泣く泣くボランティアで)数千~数万行程度の小規模アプリのソース数本書いたことがあるだけの素人です。
f0346040_20084216.jpg
ああ、書籍に貼りまくってある付箋が昔の(2週間で15kg痩せた)地獄の日々を思い出させます。
あの思い出したくない日々を繰り返すつもりはありませんが、のんびりと復習を始めるとします。とりあえず付箋貼ってるところだけ読み返して、自分が昔書いたソースを読めばいいか・・・的な・・・・。

さて、まずは入門書から・・・・・・・・・

・・・ん?あれれ??

うぇーん。
な、なにも覚えていない!!

そうか・・・人間、イヤなことは積極的に忘れる動物だと言うしなあ・・・。


★そんな事よりも、そもそも・・・

ああ、もっと大切なことがありました。
Delphi7はWindows98SEとか2000とかが主力だった時代の『遺物』。
そもそも、Windows10で動くのか?!

・・・・で、早速やってみた。
「インストールの上限回数を超えた」ので自動アクティベーションできないとか、インストールも開発環境の立ち上げも全て管理者権限でやらないとエラーが出たりとか、些細なトラブルはありました・・・が!!

ばば-ん!
f0346040_20191925.jpg

おかえり♪Delphi
なんか色んな意味で泣きそう・・・・。
じゃじゃ馬のDelphi7よ。まあ、お手柔らかに頼むわ・・・・。

えっ?今のあぷらなーとのコーディングスキルですか?

ええ・・・と、正直言って良いですか?

何も見ずにコードを書いたら『Hello World』がコンパイル途中で止まった!・・・というレベル。

エラーメッセージの意味が分からなくて(Delphiのエラーメッセージって核心を突いてこないんですよねぇ)よく見ると、行末に「;」忘れてることに気づいた時には、自分のアホさ加減に笑ってしまいました。
もう、PascalとBasicとFORTRANとCとSQLの断片的知識が「ちゃんぽん」になってることを再認識しました・・・です、はい。

★★★以下、不定期掲載★★★
ここからは勉強の日々なので、すぐには記事が続きそうにはありませんなぁ(笑)。
・・・別ジャンルの記事ばかりが長期間続いたら、今回の記事のこと、暖かく忘れてやってください。


by supernova1987a | 2016-09-12 20:45 | 天体写真 | Comments(6)

晴れない夜は基本の復習④

★なんちゃってベイヤー現像シミュレータ
EXCELを使った手抜きプログラミングで根幹部分が完成しましたが、次の目標は、扱える画素数(今は40×40=1600画素)を増やすことと、実際の画像を扱えるようにすることですねぇ。

★元画像として、本物の写真を・・・
とりあえず、本物の写真を元データとして扱いたいですね。
しかし、画像の読み込みスキルはまだありません。BMPファイルなら一応「原理」は分かっているつもりですが、コーディングが面倒くさそう・・・。というわけで、今回は人様の力にすがることにします。
同じようなことを考える人もいるものだと驚いたのですが、なんと「BMPファイルから各色の輝度情報を読み込んでCSVファイルに変換する」という神のようなフリーソフトが公開されていました!!
その名も「BMP2CSV」
http://www.vector.co.jp/soft/win95/art/se108144.html
試してみると、あっけなくRGB各チャンネルの輝度情報をCSVファイルに展開してくれました。
ここまで来ると、前回のコードを少し変更すれば実際の写真を元データとしてExcel上にセル画像として表示できます。

★元画像として「本物のM27」を・・・
早速、実際に自分が撮ったM27の画像を元ネタとして変換してみます。
f0346040_04175108.jpg
おお。たった1600ピクセルですが、それらしく見えますね。手書きとは訳が違う・・・・。

★なんちゃってシミュレータにかけてみます
ベイヤーデータとして各チャンネルに記録されたイメージは・・・
f0346040_04235372.jpg
これを画素補完して・・・・・
f0346040_04244267.jpg
デモザイクすると・・・・
f0346040_04250373.jpg
左から「元画像」、「ベイヤーRAWデータシミュレート」、「デモザイク画像シミュレート」です。
解像度が大幅に落ちて、偽色まみれになっていることが分かりますが、思ったよりもきれいですね。ちゃんとM27ぽく見えます。

★M27の中心部でも試してみます
なかなか面白いので、M27の中心部でも試してみます。
f0346040_04303622.jpg
左から「元画像」、「ベイヤーRAWデータシミュレート」、「デモザイク画像シミュレート」です。
なるほど、なるほど・・・なんか色々と直感的に分かってきました♪

・・・・なんだか『沼』に陥りそうな気配・・・・・(笑)



by supernova1987a | 2016-09-09 06:02 | 天体写真 | Comments(8)

晴れない夜は基本の復習③

★前回では・・・
天体画像に見立ててExcelに手書きした絵をベイヤー画像に変換するところまでできました。
f0346040_00315872.jpg
★ベイヤーデータを各画素に割り振ります
ベイヤー配列に記録された輝度データをRGB各画素の配列に割り振ってみます。
これはもう、コーディングの必要がありませんね。そのまま各画素のセルから参照させるだけです(笑)
(こういう手抜きをするためにExcelを選んだわけでして・・・・。)
f0346040_00443947.jpg
ちなみに、各画素の様子を見るために、次のようなコードで視覚化してみます。
-------------------------------------
'///////////////R画素データのイメージ化処理/////////////
X0 = 4
Y0 = 94
Yshift = 94 - 49 'ベイヤーR画素データセルとのシフト量
For I = 1 To 40
X = X0 + I
For J = 1 To 40
Y = Y0 + J
R = Cells(Y - Yshift, X).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(R, 0, 0)
.Pattern = xlSolid
End With
Next
Next

'///////////////G画素データのイメージ化処理/////////////
X0 = 47
Y0 = 94
Yshift = 94 - 49 'ベイヤーG画素データセルとのシフト量
For I = 1 To 40
X = X0 + I
For J = 1 To 40
Y = Y0 + J
G = Cells(Y - Yshift, X).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(0, G, 0)
.Pattern = xlSolid
End With
Next
Next

'///////////////B画素データのイメージ化処理/////////////
X0 = 90
Y0 = 94
Yshift = 94 - 49 'ベイヤーB画素データセルとのシフト量
For I = 1 To 40
X = X0 + I
For J = 1 To 40
Y = Y0 + J
B = Cells(Y - Yshift, X).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(0, 0, B)
.Pattern = xlSolid
End With
Next
Next
--------------------------------------
ああ、何の工夫も無いベタなコード・・・・。ま、動けば良いんです。リハビリですから。
f0346040_00481969.jpg
はい。各画素を通すとどのような画像が見えているのかが演算できました。

★デモザイクの準備
RAWデータを現像するときには上記のようなデータを元にカラー画像に変換しているわけですが、このままではマズいですね。RGBどの画素も「スカスカ」なので、その隙間を補完してやる必要があります。補完処理はコードを書かずにEXCELそのままで行くと楽ちんです。
f0346040_00593418.jpg
RGB全ての画素に共通した処理として、周りを4つの有効画素に囲まれている位置(★マーク)には、周りの4つの平均値を代入してみました。(たぶんコレは正解)
Gデータはこれで全ての隙間が埋まることになります。ただしRとBは画素数がGの半分しか無いので、周りに2つの有効セルしか無い部分(○と△)には上下もしくは左右に隣接する2つのセルの平均値を代入してみました(これが実際の処理かどうかは自信がありません)。

さらに補完したデータを視覚化するコード(参照先が変わるだけで補完前の表示コードと同じ物)を通せば・・・
f0346040_01050975.jpg
各色とも滑らかな画像に変わりました。
ちなみに40×40のマトリクスのうち外周部分がグレーになっているのは、隣接するセルが足りず補完が不可能なエリアだからです。
そういえば、ASI1600MC-COOLと同じ撮像チップを搭載しているオリンパスの某デジタル一眼レフでは、総画素数1685万画素で有効画素数1628万画素と公称されていますが、この減少分が外周部分だと言うわけでしょうね。

★いよいよRGBデータを合成します
ここまでできると、あとは簡単ですね。補完演算した各セルの値をRGBの輝度と見なして表示させるコードを書きます。
---------------------------------
'///////////////デモザイク処理イメージ表示処理/////////////
X0 = 90
Y0 = 229
RYshift = 229 - 139 'ベイヤーR画素補完演算セルとの行シフト量
RXshift = 90 - 4 'ベイヤーR画素補完演算セルとの列シフト量
GYshift = 229 - 139 'ベイヤーG画素補完演算セルとの行シフト量
GXshift = 90 - 47 'ベイヤーG画素補完演算セルとの列シフト量
BYshift = 229 - 139 'ベイヤーB画素補完演算セルとの行シフト量
BXshift = 90 - 90 'ベイヤーB画素補完演算セルとの列シフト量
For I = 2 To 39 '左端と右端は処理から外す
X = X0 + I
For J = 2 To 39 '上端と下端は処理から外す
Y = Y0 + J
R = Cells(Y - RYshift, X - RXshift).Value
G = Cells(Y - GYshift, X - GXshift).Value
B = Cells(Y - BYshift, X - BXshift).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(R, G, B)
.Pattern = xlSolid
End With
Next
Next
------------------------------
・・・と、こんな感じでしょうか。
f0346040_01163334.jpg
ベイヤーデータのデモザイク処理が完成しました♪

★結論
いや、実際どうでも良いことなんですが、結局
f0346040_00094342.jpg
こんな元画像をASI1600MC-COOLのようなGRBG型ベイヤー素子で撮影すると、上記のようなRGB画像が得られることがシミュレートできました。
・・・やっぱり2×2ピクセルくらいの星像を入射させても、デモザイクの原理から言ってローパスフィルターなしでは偽色が発生するのは仕方ありませんね。
また、相当に解像度が低下していますが、これもベイヤー素子の宿命でしょう。

★というわけで
「なんちゃってベイヤー現像シミュレータ」
EXCELだけで完成しました。根幹ができるとあとは楽なので、ここにノイズ付加機能やらビニング機能やらを書き加えていけば色々とロジックの検証ができます。

・・・・・ああ、こんな簡単な処理に大汗かいてしまった。
・・・正直、13年前に戻りたいです(涙)。


by supernova1987a | 2016-09-08 00:37 | 天体写真 | Comments(2)

晴れない夜は基本の復習②

★今後の諸々に備えて・・・
最初にお断りしておきます。
特に『ASI1600MC-COOL使い』の皆様は、「なにか秘策が公開されるのか!?」などと期待しないでくださいねぇ。
ノイズの出方とか、画像処理の諸々を考えるときに「簡単なシミュレーションができると良いなあ」と思った程度なので、気の長いお話です。
VBAのコードとか出てきますが、あぷらなーと自身へのメモなので、参考(する人いないか・・・)にはしないでください。

★リハビリ開始♪
UNIX使って宇宙物理の研究をしていた学生時代や、本業の傍ら自前のソフトをゴソゴソ作っていた若手の頃は、プログラミングが嫌いではありませんでした。しかし、その分野から完全に足を洗って早13年。今ではすっかり素人のおっさんに戻ってしまいました。
とりあえず、ベイヤー配列のデータがどのように記録されていて、どのようにデモザイクされているのかをシミュレーションすることから始めてみます。
・・・言語ですか?得意なのはFORTRANとPASCALです(でした)が、そういう時代では無いでしょうから、最近のPCの有り余る演算速度を当てにして『まさか』の「EXCEL一本槍」で行ってみます。

★まずやりたいのは、こんなこと
エクセルのワークシートにですね。簡単な画像を描いて、マクロボタンをポチッと押すと、
 ①ベイヤー配列にどのように格納されたかが表示されて
 ②RGB各画素データがどのように記録されたかが表示されて
 ③RGB各画素の欠損位置のデータを補完して
 ④デモザイク画像に変換してワークシートに表示
・・・という簡単な処理です。うーんリハビリに最適。

★元画像として・・・
はい、まだビットマップを読み込むとかそんな『高度な』ことはしません(できません)ので、エクセルのシートをキャンバスに見立てて手で描きます(笑)
f0346040_00094342.jpg
わはは。モロ手抜きの酷い素材ですね。想定したのはM20(らしきもの)ですが、それっぽく見えますか??

★ASI1600MCのベイヤー配列は
確か「GRBG型」でした。よって、撮像CMOSの表面のカラーフィルタがこんな感じに並んでいると想定できますね。
f0346040_00152661.jpg
★RAWベイヤーデータ記録のシミュレート
上記の『M20もどき』画像を40×40ピクセルのGRBGベイヤー素子に入力して8bit記録するとどうなるか、EXCELのVBAで計算してみます。
ちなみにEXCELのVBAマクロは非常に強力なので、ワークシートにマクロボタンを貼り付けて、たとえば下記のようなコードを打ち込むだけで・・・

-------------------------------------------------------------
'//////////////オリジナルカラー配列の定義とロード///////////////
Dim Rmtx(40, 40) As Integer
Dim Gmtx(40, 40) As Integer
Dim Bmtx(40, 40) As Integer
X0 = 4
Y0 = 4
For K = 1 To 40
X = X0 + K
For L = 1 To 40
Y = Y0 + L
c = Right("000000" & Hex(Cells(Y, X).Interior.Color), 6)
R = Val("&H" & Right(c, 2))
G = Val("&H" & Mid(c, 3, 2))
B = Val("&H" & Left(c, 2))
Rmtx(K, L) = R
Gmtx(K, L) = G
Bmtx(K, L) = B
Next
Next

'//////////////ベイヤー配列セルへ数値転送///////////////
X0 = 47
Y0 = 4
For K = 1 To 40 '---列サーチ
X = X0 + K
Gflgx = K Mod 2 '---列の偶奇判定
For L = 1 To 40 '---行サーチ
Y = Y0 + L
Gflgy = L Mod 2 '---行の偶奇判定
If (Gflgx = 1) Then
If (Gflgy = 1) Then
Cells(Y, X).Value = Gmtx(K, L)
Else
Cells(Y, X).Value = Bmtx(K, L)
End If
Else
If (Gflgy = 1) Then
Cells(Y, X).Value = Rmtx(K, L)
Else
Cells(Y, X).Value = Gmtx(K, L)
End If
End If
Next
Next
-------------------------------------------------------------------

簡単に、画像からRGB各色の輝度を数値変換して、ベイヤー配列に見立てたセルに数値を記録してくれます。
ちょうどこんな感じですね♪

f0346040_00243997.jpg
次に、その数値を8bitの輝度データだと見なして下記のようなコードでモノクロデータにすると、ベイヤーRAWデータの完成です。

--------------------------------------------
'///////////////ベイヤーRAWデータ再現処理/////////////
X0 = 90
Y0 = 4
Xshift = 90 - 47 'ベイヤー配列パターンセルとのシフト量
For I = 1 To 40
X = X0 + I
For J = 1 To 40
Y = Y0 + J
W = Cells(Y, X - Xshift).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(W, W, W)
.Pattern = xlSolid
End With
Next
Next
------------------------------------------------------
f0346040_00315872.jpg
はい。あっという間にカラー画像を8bitベイヤー画像に変換できました。
うーん。EXCELって凄いなあ・・・・。
こんな用途に使う奇特な人は居ないと思いますが・・・・ね。

★★★以下続きます★★★

by supernova1987a | 2016-09-07 00:07 | 天体写真 | Comments(8)

晴れない夜は基本の復習①

★台風一過の秋空・・とはならず
今回の休日は曇りでした。新たなテスト撮影ができないので、基本に立ち返って色々勉強し直すことにします。
さて、ASI1600MC-COOLのノイズ特性は極めて優秀です。
・・・が、前愛機ASI174MC-COOLとどの程度違うのでしょうか。
実際の天体撮影画像で比較してみます。

条件(撮影日)が異なるので直接比較はできませんが、基本的データは次の通り

撮影月:ASI174MC-COOL:2016年5月 ASI1600MC-COOL:2016年8月
望遠鏡:VMC260L+レデューサVMC+LPS-P2 (両者共通)
冷却温度:ASI174MC-COOL:-15℃ ASI1600MC-COOL:-10℃
ゲイン:ASI174MC-COOL:300 ASI1600MC-COOL:400
露出:15秒 (両者共通)
撮影対象:亜鈴状星雲M27(両者共通)
画像処理:レベル調整のみ(ダーク減算も無し)


★ASI174MC-COOLの撮って出し(ノートリ)
f0346040_23252376.jpg
いや、これでも驚異的な写りだと思うんですよ。市街地ニワトリのたった15秒で・・・。
冷却の威力でホットピクセルはほとんど消滅しているのも特筆すべき点です。
ただ残念なことに、画面全体に見られる強烈な『横しまノイズ』と画面右下の盛大なアンプノイズが痛いですね。
また、メーカーサイトの分光特性資料から予測していたことですが、緑に対して赤の感度が低いのが分かります。

★ASI1600MC-COOLの撮って出し(ノートリ)
f0346040_23344439.jpg
対して、ASI1600MC-COOLだと撮って出しでコレです!
ホットピクセル無し・シマシマノイズ無し・アンプノイズ無しの三拍子が揃っています。画素数とかフォーマットが云々以前に基本的な性能が雲泥の差。
しかも、明らかにHα線に対する感度がASI174MC-COOLよりも(緑に対して相対的に)高く感じます。

★ASI174MC-COOLの撮って出し(トリミング)
f0346040_23391719.jpg
中央部をピクセル等倍で切り出した物です。中心星の青い色や星雲内の色の変化など良く写っていますが、ノイズが・・・。


★ASI1600MC-COOLの撮って出し(トリミング+縮小)
f0346040_23393786.jpg
ピクセルサイズが174と異なりますので画像を縮小して切り出した物です。
色特性としては、ちょうどIR改造のD5000と似たような感じでしょうか。とにかく赤い星雲が良く出ます。
変なノイズが一切無いところも素敵です。

★それでも・・・・・
このようにASI1600MC-COOLは驚異的に低ノイズなのですが、それでも淡い天体を炙り出そうとすると、嫌なシマシマノイズが出ます。
・・・というか、出ないカメラってあるのか?というのが正直なところなのですが、とにかく何か工夫がしたいところですね。
試行錯誤するための準備として、今一度ベイヤーデータについて考えてみることにします。
・・・ううむ。色んな原理の理解のため、13年ぶりにEXCELのVBAコード触ってみることにします。
ああ、丸10年以上コーディング(プログラミング)から遠ざかっていたので、もう何も覚えていないでしょうね・・・・。少しは復習しておくんだった。




by supernova1987a | 2016-09-06 01:48 | 天体写真 | Comments(2)


タグ
最新の記事
記事ランキング
ファン
ブログジャンル
画像一覧
外部リンク