ymmooot

Python 初心者が「ゼロから作るRAW現像」を読んで Pixel3 の RAW 画像を現像するまで

この記事は GW Advent Calendar なんか書く太郎 の1日目の記事です。(めっちゃ遅れた)

moiz さんの PythonとColabでできる-ゼロから作るRAW現像 を読んで現像の基本的な仕組みを理解したのち、実際に自分で撮った RAW 画像を現像してみたい。

私のPythonレベル

Python は2系のときにちょっとだけクローラーをいじったことがある程度でほぼ何も知らない。Homebrew で揉めてたことくらいは知ってる。

Python を学ぶ

numpy 以前に、Python のスライス調べた。

a = np.asarray([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])

print(a)
/*
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
*/

print(a[::2, ::2])
/*
[[ 0  2]
 [ 8 10]]
*/

Step 便利。
あとは割と直感的で言語仕様を調べることはなかった。

現像処理を学ぶ

  • black_level_correction
  • lens_shading_correction
  • defect_correction
  • white_balance
  • demosaic
  • noise_filter
  • color_correction_matrix
  • gamma_correction
  • edge_enhancement
  • tone_curve_correction

この辺を読みながら写経して理解した。
仕組みを理解しやすいよう、ループを使ったコード例の後に、numpy による高速化コードが載っていて、とても理解しやすかった。

Pixel3 で撮影した画像の現像

「ゼロから作るRAW現像」では「RaspberryPi、ソニー α7 Ⅲ」でやっていたが、手持ちの Pixel3 が RAW 撮りができたので、Pixel3 で撮った RAW 画像を現像してみる。

以下が RAW 画像。(以前勤めていた会社で先輩に頂いたフクロウのキーホルダー)

RAW画像
RAW画像

exiftool で現像に必要な情報を得る。

$ exiftool pixel3.dng

使いそうなのは以下。 Color Matrix はなんか分からんけど2つあった。

Bits Per Sample : 16
Black Level     : 1023 1024 1022 1022
White Level     : 16368
Color Matrix 1  : 1.0598 -0.5058 -0.1606 -0.9956 1.9269 0.0401 0.0642 -0.2328 1.2123
Color Matrix 2  : 1.6298 -0.7708 -0.2489 -0.9956 1.9269 0.0401 0.0482 -0.1686 0.8591

とりあえず、 現像してみると緑がかった画像ができた。

色々見てみたら、 ホワイトバランスの調整に使ってる値 raw.camera_whitebalance[1.6331729888916016, 1.0, 2.178725242614746, 0.0] となっていた。最後の緑成分の値が 0.0 なので 1.0 と修正するとうまくいった。

Color Matrix は2つとも試してみたが、キレイな色が出なかったため、raw.color_matrix として取り出した値を使うとうまく行った。

現像後
現像後

おわりです。