NEF(Nikon RAW) からセンサー RAW 値を取り出す


漢なら Nikon NEF ファイルから Sensor RAW 値を取り出したいですよね!

やりましょう!

手っ取り早く取得したいなら dcraw を使いましょう.
https://www.cybercom.net/~dcoffin/dcraw/

情報源

EXIF

TIFF IFD と同じなので, TIFF IFD と同じようにパースします.

Maker note

Maker note はメーカー定義の情報が入っています. NEF の場合はこれも TIFF IFD フォーマットになっているので, TIFF のパーサーを使いまわすことができます.

センサー値の復元

ダイナミックレンジを稼ぐためなのか, Nikon の場合 RAW 値(A/D 値)はリニアになっていないのでつらい.
リニアに復元するための curve が NEF の maker note に含まれていますのでこれを使う必要があります.

Nikon の RAW には white balance preconditioning も入っていますが, これも関係していそうですね.

Nikon RAW の white balance pre-conditioning について
https://syoyo.wordpress.com/2017/02/02/nikon-raw-%E3%81%AE-white-balance-pre-conditioning-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

圧縮について

NEF では, 12bit, 14bit, lossy 圧縮, 非圧縮があります.
D810 などのハイエンド系では uncompressed をサポートしていますが, D5100 など入門機用は uncompressed には対応していません.

white-balance 暗号化

昔の NEF では, white balance 値には暗号化がかかっていました.

Nikon's photo encryption reported broken
https://www.cnet.com/news/nikons-photo-encryption-reported-broken/

dcraw にそのデコードのコードがあります.

近年のカメラ(D5100, D810 で確認. Nikon maker format 2 以降)では, maker note tag の 0xc に white balance が R, B で書き込まれています(B = 1.0 を基準として R, B が正規化されている)ので, 暗号化された whilte balance をデコードする必要はなくなりました.

手順まとめ

  1. TIFF IFD をパース
  2. EXIF をパース
  3. Maker note をパースし, 圧縮タイプと linearization table を取得
  4. 圧縮タイプに応じてハフマン符号化された RAW データをデコードし, linearization table でリニア化
  5. predictor 復元 + lossless デコード的なのをちょっぴり

ややこしいですね!

コード

tinydngloader nef branch にあります.

dcraw, 1 億年かけて熟成した秘伝のソースみたいな感じでつらいのでいろいろ書きなおしていますが, ハフマン符号化のテーブル値が dcraw 以外に見当たらないので, dcraw から取得しています
そのため dcraw 部分はとりあえず GPL ライセンスにしています. RESTRICTED でない部分の code fragment だけなら違うライセンスでいけるかも? dcraw 作者にコンタクトを検討.

TODO

  • ハフマン符号化テーブルの情報源を突き止める.
  • ディープラーニングで RAW 画像パーサーをつくってほしい.
  • 優秀な RAW 画像処理若人が人類史上最速で育成され, 優秀な RAW 画像若人が日々切磋琢磨し RAW 画像処理を極めるスキームを確立したい.