Moiz's journal

プログラミングやFPGAなどの技術系の趣味に関するブログです

ゼロから作るRAW現像 その2 - 処理のモジュール化

はじめに

これは「ゼロから作るRAW現像 その1 - 基本的な処理」の続きです。 その1の内容を前提としていますので、まだお読みでない方はそちらからお読みいただくことをおすすめします。

RAW画像を処理するPythonスクリプト

これから処理を追加していくのが簡単になるように、その1で作ったRAW画像を処理するPythonスクリプトを単一のファイルにしてみましょう。

と言っても、一つ一つの処理をメソッドとして定義しなおして、mainメソッドからまとめて読み出しているだけですので、一つ一つの処理をここで追うのは止めにして、最終的な結果をgithubにアップロードしておきました。

github.com

使い方は

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"

実行結果はこちらです

f:id:uzusayuu:20180930053908p:plain

当然ながら前回とほぼ同じ結果が得られました。

スクリプトファイルの内部

このスクリプトの中では次のようなメソッドが定義されています。

メソッド名 説明
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での処理も簡単になります。

まず、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()

f:id:uzusayuu:20180930062245p:plain

この内容はこちらにアップロードしてあります。

まとめ

今後の処理の追加が用意になるように、その1で行ったRAW画像処理の内容を実行可能な単一ファイルにまとめ、モジュール化しました。 これでJupyterから処理を呼び出すのも簡単になります。 次はこのモジュールを使って、他の処理を実装する予定です

なお、今回の結果はgithub上にアップロードしてあります。

github.com

次の記事

uzusayuu.hatenadiary.jp