このブログ記事「ゼロから作るRAW現像」を大きく再構成してより読みやすくした書籍「PythonとColabでできる-ゼロから作るRAW現像」を【技術書典6】にて頒布しました。
現在はBOOTHにて入手可能です。書籍+PDF版は2200円プラス送料、PDF版は1200円です。
はじめに
これは「ゼロから作るRAW現像 その1 - 基本的な処理」の続きです。 その1の内容を前提としていますので、まだお読みでない方はそちらからお読みいただくことをおすすめします。
RAW画像を処理するPythonスクリプト
これから処理を追加していくのが簡単になるように、その1で作ったRAW画像を処理するPythonスクリプトを単一のファイルにしてみましょう。
と言っても、一つ一つの処理をメソッドとして定義しなおして、mainメソッドからまとめて読み出しているだけですので、一つ一つの処理をここで追うのは止めにして、最終的な結果をgithubにアップロードしておきました。
使い方は
python3 raw_process.py 入力ファイル名 [出力ファイル名] [カラーマトリクス]
です。
出力ファイル名を省略するとoutput.pngというファイルに書き出されます。 カラーマトリクスは"1024, 0, 0, 0, 1024, 0, 0, 0, 1024"のような形式で書きます。省略した場合デフォルトの単位行列が使われます。
例えば前回と同じような現像処理を行うにはこんなふうに入力します
python3 sample.ARW output.png "1141, -205, 88, -52, 1229, -154, 70, -225, 1179"
実行結果はこちらです
当然ながら前回とほぼ同じ結果が得られました。
スクリプトファイルの内部
このスクリプトの中では次のようなメソッドが定義されています。
メソッド名 | 説明 |
---|---|
read(fileanme) |
filenameで指定されたRAWファイルからRAWデータを読み込みrawpy.raw_image形式で返す |
get_raw_array(raw) |
raw_image形式のrawからデータ部分をnumpyのarray形式で取り出す |
black_level_correction(raw, raw_array) |
raw_arrayに対しブラックレベル補正を行う |
preview_demosaic(raw, raw_array) |
raw_arrayに対し簡易的でモザイク処理を行う。実行後の解像度は1/4になる。出力はRGBフルカラー |
white_balance(raw, rgb_array) |
rgb_arrayに対してホワイトバランス補正を行う |
color_correction_matrix(rgb_array, color_matrix) |
rgb_arrayに対してcolor_matrixの値を使ってカラーマトリクス補正を行う |
gamma_correction(rgb_array) |
rgb_arrayに対してガンマ補正を行う |
write(rgb_array, output_filename) |
rgb_arrayの内容をpng形式の画像ファイルとして書き出す |
各メソッドの中では前回行った処理がそれぞれ行われています。 実際に処理を呼び出すmainメソッドの中ではこれらの処理を順番に呼び出しています。
以下はmainメソッドからの抜粋です。
raw = read(filename) raw_array = get_raw_array(raw) blc_raw = black_level_correction(raw, raw_array) dms_img = preview_demosaic(raw, blc_raw) img_wb = white_balance(raw, dms_img) color_matrix = [1024, 0, 0, 0, 1024, 0, 0, 0, 1024] img_ccm = color_correction_matrix(img_wb, color_matrix) rgb_image = gamma_correction(img_ccm) write(rgb_image, output_filename)
Jupyterノートブックでの利用
上記のスクリプトファイルをモジュールとして利用することで、jupyterでの処理も簡単になります。
なお、以下の内容はGithubからダウンロードできます。 またGoogle Colabのノートブックで見ることもできます。
まず、jupyter上でmoduleを呼び出すために以下の処理を行います1。
import os import sys module_path = os.path.abspath(os.path.join('..')) if module_path not in sys.path: sys.path.append(module_path)
これでローカルのモジュールを読み込むことができます。
import raw_process
あとは、それぞれの処理を順番に呼び出すだけです。
raw = raw_process.read("sample.ARW") color_matrix = [1024, 0, 0, 0, 1024, 0, 0, 0, 1024] raw_array = raw_process.get_raw_array(raw) blc_raw = raw_process.black_level_correction(raw, raw_array) dms_img = raw_process.preview_demosaic(raw, blc_raw) img_wb = raw_process.white_balance(raw, dms_img) img_ccm = raw_process.color_correction_matrix(img_wb, color_matrix) rgb_image = raw_process.gamma_correction(img_ccm) raw_process.write(rgb_image, "output2.png")
ずいぶんすっきりしました。
画像がちゃんと出力できたか、確認しておきましょう。
import imageio from pylab import imshow, show imshow(imageio.imread('output2.png')) show()
まとめ
今後の処理の追加が用意になるように、その1で行ったRAW画像処理の内容を実行可能な単一ファイルにまとめ、モジュール化しました。 これでJupyterから処理を呼び出すのも簡単になります。 次はこのモジュールを使って、他の処理を実装する予定です
なお、今回の結果はGithubまたはGoogle Colabで閲覧・ダウンロード可能です。